Especificar valores XML como parâmetros
Se uma consulta exigir um parâmetro cujo valor é uma cadeia de caracteres XML, você poderá fornecer esse valor usando uma instância do SqlXml
tipo de dados. Realmente não há truques; As colunas XML no SQL Server aceitam valores de parâmetro exatamente da mesma maneira que outros tipos de dados.
Exemplo
O aplicativo de console a seguir cria uma nova tabela no banco de dados AdventureWorks . A nova tabela inclui uma coluna chamada SalesID e uma coluna XML chamada SalesInfo.
Nota
O banco de dados de exemplo AdventureWorks não é instalado por padrão quando você instala o SQL Server. Você pode instalá-lo executando a Instalação do SQL Server.
O exemplo prepara um SqlCommand objeto para inserir uma linha na nova tabela. Um arquivo salvo fornece os dados XML necessários para a coluna SalesInfo .
Para criar o arquivo necessário para que o exemplo seja executado, crie um novo arquivo de texto na mesma pasta do seu projeto. Nomeie o arquivo MyTestStoreData.xml. Abra o arquivo no bloco de notas e copie e cole o seguinte texto:
<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 "...";
}
}