如何将 XML 数据作为参数传递到 TVP 参数,从 C# 传递到 Sql 服务器



我想将 XML 类型的参数传递给 TVP 中的参数。我尝试了下面的代码,但它不起作用。我无法弄清楚是否有办法将 xml 数据传递给 sql 服务器中的 TVP。

.sql

CREATE TABLE XmlSample(Id INT,  Profile XML);
CREATE TYPE [SampleProfile_DataTYPE] AS TABLE 
(      
Id INT, 
Profile XML
);
CREATE PROCEDURE XmlTvpSprocTest_Save
@SamplesTvp [SampleProfile_DataTYPE] READONLY
AS  
BEGIN  
INSERT INTO XmlSample (Id, Profile)
SELECT DeviceID, Profile
FROM @SamplesTvp 
END

C# 中的应用程序端代码

public void SaveXmlTestData()
{
string xdata = @"<?xml version=""1.0"" encoding=""ISO - 8859 - 1""?><note><to>Rahul</to></note>";
var samples= GetSamplesTvp(1, 1, XElement.Parse(xdata));
using (DbCommand cmd = database.GetStoredProcCommand("XmlTvpSprocTest_Save"))
{
var param = new SqlParameter("@SamplesTvp ", samples) { SqlDbType = SqlDbType.Structured };
cmd.Parameters.Add(param);
database.ExecuteNonQuery(cmd);
}
}
private DataTable GetSamplesTvp(int deviceId, XmlDocument xmldata)
{
var table= new DataTable();
table.Columns.Add("Id", typeof(int));
table.Columns.Add("Profile", typeof(XElement));
table.Rows.Add(deviceId, xmldata);
return table;
}

我收到异常不支持列的类型。 xml 参数必须与其他参数一起包含在 TVP(配置文件(中。部分原因是,我将不得不保存XML配置文件列表及其相应的ID,有人遇到过类似的事情吗?

将数据传递为实际工作string

public void SaveXmlTestData_WithString()
{
//<?xml version=""1.0"" encoding=""UTF-8""?><!DOCTYPE plist PUBLIC"">
string xdata = @"<note><to>profile</to></note>";
var samples= GetSamplesTvp(1, xdata);
using (DbCommand cmd = database.GetStoredProcCommand("XmlTvpSprocTest"))
{
var param1 = new SqlParameter("@SamplesTvp ", samples) { SqlDbType = SqlDbType.Structured };
cmd.Parameters.Add(param1);
database.ExecuteNonQuery(cmd);
}
}
private List<SqlDataRecord> GetSamplesTvp(int Id, string xmldata)
{
List<SqlDataRecord> tvprecord = new List<SqlDataRecord>();
var column1 = new SqlMetaData("Id", SqlDbType.Int);
var column2 = new SqlMetaData("Profiles", SqlDbType.Xml);
var data = new SqlMetaData[] { column1, column2 };
var sqlrecord = new SqlDataRecord(data);
sqlrecord.SetValue(0, Id);
sqlrecord.SetValue(1, xmldata);
tvprecord.Add(sqlrecord);
return tvprecord;
}

虽然,如果我将注释掉的 xml 添加到 xmlData 中,我确实会遇到异常(Name cannot start with '.' character)这是另一个问题,但问题的核心是通过简单地将参数作为字符串从 c# 传递并将 tvp 参数保留在 sql 中作为 Xml 来解决的

最新更新