tabla - ¿Cómo pasar XML de C#a un procedimiento almacenado en SQL Server 2008?
sql server parametro xml (4)
Quiero pasar el documento xml al procedimiento almacenado del servidor SQL como este:
CREATE PROCEDURE BookDetails_Insert (@xml xml)
Quiero comparar algunos datos de campo con otros datos de tabla y, si coinciden, los registros deben estar insertados en la tabla.
Requisitos:
¿Cómo paso XML al procedimiento almacenado? Intenté esto, pero no funciona: [Trabajo]
command.Parameters.Add( new SqlParameter("@xml", SqlDbType.Xml) { Value = new SqlXml(new XmlTextReader(xmlToSave.InnerXml, XmlNodeType.Document, null)) });
¿Cómo accedo a los datos XML dentro del procedimiento almacenado?
Editar: [Trabajo]
String sql = "BookDetails_Insert";
XmlDocument xmlToSave = new XmlDocument();
xmlToSave.Load("C://Documents and Settings//Desktop//XML_Report//Books_1.xml");
SqlConnection sqlCon = new SqlConnection("...");
using (DbCommand command = sqlCon.CreateCommand())
{
**command.CommandType = CommandType.StoredProcedure;**
command.CommandText = sql;
command.Parameters.Add(
new SqlParameter("@xml", SqlDbType.Xml)
{
Value = new SqlXml(new XmlTextReader(xmlToSave.InnerXml
, XmlNodeType.Document, null))
});
sqlCon.Open();
DbTransaction trans = sqlCon.BeginTransaction();
command.Transaction = trans;
try
{
command.ExecuteNonQuery();
trans.Commit();
sqlCon.Close();
}
catch (Exception)
{
trans.Rollback();
sqlCon.Close();
throw;
}
Editar 2 : Cómo crear una consulta de selección para seleccionar páginas, descripción basada en algunas condiciones.
<booksdetail> <isn_13>700001048</isbn_13> <isn_10>01048B</isbn_10>
<Image_URL>http://www.landt.com/Books/large/00/7010000048.jpg</Image_URL>
<title>QUICK AND FLUPKE</title> <Description> PRANKS AND JOKES QUICK AND FLUPKE </Description> </booksdetail>
Como se indica en http://support.microsoft.com/kb/555266 , debe pasar datos xml como NText.
Puede consultar una variable XML de la siguiente manera:
DECLARE @PeopleXml XML
SET @PeopleXml = ''<People>
<Person>
<Name>James</Name>
<Age>28</Age>
</Person>
<Person>
<Name>Jane</Name>
<Age>24</Age>
</Person>
</People>''
-- put [1] at the end to ensure the path expression returns a singleton.
SELECT p.c.value(''Person[1]/Name[1]'', ''varchar(50)'')
FROM @PeopleXml.nodes(''People'') p(c) -- table and column aliases
Para la parte 2 de su pregunta, vea mi respuesta al procedimiento almacenado: pasar XML como argumento e INSERTAR (pares clave / valor) para ver un ejemplo de cómo usar XML dentro de un procedimiento almacenado.
EDITAR : El código de muestra a continuación se basa en el ejemplo específico dado en los comentarios.
declare @MyXML xml
set @MyXML = ''<booksdetail>
<isbn_13>700001048</isbn_13>
<isbn_10>01048B</isbn_10>
<Image_URL>http://www.landt.com/Books/large/00/70100048.jpg</Image_URL>
<title>QUICK AND FLUPKE</title>
<Description> PRANKS AND JOKES QUICK AND FLUPKE - CATASTROPHE QUICK AND FLUPKE </Description>
</booksdetail>''
select Book.detail.value(''(isbn_13/text())[1]'',''varchar(100)'') as isbn_13,
Book.detail.value(''(isbn_10/text())[1]'',''varchar(100)'') as isbn_10,
Book.detail.value(''(Image_URL/text())[1]'',''varchar(100)'') as Image_URL,
Book.detail.value(''(title/text())[1]'',''varchar(100)'') as title,
Book.detail.value(''(Description/text())[1]'',''varchar(100)'') as Description
from @MyXML.nodes(''/booksdetail'') as Book(detail)
Usará xPath y XQuery principalmente para consultar y modificar datos XML.
Este es un buen punto de partida http://msdn.microsoft.com/en-us/library/ms190798.aspx .
No puedo ser más específico porque tu pregunta es extremadamente vaga. Haga preguntas específicas sobre cómo hacer algo si quiere ayuda con el uso de XPath y XQuery.
public static string UpdateStaticCertificateFormateNo1Data(StaticCertificateFormatNo1LogicLayer StaticFormat1Detail)
{
SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ToString());
con.Open();
string strXMLRegistrationDetails, strXMLQutPut = "<root></root>";
System.Xml.Serialization.XmlSerializer x = new System.Xml.Serialization.XmlSerializer(StaticFormat1Detail.GetType());
System.IO.MemoryStream stream = new System.IO.MemoryStream();
x.Serialize(stream, StaticFormat1Detail);
stream.Position = 0;
XmlDocument xd = new XmlDocument();
xd.Load(stream);
strXMLRegistrationDetails = xd.InnerXml;
SqlTransaction trn = con.BeginTransaction();
try
{
SqlParameter[] paramsToStore = new SqlParameter[2];
paramsToStore[0] = ControllersHelper.GetSqlParameter("@StaticFormat1Detail", strXMLRegistrationDetails, SqlDbType.VarChar);
paramsToStore[1] = ControllersHelper.GetSqlParameter("@OutPut", strXMLQutPut, SqlDbType.VarChar);
SqlHelper.ExecuteNonQuery(trn, CommandType.StoredProcedure, "UPS_UpdateStaticCertificateFormateNo1Detail", paramsToStore);
trn.Commit();
}
catch (Exception ex)
{
trn.Rollback();
con.Close();
if (ex.Message.Contains("UNIQUE KEY constrastring"))
{ return "Details already in List"; }
else { return ex.Message; }
}
con.Close();
return "Details successfully Added...";
}