Objeto SqlCommand

DOCENTE:
Ing. Marco Aurelio Porro Chulli
AREA:
Laboratorio de Programación
CARRERA:
Ingeniería de Sistemas y Telemática.
CICLO:
IV-A.
TEMA:
Objeto SqlCommand

INTEGRANTES:
Ø Torres Izquierdo Keyli.

Ø Tineo Tenorio Elena.


OBJETO SQLCOMMAND
1.    CONTENIDO
v  DEFINICIÓN: Representa un procedimiento almacenado o una instrucción de Transact-SQL que se ejecuta en una base de datos de SQL Server. Esta clase no puede heredarse.
Ejecuta la consulta y devuelve la primera columna de la primera fila del conjunto de resultados devuelto por la consulta. Las demás columnas o filas no se tienen en cuenta. Los objetos Command
Los objetos Command de ADO.NET, que también son dos: SqlCommand y OleDbCommand, son muy similares al objeto Command existente en ADO. El objeto Command nos va a permitir ejecutar una sentencia SQL o un procedimiento almacenado sobre la fuente de datos a la que estamos accediendo.
A través de un objeto Command también podremos obtener un conjunto de resultados del almacén de datos, en este caso estos resultados se pasarán a otros objetos de ADO .NET, como puede ser un DataReader o bien un objeto DataAdapter.
Un objeto Command lo vamos a poder crear a partir de una conexión ya existente y va a contener una sentencia SQL para ejecutar sobre la conexión con el origen de datos.




v  PROPIEDADES
A continuación vamos a comentar algunas de las propiedades más importantes que ofrecen los objetos
SqlCommand y OleDbCommand:

Connection: devuelve el objeto SqlConnection o OleDbConnection utilizado para ejecutar el objeto
Command correspondiente.

CommandText: contiene una cadena de texto que va a indicar la sentencia SQL o procedimiento almacenado que se va a ejecutar sobre el origen de los datos.

CommandType: indica el tipo de comando que se va a ejecutar contra el almacén de datos, es decir, indica cómo se debe interpretar el valor de la propiedad CommadText. Puede tener los siguientes valores; StoredProcedure, para indicar que se trata de un procedimiento almacenado; TableDirect se trata de obtener una tabla por su nombre (únicamente aplicable al objeto OleDbCommand); y Text que indica que es una sentencia SQL. EL valor por defecto es Text.

Parameters: colección de parámetros que se pueden utilizar para ejecutar el objeto Command, esta colección se utiliza cuando deseamos ejecutar sentencias SQL que hacen uso de parámetros, esta propiedad devuelve un objeto de la clase SqlParameterCollection o un objeto de la clase OleDbParameterCollection. Estas colecciones contendrán objetos de la clase SqlParameter y OleDbParameter, respectivamente, para representar a cada uno de los parámetros utilizados. Estos parámetros también son utilizados para ejecutar procedimientos almacenados.

CommandTimeout: tiempo de espera en segundos que se va a aplicar a la ejecución de un objeto
Command. Su valor por defecto es de 30 segundos.
Una vez vistas algunas de las propiedades de las clases SqlCommand y OleDbCommand vamos a pasar a comentar brevemente los métodos más usuales de estas clases:

CreateParameter: crea un parámetro para el que después podremos definir una serie de características específicas como pueden ser el tipo de dato, su valor, tamaño, etc. Devolverá un objeto de la clase SqlParameter u OleDbParameter.

ExecuteNonQuery: ejecuta la sentencia SQL definida en la propiedad ComandText contra la conexión definida en la propiedad Connection, para un tipo de consulta que no devuelve un conjunto de registros, puede ser una sentencia Update, Delete o Insert. Este método devuelve un entero indicando el número de filas que se han visto afectadas por la ejecución del objeto Command.

ExecuteReader: ejecuta la sentencia SQL definida en la propiedad ComandText contra la conexión definida en la propiedad Connection, para un tipo de consulta que devuelve un conjunto de registros, puede ser una sentencia Select. Este método devolverá un objeto de la clase SqlDataReader/OleDbDataReader, que nos va a permitir leer y recorrer los resultados devueltos por la ejecución del objeto Command correspondiente.

ExecuteScalar: este otro método para ejecutar objetos Command se utiliza cuando deseamos obtener la primera columna de la primera fila del conjunto de registros, el resto de datos no se tendrán en cuenta. La utilización de este método tiene sentido cuando estamos ejecutando una sentencia SQL del tipo Select count(*). Este método devuelve un objeto de la clase Object.

Prepare: este método construye una versión compilada del objeto Command dentro del almacén de datos.

v  MÉTODOS
Método SqlCommand.BeginExecuteNonQuery: Inicia la ejecución asincrónica de la instrucción de Transact-SQL o del procedimiento almacenado que describe SqlCommand.

MétodoSqlCommand.BeginExecuteNonQuery (AsyncCallback, Object): Inicia la ejecución asincrónica de la instrucción de Transact-SQL o del procedimiento almacenado que describe SqlCommand, dados un procedimiento de devolución de llamada e información de estado.

Nombre        Descripción
System_CAPS_pubmethod      BeginExecuteNonQuery:          
Inicia la ejecución asincrónica de la instrucción de Transact-SQL o del procedimiento almacenado que describe SqlCommand.

System_CAPS_pubmethod BeginExecuteNonQuery(AsyncCallback, Object):    
Inicia la ejecución asincrónica de la instrucción de Transact-SQL o del procedimiento almacenado que describe SqlCommand, dados un procedimiento de devolución de llamada e información de estado.
System_CAPS_pubmethod      BeginExecuteReader():  
Inicia la ejecución asincrónica de la instrucción de Transact-SQL o del procedimiento almacenado que describe SqlCommand y recupera uno o varios conjuntos de resultados del servidor.

System_CAPS_pubmethod BeginExecuteReader(AsyncCallback, Object):          
Inicia la ejecución asincrónica de la instrucción de Transact-SQL o del procedimiento almacenado que describe SqlCommand y recupera uno o varios conjuntos de resultados del servidor, dados un procedimiento de devolución de llamada e información de estado.
System_CAPS_pubmethod BeginExecuteReader(AsyncCallback, Object, CommandBehavior):      
Inicia la ejecución asincrónica de la instrucción de Transact-SQL o del procedimiento almacenado que describe SqlCommand, utilizando uno de los valores de CommandBehavior y recuperando uno o varios conjuntos de resultados del servidor, a partir del procedimiento de devolución de llamada e información de estado dados.

System_CAPS_pubmethod BeginExecuteReader(CommandBehavior):     
Inicia la ejecución asincrónica de la instrucción de Transact-SQL o del procedimiento almacenado que describe SqlCommand utilizando uno de los valores de CommandBehavior.

System_CAPS_pubmethod      BeginExecuteXmlReader()        
Inicia la ejecución asincrónica de la instrucción de Transact-SQL o del procedimiento almacenado que describe SqlCommand y devuelve los resultados como un objeto XmlReader.

System_CAPS_pubmethod BeginExecuteXmlReader(AsyncCallback, Object)    
Inicia la ejecución asincrónica de la instrucción de Transact-SQL o del procedimiento almacenado que describe SqlCommand y devuelve los resultados como un objeto XmlReader a través de un procedimiento de devolución de llamada.

System_CAPS_pubmethod      Cancel()       
Intenta cancelar la ejecución de un SqlCommand.(Invalida DbCommand.Cancel()).

System_CAPS_pubmethod      Clone()         
Crea un nuevo objeto SqlCommand que es una copia de la instancia actual.

System_CAPS_pubmethod      CreateObjRef(Type)        
Crea un objeto que contiene toda la información relevante necesaria para generar a un proxy que se utiliza para comunicarse con un objeto remoto.(Heredado de MarshalByRefObject).

System_CAPS_pubmethod      CreateParameter()
Crea una nueva instancia de un objeto SqlParameter.

System_CAPS_pubmethod      Dispose()    
Libera todos los recursos que usa Component.(Heredado de Component).
System_CAPS_pubmethod EndExecuteNonQuery(IAsyncResult)    
Finaliza la ejecución asincrónica de una instrucción de Transact-SQL.

System_CAPS_pubmethod
EndExecuteReader(IAsyncResult)    
Finaliza la ejecución asincrónica de una instrucción de Transact-SQL y devuelve el objeto SqlDataReader solicitado.

System_CAPS_pubmethod EndExecuteXmlReader(IAsyncResult)   
Finaliza la ejecución asincrónica de una instrucción de Transact-SQL y devuelve los datos solicitados como XML.

System_CAPS_pubmethod      Equals(Object)      
Determina si el objeto especificado es igual al objeto actual.(Heredado de Object).

System_CAPS_pubmethod      ExecuteNonQuery()         
Ejecuta una instrucción de Transact-SQL en la conexión y devuelve el número de filas afectadas.(Invalida DbCommand.ExecuteNonQuery()).

System_CAPS_pubmethod      ExecuteNonQueryAsync()        
Una versión asincrónica de ExecuteNonQuery, que ejecuta una instrucción SQL en un objeto de conexión. Invoca ExecuteNonQueryAsync con CancellationToken.None.(Heredado de DbCommand).

System_CAPS_pubmethod ExecuteNonQueryAsync(CancellationToken) 
Versión asincrónica de ExecuteNonQuery, que ejecuta una instrucción de Transact-SQL con la conexión y devuelve el número de filas afectadas. Token de cancelación que se puede usar para solicitar que se abandone la operación antes de que transcurra el tiempo de espera del comando. Las excepciones se mostrarán a través del objeto Task devuelto.(Invalida DbCommand.ExecuteNonQueryAsync(CancellationToken)).

System_CAPS_pubmethod      ExecuteReader()   
Envía la propiedad CommandText a Connection y crea un objeto SqlDataReader.



System_CAPS_pubmethod ExecuteReader(CommandBehavior)      
Envía CommandText a Connection y crea un SqlDataReader mediante uno de los valores de CommandBehavior.

System_CAPS_pubmethod      ExecuteReaderAsync()  
Una versión asincrónica de ExecuteReader, que envía la propiedad CommandText a la propiedad Connection y compila SqlDataReader. Las excepciones se mostrarán a través del objeto Task devuelto.

System_CAPS_pubmethod ExecuteReaderAsync(CancellationToken)       
Una versión asincrónica de ExecuteReader, que envía la propiedad CommandText a la propiedad Connection y compila SqlDataReader.
Token de cancelación que se puede usar para solicitar que se abandone la operación antes de que transcurra el tiempo de espera del comando. Las excepciones se mostrarán a través del objeto Task devuelto.

System_CAPS_pubmethod ExecuteReaderAsync(CommandBehavior)      
Versión asincrónica de ExecuteReader, que envía la propiedad CommandText a la propiedad Connection y compila SqlDataReader. Las excepciones se mostrarán a través del objeto Task devuelto.

System_CAPS_pubmethod ExecuteReaderAsync(CommandBehavior, CancellationToken)        
Versión asincrónica de ExecuteReader, que envía la propiedad CommandText a la propiedad Connection y compila SqlDataReader
Token de cancelación que se puede usar para solicitar que se abandone la operación antes de que transcurra el tiempo de espera del comando. Las excepciones se mostrarán a través del objeto Task devuelto.

System_CAPS_pubmethod      ExecuteScalar()    
Ejecuta la consulta y devuelve la primera columna de la primera fila del conjunto de resultados devuelto por la consulta. Las demás columnas o filas no se tienen en cuenta.(Invalida DbCommand.ExecuteScalar()).



System_CAPS_pubmethod      ExecuteScalarAsync()    
Una versión asincrónica de ExecuteScalar, que ejecuta la consulta y devuelve la primera columna de la primera fila del conjunto de resultados devuelto por la consulta. Se omiten todas las demás columnas y filas. InvocaExecuteScalarAsync con CancellationToken.None.(Heredado de DbCommand).

System_CAPS_pubmethod ExecuteScalarAsync(CancellationToken)         
Versión asincrónica de ExecuteScalar que ejecuta la consulta asincrónicamente y devuelve la primera columna de la primera fila del conjunto de resultados que devuelve la consulta. Las demás columnas o filas no se tienen en cuenta.
Token de cancelación que se puede usar para solicitar que se abandone la operación antes de que transcurra el tiempo de espera del comando. Las excepciones se mostrarán a través del objeto Task devuelto. (Invalida DbCommand.ExecuteScalarAsync(CancellationToken)).

System_CAPS_pubmethod      ExecuteXmlReader()       
Envía CommandText a Connection y crea un objeto XmlReader.
System_CAPS_pubmethod         ExecuteXmlReaderAsync()         
Una versión asincrónica de ExecuteXmlReader, que envía la propiedad CommandText a la propiedad Connection y compila un objeto XmlReader.
Las excepciones se mostrarán a través del objeto Task devuelto.

System_CAPS_pubmethod ExecuteXmlReaderAsync(CancellationToken)
Una versión asincrónica de ExecuteXmlReader, que envía la propiedad CommandText a la propiedad Connection y compila un objeto XmlReader.
Token de cancelación que se puede usar para solicitar que se abandone la operación antes de que transcurra el tiempo de espera del comando. Las excepciones se mostrarán a través del objeto Task devuelto.

System_CAPS_pubmethod      GetHashCode()     
Sirve como la función hash predeterminada.(Heredado de Object).

System_CAPS_pubmethod      GetLifetimeService()        
Recupera el objeto de servicio de duración actual que controla la directiva de duración de esta instancia.(Heredado de MarshalByRefObject).



System_CAPS_pubmethod      GetType()    
Obtiene el Type de la instancia actual.(Heredado de Object).

System_CAPS_pubmethod      InitializeLifetimeService()           
Obtiene un objeto de servicio de duración para controlar la directiva de duración de esta instancia.(Heredado de MarshalByRefObject).

System_CAPS_pubmethod      Prepare()     
Crea una versión preparada del comando en una instancia de SQL Server.(Invalida DbCommand.Prepare()).

System_CAPS_pubmethod      ResetCommandTimeout()         
Restablece el valor predeterminado de la propiedad CommandTimeout.

System_CAPS_pubmethod      ToString()   
Devuelve un String que contiene el nombre de la Component, si existe. Este método no se debe invalidar. (Heredado de Component).




v  EJEMPLOS
En el siguiente ejemplo se crea un objeto SqlCommand y, a continuación, se ejecuta mediante ExecuteScalar. En el ejemplo se pasan una cadena que representa un nuevo valor que se va a insertar en una tabla y una cadena que se va a utilizar para conectar al origen de datos. La función devuelve el nuevo valor de la columna Identity si se ha insertado una nueva fila; devuelve 0 en caso de error.

Public Function AddProductCategory( _
  ByVal newName As String, ByVal connString As String) As Integer
    Dim newProdID As Int32 = 0
    Dim sql As String = _
     "INSERT INTO Production.ProductCategory (Name) VALUES (@Name); " _
       & "SELECT CAST(scope_identity() AS int);"

    Using conn As New SqlConnection(connString)
        Dim cmd As New SqlCommand(sql, conn)
        cmd.Parameters.Add("@Name", SqlDbType.VarChar)
        cmd.Parameters("@Name").Value = newName
        Try
            conn.Open()
            newProdID = Convert.ToInt32(cmd.ExecuteScalar())
        Catch ex As Exception
            Console.WriteLine(ex.Message)
        End Try
    End Using

    Return newProdID
End Function


Otro Ejemplo:
Module Module1

    Sub Main()
        ejemploSQL()

        Console.ReadLine()
    End Sub

    Sub ejemploSQL()
        Dim sql As New AccesoDatosSQL

        Dim t As Integer = sql.TotalRegistros()
        Console.WriteLine("El total de registros es: {0}", t)
        Console.WriteLine()

        Dim id As Integer

        ' Usando un command
        id = sql.Insertar("Guillermo", "Som", _
                          "guille@nombres.com", DateTime.Now, _
                          "Prueba de insertar datos " & t + 1)
        Console.WriteLine("El nuevo ID es: {0}", id)

        ' Usando un dataAdapter
        'id = sql.InsertarAdapter("Guillermo", "Som", _
        '                         "guille@nombres.com", DateTime.Now, _
        '                         "Prueba de insertar datos " & t + 1)
        'Console.WriteLine("El nuevo ID es: {0}", id)

        ' Actualizar el ID 2
        id = 2
        sql.Actualizar(id, "Guillermo nº" & id, "Som", _
                       "guille@nombres.com", DateTime.Now)

    End Sub
End Module
En el ejemplo siguiente, se muestra un uso más interesante para el objeto Command. En el ejemplo, el texto del comando SQL se ha modificado para hacerlo parametrizado. De este modo, se puede volver a utilizar el comando, pasando un valor diferente para el parámetro cada vez. Dado que la propiedad Prepared del objeto Command se ha establecido en True, ADO requerirá que el proveedor compile el comando especificado en CommandText antes de ejecutarlo por primera vez. También guardará el comando compilado en memoria. Esto ralentiza ligeramente la ejecución del comando la primera vez que se ejecuta, debido a la sobrecarga necesaria para prepararlo, pero tiene como consecuencia una mejora del rendimiento cada vez que se vuelve a llamar al comando posteriormente. Por tanto, los comandos sólo se deberían preparar si se van a utilizar más de una vez.
'BeginManualParamCmd
 On Error GoTo ErrHandler:

 Dim objConn As New ADODB.Connection
 Dim objCmd As New ADODB.Command
 Dim objParm1 As New ADODB.Parameter
 Dim objRs As New ADODB.Recordset

 ' Set the CommandText as a parameterized SQL query.
 objCmd.CommandText = "SELECT OrderID, OrderDate, " & _
 "RequiredDate, ShippedDate " & _
 "FROM Orders " & _
 "WHERE CustomerID = ? " & _
 "ORDER BY OrderID"
 objCmd.CommandType = adCmdText

 ' Prepare command since we will be executing it more than once.
 objCmd.Prepared = True

 ' Create new parameter for CustomerID. Initial value is ALFKI.
 Set objParm1 = objCmd.CreateParameter("CustId", adChar, _
 adParamInput, 5, "ALFKI")
 objCmd.Parameters.Append objParm1

 ' Connect to the data source.
 Set objConn = GetNewConnection
 objCmd.ActiveConnection = objConn

 ' Execute once and display...
 Set objRs = objCmd.Execute

 Debug.Print objParm1.Value
 Do While Not objRs.EOF
 Debug.Print vbTab & objRs(0) & vbTab & objRs(1) & vbTab & _
 objRs(2) & vbTab & objRs(3)
 objRs.MoveNext
 Loop

 ' ...then set new param value, re-execute command, and display.
 objCmd("CustId") = "CACTU"
 Set objRs = objCmd.Execute

 Debug.Print objParm1.Value
 Do While Not objRs.EOF
 Debug.Print vbTab & objRs(0) & vbTab & objRs(1) & vbTab & _
 objRs(2) & vbTab & objRs(3)
 objRs.MoveNext
 Loop

 'clean up
 objRs.Close
 objConn.Close
 Set objRs = Nothing
 Set objConn = Nothing
 Set objCmd = Nothing
 Set objParm1 = Nothing
 Exit Sub

ErrHandler:
 'clean up
 If objRs.State = adStateOpen Then
 objRs.Close
 End If

 If objConn.State = adStateOpen Then
 objConn.Close
 End If

 Set objRs = Nothing
 Set objConn = Nothing
 Set objCmd = Nothing
 Set objParm1 = Nothing

 If Err <> 0 Then
 MsgBox Err.Source & "-->" & Err.Description, , "Error"
 End If
'EndManualParamCmd


2.    RESUMEN
Con las colecciones, los métodos y las propiedades de un objeto Command, puede hacer lo siguiente:

Definir el texto ejecutable del comando (por ejemplo, una instrucción SQL o un procedimiento almacenado) utilizando la propiedad CommandText.
Definir consultas parametrizadas o argumentos de procedimientos almacenados utilizando objetos Parameter y la colección Parameters.
Ejecutar un comando y devolver un objeto Recordset, si procede, usando el método Execute.
Especificar el tipo de comando mediante la propiedad CommandType antes de la ejecución para optimizar el rendimiento.
Controlar si el proveedor guarda una versión preparada (o compilada) del comando antes de la ejecución mediante la propiedad Prepared.
Establecer el número de segundos que esperará un proveedor para la ejecución de un comando mediante la propiedad CommandTimeout.
Asociar una conexión abierta con un objeto Command estableciendo su propiedad ActiveConnection.
Establecer la propiedad Name para identificar el objeto Command como un método en el objeto Connection asociado.
Pasar un objeto Command a la propiedad Source de un conjunto de registros para obtener datos.

3.    SUMMARY
With the collections, methods, and properties of a Command object, you can do the following:

Define the executable text of the command (for example, an SQL statement or a stored procedure) using the CommandText property.
Define parameterized queries or stored procedure arguments using Parameter objects and the Parameters collection.
Run a command and return a Recordset object, if applicable, using the Execute method.
Specify the command type by using the CommandType property before execution to optimize performance.
Control whether the provider saves a prepared (or compiled) version of the command before execution by using the Prepared property.
Set the number of seconds a vendor will wait for a command to execute using the CommandTimeout property.
Associate an open connection with a Command object by setting its ActiveConnection property.
Set the Name property to identify the Command object as a method on the associated Connection object.
Pass a Command object to the Source property of a recordset to get data.

4.    RECOMENDACIONES
·         No todos los proveedores admiten comandos preparados. Si el proveedor no admite la preparación de comandos, podría devolver un error en cuanto esta propiedad se estableciese en True. Si no devuelve un error, omite la solicitud de preparar el comando y establece la propiedad Prepared en False.

·         Utilizamos el Objeto SqlCommand solamente cuando necesitamos ejecutar un tipo de sentencia Sql a la base de datos.

·         Si deseamos ejecutar más de un tipo de sentencia Sql a la base de datos es recomendable utilizar SqlDataAdapter.


·         No podrás utilizar el Objeto SqlCommand cuando necesitas ejecutar más de un tipo de sentencia Sql o si trabajarás en escenarios desconectados.

5.    CONCLUSIONES
·         Un SqlCommand se utiliza cuando necesitas ejecutar un tipo de sentencia Sql a la base de datos (los tipos pueden ser: Delete, Update, Insert o Select). Por su parte el SqlDataAdapter se utiliza si requieres ejecutar más de un tipo de sentencia Sql o si trabajarás en escenarios desconectados.

·         Los comandos contienen la información que se envía a una base de datos y se representan mediante clases específicas de un proveedor, como SQLCommand. Un comando podría ser una llamada a un procedimiento almacenado, una instrucción UPDATE o una instrucción que devuelve resultados. También es posible utilizar parámetros de entrada o de resultados y devolver valores como parte de la sintaxis del comando.


·         Podemos concluir que si no necesitas trabajar en escenarios desconectados y si solo necesitas utilizar un comando a la vez, utiliza un SqlCommand, de lo contrario un SqlDataAdapter.

6.    APRECIACION DEL EQUIPO
El Objeto SqlCommand se utiliza cuando necesitas ejecutar un tipo de sentencia Sql a la base de datos y también el Objeto SqlCommand tiene un conjunto de propiedades y métodos.

7.    GLOSARIO DE TERMINOS
Método de la clase: Sinónimo de método estático. Un método que se puede invocar sin crear una instancia de la clase. Para definir
métodos de clases, se ha de poner un modificador static
en la declaración del método.

Método de la instancia: Un método (o procedimiento)declarado por un clase que se
llama por sus objetos de instancias (o los de las subclases).

SqlCommand()       
Inicializa una nueva instancia de la clase SqlCommand.

SqlCommand(String)       
Inicializa una nueva instancia de la clase SqlCommand con el texto de la consulta.
SqlCommand(String, SqlConnection)           
Inicializa una nueva instancia de la clase SqlCommand con el texto de la consulta y una conexión SqlConnection.

SqlCommand(String, SqlConnection, SqlTransaction)  
Inicializa una nueva instancia de la clase SqlCommand con el texto de la consulta, un objeto SqlConnection y el objeto SqlTransaction.

Exception     Condition
InvalidCastException       
Se usó un elemento SqlDbType distinto de Binary o VarBinary cuando Value se estableció en Stream. Para obtener más información sobre streaming, vea Compatibilidad de transmisión de datos de SqlClient.
Se usó un elemento SqlDbType distinto de Char, NChar, NVarChar, VarChar o Xml cuando Value se estableció en TextReader.
Se usó un SqlDbType distinto de Xml o cuando Value se estableció en XmlReader.

SqlException          
Se produjo una excepción al ejecutar el comando contra una fila bloqueada. Esta excepción no se genera cuando se usa Microsoft .NET
Se agotó el tiempo de espera durante una operación de streaming. Para obtener más información sobre streaming, vea Compatibilidad de transmisión de datos de SqlClient.

InvalidOperationException        
La SqlConnection se cerró o se interrumpió durante una operación de streaming. Para obtener más información sobre streaming, vea Compatibilidad de transmisión de datos de SqlClient.

IOException
Se produjo un error en un objeto Stream, XmlReader o TextReader durante una operación de streaming. Para obtener más información sobre streaming, vea Compatibilidad de transmisión de datos de SqlClient.

8.    BIBLIOGRAFIA O LINKOGRAFIA






Comentarios