none
Consultas Multiusuario RRS feed

  • Pregunta

  • Saludos mi gente es un placer, intentare explicarme de la mejor manera y asi poder obtener ayuda

    tengo un programa cuyo proposito es buscar codigos en una BDD y mostrarlos en un datagridview por medio de procedimientos almacenados funciona excelente sin embargo me solicitaron algo que para mi es confuso.

    ok,el resultado de un codigo o vario codigos se almacena en un tabla que se llama tbl_comparar, luego se muestra en el datagridview

    primeramente este prg. tiene que ser multisuario varios usuarios a la misma vez hacen o van hacer busquedas de diferentes codigos,

    me dicen como es un prg multiusuario el incoveniente es que al hacer una busqueda un usuario, el usuario anterior que realizo una busqueda sus resultados seran eliminados, y no podra visualizar sus datos y se repetira el ciclo, me recomendaron que guardara el resultado del datagridview como dataset y eliminar los registros de la tabla, ya estoy usando datatable sinceramente no se como hacerlo estoy confundido

    les comparto el codigo si necesitan el procedimiento almacenado con gusto lo comparto

    Imports System.Data
    Imports System.Data.SqlClient


    Public Class FrmBuscar

        Private Sub btnBuscar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnBuscar.Click
            Try

               


                Dim conexion = New SqlConnection("Data Source = xxx; Initial Catalog = xx; Integrated Security = false; User Id= xx; Password = xx;")

                txtCodigo.Focus()
                'llamada a procediento almacenado
                Dim proce As New SqlCommand("sp_Comparar2", conexion)
                proce.CommandType = CommandType.StoredProcedure


                Dim dt = New DataTable     'crea la tabla

                'declaracion del array y la variable que almacena el valor del textbox
                Dim textbox As String
                Dim codigo() As String

                'inicializacion del array y la variable
                textbox = Convert.ToString(txtCodigo.Text)
                codigo = Split(textbox, vbCrLf)

                'uso de for para recorrer el array con los codigos en el textbox
                For i = 0 To UBound(codigo)


                    'se establece la condicion si desea ver o no el campo UPC y a la misma vez mostrar el resultado
                    If chUPC.Checked = True Then
                    
                       

                        proce.CommandTimeout = 240
                        proce.Parameters.AddWithValue("@CODPRO", codigo(i))
                        Dim adaptador As New SqlDataAdapter(proce)
                        adaptador.Fill(dt) 'se llena la tabla con la informacion proveniente del adaptador


                    Else

                        Dim proce2 As New SqlCommand("sp_Comparar3", conexion)
                        proce2.CommandType = CommandType.StoredProcedure
                        proce2.CommandTimeout = 240
                        proce2.Parameters.AddWithValue("@CODPRO", codigo(i))
                        Dim adaptador2 As New SqlDataAdapter(proce2)
                        adaptador2.Fill(dt) 'se llena la tabla con la informacion proveniente del adaptador

                    End If
                Next

                Me.dgDatos.DataSource = dt
            Catch ex As Exception
                MessageBox.Show("Error al llenar datagridview" + ex.Message)
            End Try
        End Sub

    lunes, 22 de marzo de 2021 20:57

Respuestas

  • No, eso no ocurre. El servidor de base de datos mantiene una conexión independiente por cada usuario, que tiene lo que se llama un SPID (Service Process Identifier) que es un numerito que identifica internamente cada conexión. Con las herramientas del servidor puedes incluso consultar en un momento dado cuáles son las conexiones abiertas y sus SPIDs y qué usuario abrió cada una.

    Cuando un usuario envía una consulta, le llega al servidor a través de esa conexión y el servidor internamente la resuelve y devuelve los resultados que le corresponden a través de la misma conexión. Si mientras tanto otro usuario transmite otra consulta, queda asociada a la otra conexión, y cuando se resuelve se transmiten los resultados por la otra conexión, sin que nunca se mezcle con la primera. El servidor las distingue gracias al SPID.

    Además, típicamente el servidor es capaz de resolverlas en paralelo, si se ejecuta en una máquina que tiene más de una CPU. Mientras una CPU está devolviendo los resultados a un usuario, la otra puede devolverlos al otro. Y es más, si las dos consultas usan la misma tabla, cuando comienza a ejecutarse la primera consulta y va leyendo datos de la tabla, estos datos se van quedando guardados en un caché en memoria, de forma que si en ese momento llega la otra consulta, y necesita esos mismos datos, puede tomarlos del caché sin necesidad de acudir al disco. Si necesita un dato que no está en memoria y tiene que acudir al disco a buscarlo, y el disco en ese momento está "ocupado" devolviendo los datos del primer usuario, entonces la segunda consulta se queda "parada" durante un instante esperando a que termine la anterior, y cuando termina sigue adelante y devuelve los datos que pidió el segundo usuario. En ningún momento se llegan a mezclar los datos de uno y otro.

    • Marcado como respuesta St3ven martes, 23 de marzo de 2021 13:50
    martes, 23 de marzo de 2021 6:45

Todas las respuestas

  • me dicen como es un prg multiusuario el incoveniente es que al hacer una busqueda un usuario, el usuario anterior que realizo una busqueda sus resultados seran eliminados

    Errrr... Esto no tiene mucho sentido. Normalmente, cuando hablamos de un programa "multiusuario" lo que se entiende es que hay varios usuarios y cada uno de ellos tiene un ordenador distinto, y en cada ordenador se ejecuta una copia del programa, y todas esas copias del programa acceden a la misma base de datos.

    En este caso, no se borraría nada de un usuario cuando otro haga una búsqueda. Tal como tienes escrito el programa, los datos se traen desde la base de datos a una tabla en memoria. Si cada usuario está ejecutando una copia del programa, cada una de esas copias tiene su propia tabla en su memoria. Los datos que se traigan a una de ellas no afectan en modo alguno a las demás copias.

    El único caso que se me ocurre en el que se borren los datos del usuario anterior cuando otro usuario haga una búsqueda es que tengas un único ordenador con un único programa, un usuario haga una búsqueda, a continuación se levante de la silla y otro usuario se siente en su lugar, y este usuario haga otra búsqueda usando el mismo programa que ya estaba abierto en la pantalla. En este caso, como es lógico, sí que se borrarían los datos de la consulta anterior. La forma más sencilla de solucionar esto es que cada uno de los dos usuarios abra una nueva ventana con otra instancia del programa, y de esa manera cada uno puede tener abierta su propia búsqueda sin que interfiera con la del otro usuario.

    lunes, 22 de marzo de 2021 22:02
  • Hola,

    Gracias por levantar tu consulta en los foros de MSDN.

    Eric Ruiz

    ____________________________

    Por favor recuerde "Marcar como respuesta" las respuestas que hayan resuelto su problema, es una forma común de reconocer a aquellos que han ayudado, y hace que sea más fácil para los otros visitantes encontrar la solución más tarde.

    Si tiene algún cumplido o reclamo sobre el soporte de MSDN siéntase en la libertad de contactar MSDNFSF@microsoft.com.

    lunes, 22 de marzo de 2021 23:04
    Moderador
  • muchas gracias alberto

    primeramente no tengo mucha materia en la programacion hay muchas dudas gracias al poco conocimient, pero eso no me va detener le damos con lo que sabemos y vamos aprendiendo

    ahora, es posible que pase esto (pido una disculpa si es alocado lo que leeran):

    por ejemplo yo estoy usando el prg y hago una busqueda y en ese tiempo de espera ingresa otro usuario en otra pc y hace una busqueda y como yo estoy esperando el resultado, obtenga el resultado de la busqueda del otro usuario

    sinceramente hasta para mi suena ilogico pero pregunto

    martes, 23 de marzo de 2021 1:23
  • No, eso no ocurre. El servidor de base de datos mantiene una conexión independiente por cada usuario, que tiene lo que se llama un SPID (Service Process Identifier) que es un numerito que identifica internamente cada conexión. Con las herramientas del servidor puedes incluso consultar en un momento dado cuáles son las conexiones abiertas y sus SPIDs y qué usuario abrió cada una.

    Cuando un usuario envía una consulta, le llega al servidor a través de esa conexión y el servidor internamente la resuelve y devuelve los resultados que le corresponden a través de la misma conexión. Si mientras tanto otro usuario transmite otra consulta, queda asociada a la otra conexión, y cuando se resuelve se transmiten los resultados por la otra conexión, sin que nunca se mezcle con la primera. El servidor las distingue gracias al SPID.

    Además, típicamente el servidor es capaz de resolverlas en paralelo, si se ejecuta en una máquina que tiene más de una CPU. Mientras una CPU está devolviendo los resultados a un usuario, la otra puede devolverlos al otro. Y es más, si las dos consultas usan la misma tabla, cuando comienza a ejecutarse la primera consulta y va leyendo datos de la tabla, estos datos se van quedando guardados en un caché en memoria, de forma que si en ese momento llega la otra consulta, y necesita esos mismos datos, puede tomarlos del caché sin necesidad de acudir al disco. Si necesita un dato que no está en memoria y tiene que acudir al disco a buscarlo, y el disco en ese momento está "ocupado" devolviendo los datos del primer usuario, entonces la segunda consulta se queda "parada" durante un instante esperando a que termine la anterior, y cuando termina sigue adelante y devuelve los datos que pidió el segundo usuario. En ningún momento se llegan a mezclar los datos de uno y otro.

    • Marcado como respuesta St3ven martes, 23 de marzo de 2021 13:50
    martes, 23 de marzo de 2021 6:45