Cómo pasar una matriz de valores de SQL Server procedimiento almacenado mediante XML y Visual Basic .net

Seleccione idioma Seleccione idioma
Id. de artículo: 555266
Autor: Val Mazur MVP
RENUNCIA DE CONTENIDO DE LAS SOLUCIONES DE COMUNIDAD
MICROSOFT CORPORATION Y/O SUS RESPECTIVOS PROVEEDORES NO HACER NINGUNA GARANTÍA SOBRE LA IDONEIDAD, FIABILIDAD O EXACTITUD DE LA INFORMACIÓN Y LOS GRÁFICOS RELACIONADOS CONTENIDOS EN ESTE DOCUMENTO. TODOS LOS DICHA INFORMACIÓN Y LOS GRÁFICOS RELACIONADOS SE PROPORCIONAN "TAL CUAL" SIN GARANTÍA DE NINGÚN TIPO. MICROSOFT Y/O SUS RESPECTIVOS PROVEEDORES RENUNCIAN A TODA GARANTÍA Y CONDICIÓN RESPECTO A ESTA INFORMACIÓN Y GRÁFICOS RELACIONADOS, INCLUIDAS TODAS LAS GARANTÍAS IMPLÍCITAS Y CONDICIONES DE COMERCIABILIDAD, IDONEIDAD PARA UN DETERMINADO FIN, ESFUERZO RAZONABLE, TÍTULO Y AUSENCIA DE INFRACCIÓN. USTED ACEPTA ESPECÍFICAMENTE QUE EN NINGÚN CASO MICROSOFT Y/O SUS PROVEEDORES SERÁN RESPONSABLES POR DAÑOS DIRECTOS, INDIRECTOS, PUNITIVOS, INCIDENTALES, ESPECIALES, CONSECUENTES O CUALQUIER OTRO TIPO, INCLUIDOS, SIN LIMITACIÓN, DAÑOS POR PÉRDIDA DE USO, DATOS O BENEFICIOS, QUE SURJA DE O EN ALGUNA MANERA SE RELACIONEN CON EL USO DE O LA INCAPACIDAD DE USO DE LA INFORMACIÓN Y LOS GRÁFICOS RELACIONADOS CONTENIDOS EN ESTE DOCUMENTOSI EN EL CONTRATO, AGRAVIO, NEGLIGENCIA, RESPONSABILIDAD ESTRICTA O DE LO CONTRARIO, INCLUSO SI TIENE MICROSOFT O CUALQUIERA DE SUS PROVEEDORES SE HUBIERA INFORMADO DE LA POSIBILIDAD DE DAÑOS.
Expandir todo | Contraer todo

SÍNTOMAS

Es necesario pasar la matriz de valores al procedimiento almacenado de SQL Server para utilizarlo como una lista para una cláusula IN.

CAUSA

Versión actual de Microsoft SQL Server no tiene ningún soporte de tipo de datos de matriz que permitiera pasando la matriz de valores como un parámetro del procedimiento almacenado o instrucción SQL. A menudo los programadores deben pasar una matriz de los valores para seleccionar registros basándose en una lista proporcionada en una cláusula IN. En la lista de casos de algunos de los parámetros pasados al procedimiento almacenado como una coma cadena delimitada y esta cadena delimitada no se puede utilizar directamente como un parámetro de la cláusula IN y debe transformarse en el formulario que es aceptable para el uso dentro de en la cláusula.

RESOLUCIÓN

Una de las soluciones a este problema es pasar la matriz de valores para, a continuación, el procedimiento almacenado como XML parámetro de cadena y utilice el proveedor de conjunto de filas OPENXML dentro del procedimiento almacenado para seleccionar valores procedentes del código XML proporcionado. Uso del proveedor junto con las instrucciones de Transact-SQL OPENXML proporciona una forma flexible y simple para manipular datos en una base de datos basado en una matriz de valores que se pasa.
 
Crear el proyecto
 
Nota En este ejemplo no contiene seguro para el control de excepciones que se necesitaría en una aplicación de nivel de producción.
 
Utilizaremos la tabla Orders de la base de datos de Northwind SQL Server 2000. Utilice los siguientes seguros para crear un procedimiento almacenado en una base de datos Northwind.
 
 
IF EXISTS (SELECT nombre
DE sysobjects
DONDE nombre = 'sp_SelectOrders' N
Y escriba = 'P')
DROP PROCEDURE sp_SelectOrders
IR
 
CREATE PROC sp_SelectOrders @ in_values nText como
 
DECLARE @ hDoc int
 
--Preparar los valores de entrada como un documento XML
exec sp_xml_preparedocument @ hDoc @ in_values de salida
 
--Selecciona datos de la tabla basándose en valores de XML
Seleccione * FROM Pedidos WHERE IdCliente IN ()
Seleccione CustomerID de OPENXML (@ hdoc, '/ NewDataSet/clientes', 1)
CON (CustomerID NCHAR(5)))
 
EXEC sp_xml_removedocument @ hDoc
 
IR
 
Inicie Microsoft .net de Visual Studio y crear la aplicación de consola. Se creará el archivo Module1.vb de forma predeterminada.
 
Reemplazar el seguro dentro del archivo Module1.vb por el siguiente. Para simplificar y ejemplo, ejemplo fuerte se selecciona la lista de todos los clientes de la tabla Customers, prepara la matriz de valores como una cadena XML sólo para la mitad de los clientes (para demostrar la selección limitada) y, a continuación, se ejecuta un procedimiento almacenado para seleccionar la lista de los pedidos de la tabla Pedidos para los clientes seleccionados.
 
Nota Tiene que modificar la cadena de conexión en una muestra de segura se utiliza en su entorno
 
Imports System.Data.SqlClient
Imports System.Xml
Imports System.Text
 
Module Module1
 
PublicSub Main()
 
Dim loCustomers As DataSet
Dim loOrders As DataTable
 
Try
 
' Obtener la lista de los clientes de la base de datos
loCustomers = GetCustomers()
 
Console.WriteLine ("Total de clientes:" & loCustomers.Tables(0).Rows.Count.ToString)
 
IfNot loCustomers IsNothingThen
loOrders = GetOrders(loCustomers)
Console.WriteLine ("Total de pedidos:"& loOrders.Rows.Count.ToString)
EndIf
 
Catch ex como excepción
Console.WriteLine (ex.Mensaje)
Por último
 
IfNot loCustomers IsNothingThen
loCustomers.Dispose()
loCustomers = Nothing
EndIf
 
IfNot loOrders IsNothingThen
loOrders.Dispose()
loOrders = Nothing
EndIf
 
EndTry
 
EndSub
 
PrivateFunction GetOrders(ByVal loCustomers As DataSet) As DataTable
 
Dim loOrders As DataSet
Dim loParameter As SqlParameter
Dim loCol DataColumn como
 
Try
 
' Preparar la salida XML del conjunto de datos de los clientes como una cadena
LoCol de ForEach en loCustomers.Tables("Customers").Columnas
loCol.ColumnMapping = System.Data.MappingType.Attribute
Siguiente
 
' Pasar el XML en el procedimiento almacenado como un parámetro
loParameter = SqlParameter("@in_values", System.Data.SqlDbType.NText) nueva
loParameter.Value = loCustomers.GetXml
 
' Obtener la lista de los pedidos de la base de datos
loOrders = GetDataFromDb ("sp_SelectOrders", CommandType.StoredProcedure, "Customers", loParameter)
 
' Lista de devolución de los pedidos como DataTable
Si (no loOrders IsNothing) AndAlso loOrders.Tables.Count = 1 Then
Devolver loOrders.Tables(0)
EndIf
 
Catch ex como excepción
Throw ex
EndTry
 
EndFunction
 
PrivateFunction GetCustomers() como conjunto de datos
 
Dim loCustomers As DataSet
Dim i As Int32
 
Try
 
' Obtener la lista de los clientes de la base de datos
loCustomers = GetDataFromDb ("SELECT IdCliente FROM clientes", CommandType.Text, "Customers")
 
' Quitar la mitad de los clientes para los fines de demostración para mostrar que seleccionamos información sólo para algunos de ellos
IfNot loCustomers IsNothingThen
 
Si, a continuación, loCustomers.Tables.Contains("Customers")
Con loCustomers.Tables("Customers")
 
i = .Rows.Count \ 2
DoWhile.Rows.Count >
.Rows.RemoveAt(0)
Bucle
 
' Aceptar los cambios para quitar por completo las filas de la tabla de datos
.AcceptChanges()
EndWith
Else
ThrowNew ApplicationException("Customers table does not exist")
EndIf
 
EndIf
 
' Lista de devolución de los clientes como un conjunto de datos
Devolver loCustomers
 
Catch ex como excepción
Throw ex
EndTry
 
EndFunction
 
PrivateFunction GetDataFromDb(ByVal lcSQL AsString, ByVal loCommandType As CommandType, _
LcTableName de ByVal AsString, ByValParamArray, loParameters() As SqlParameter) As DataSet
 
Dim loResult As DataSet
Dim loConnection As SqlConnection
Dim loCommand As SqlCommand
Dim loAdapter As SqlDataAdapter
Dim i As Int32
Dim loParameter As SqlParameter
 
Try
 
' Crear y abrir la conexión a la base de datos Northwind
loConnection = SqlConnection("Persist Security Info=False;Integrated Security=SSPI;database=northwind;server=(local); nuevaConectar Timeout = 30 ")
loConnection.Open()
 
' Preparar comando y para seleccionar datos de la base de datos
loCommand = SqlCommand(lcSQL, loConnection) nueva
loCommand.CommandType = loCommandType
 
IfNot loParameters IsNothingThen
LoParameter de ForEach en loParameters
loCommand.Parameters.Add(loParameter)
Siguiente
EndIf
 
loAdapter = SqlDataAdapter(loCommand) nueva
 
loResult = nuevo conjunto de datos
loAdapter.Fill (loResult, lcTableName)
 
' Lista de devolución de los clientes como un conjunto de datos
Devolver loResult
 
Catch ex como excepción
Throw ex
Por último
 
' Limpiar los recursos
IfNot loAdapter IsNothingThen
loAdapter.Dispose()
loAdapter = Nothing
EndIf
 
IfNot loCommand IsNothingThen
loCommand.Dispose()
loCommand = Nothing
EndIf
 
IfNot loConnection IsNothingThen
 
Si loConnection.State = ConnectionState.Open Then
loConnection.Close()
EndIf
 
loConnection.Dispose()
loConnection = Nothing
 
EndIf
EndTry
 
EndFunction
 
EndModule
 
4. Presione F5 para compilar y ejecutar la aplicación.
Nota: es un artículo de "PUBLICACIÓN RÁPIDA" creado directamente por la organización de soporte técnico de Microsoft. La información aquí contenida se proporciona como está, como respuesta a problemas que han surgido. Como consecuencia de la rapidez con la que lo hemos puesto disponible, los materiales podrían incluir errores tipográficos y pueden ser revisados en cualquier momento sin previo aviso. Vea las Condiciones de uso para otras consideraciones

Propiedades

Id. de artículo: 555266 - Última revisión: martes, 11 de septiembre de 2012 - Versión: 2.0
Traducción automática
IMPORTANTE: Este artículo ha sido traducido por un software de traducción automática de Microsoft (http://support.microsoft.com/gp/mtdetails) en lugar de un traductor humano. Microsoft le ofrece artículos traducidos por un traductor humano y artículos traducidos automáticamente para que tenga acceso en su propio idioma a todos los artículos de nuestra base de conocimientos (Knowledge Base). Sin embargo, los artículos traducidos automáticamente pueden contener errores en el vocabulario, la sintaxis o la gramática, como los que un extranjero podría cometer al hablar el idioma. Microsoft no se hace responsable de cualquier imprecisión, error o daño ocasionado por una mala traducción del contenido o como consecuencia de su utilización por nuestros clientes. Microsoft suele actualizar el software de traducción frecuentemente.
Haga clic aquí para ver el artículo original (en inglés): 555266

Enviar comentarios

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com