Especificar valores XML como parámetros
Si una consulta requiere un parámetro cuyo valor es una cadena XML, puede facilitar ese valor mediante una instancia del tipo de datos SqlXml
. En realidad no se trata de ningún truco; las columnas XML de SQL Server aceptan valores de parámetro exactamente igual que otros tipos de datos.
Ejemplo
En la siguiente aplicación de consola se crea una nueva tabla en la base de datos AdventureWorks. La nueva tabla incluye una columna denominada SalesID y una columna XML de nombre SalesInfo.
Nota
De forma predeterminada, la base de datos de ejemplo AdventureWorks no se instala al instalar SQL Server. Puede instalarlo mediante la ejecución del programa de instalación de SQL Server.
En el ejemplo se prepara un objeto SqlCommand para insertar una fila en la nueva tabla. Un archivo guardado proporciona los datos XML necesarios para la columna SalesInfo.
Para crear el archivo necesario para que se ejecute el ejemplo, cree un archivo de texto en la misma carpeta que el proyecto. Asigne al archivo el nombre MyTestStoreData.xml. Abra el archivo en el Bloc de notas y copie y pegue el texto siguiente:
<StoreSurvey xmlns="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/StoreSurvey">
<AnnualSales>300000</AnnualSales>
<AnnualRevenue>30000</AnnualRevenue>
<BankName>International Bank</BankName>
<BusinessType>BM</BusinessType>
<YearOpened>1970</YearOpened>
<Specialty>Road</Specialty>
<SquareFeet>7000</SquareFeet>
<Brands>3</Brands>
<Internet>T1</Internet>
<NumberEmployees>2</NumberEmployees>
</StoreSurvey>
Imports System
Imports System.Data.SqlClient
Imports System.Data.SqlTypes
Imports System.Xml
Module Module1
Sub Main()
Using connection As SqlConnection = New SqlConnection(GetConnectionString())
connection.Open()
' Create a sample table (dropping first if it already
' exists.)
Dim commandNewTable As String = _
"IF EXISTS (SELECT * FROM dbo.sysobjects " & _
"WHERE id = object_id(N'[dbo].[XmlDataTypeSample]') " & _
"AND OBJECTPROPERTY(id, N'IsUserTable') = 1) " & _
"DROP TABLE [dbo].[XmlDataTypeSample];" & _
"CREATE TABLE [dbo].[XmlDataTypeSample](" & _
"[SalesID] [int] IDENTITY(1,1) NOT NULL, " & _
"[SalesInfo] [xml])"
Dim commandAdd As New _
SqlCommand(commandNewTable, connection)
commandAdd.ExecuteNonQuery()
Dim commandText As String = _
"INSERT INTO [dbo].[XmlDataTypeSample] " & _
"([SalesInfo] ) " & _
"VALUES(@xmlParameter )"
Dim command As New SqlCommand(commandText, connection)
' Read the saved XML document as a
' SqlXml-data typed variable.
Dim newXml As SqlXml = _
New SqlXml(New XmlTextReader("MyTestStoreData.xml"))
' Supply the SqlXml value for the value of the parameter.
command.Parameters.AddWithValue("@xmlParameter", newXml)
Dim result As Integer = command.ExecuteNonQuery()
Console.WriteLine(result & " row was added.")
Console.WriteLine("Press Enter to continue.")
Console.ReadLine()
End Using
End Sub
Private Function GetConnectionString() As String
' To avoid storing the connection string in your code,
' you can retrieve it from a configuration file.
Return "..."
End Function
End Module
using System;
using System.Data;
using System.Data.SqlClient;
using System.Xml;
using System.Data.SqlTypes;
class Class1
{
static void Main()
{
using (SqlConnection connection = new SqlConnection(GetConnectionString()))
{
connection.Open();
// Create a sample table (dropping first if it already
// exists.)
string commandNewTable =
"IF EXISTS (SELECT * FROM dbo.sysobjects " +
"WHERE id = " +
"object_id(N'[dbo].[XmlDataTypeSample]') " +
"AND OBJECTPROPERTY(id, N'IsUserTable') = 1) " +
"DROP TABLE [dbo].[XmlDataTypeSample];" +
"CREATE TABLE [dbo].[XmlDataTypeSample](" +
"[SalesID] [int] IDENTITY(1,1) NOT NULL, " +
"[SalesInfo] [xml])";
SqlCommand commandAdd =
new SqlCommand(commandNewTable, connection);
commandAdd.ExecuteNonQuery();
string commandText =
"INSERT INTO [dbo].[XmlDataTypeSample] " +
"([SalesInfo] ) " +
"VALUES(@xmlParameter )";
SqlCommand command =
new SqlCommand(commandText, connection);
// Read the saved XML document as a
// SqlXml-data typed variable.
SqlXml newXml =
new SqlXml(new XmlTextReader("MyTestStoreData.xml"));
// Supply the SqlXml value for the value of the parameter.
command.Parameters.AddWithValue("@xmlParameter", newXml);
int result = command.ExecuteNonQuery();
Console.WriteLine(result + " row was added.");
Console.WriteLine("Press Enter to continue.");
Console.ReadLine();
}
}
private static string GetConnectionString()
{
// To avoid storing the connection string in your code,
// you can retrieve it from a configuration file.
return "...";
}
}