如何将 XML 数据作为参数传递给从 C# 到 Sql 服务器的 TVP 参数
Posted
技术标签:
【中文标题】如何将 XML 数据作为参数传递给从 C# 到 Sql 服务器的 TVP 参数【英文标题】:How to pass XML data as a parameter to a TVP param from C# to Sql server 【发布时间】:2020-05-07 21:29:34 【问题描述】:我想将 XML 类型的参数传递给 TVP 中的参数。我尝试了下面的代码,它不起作用。我无法弄清楚是否有办法将 xml 数据传递给 sql server 中的 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,有人遇到过类似的事情吗?
【问题讨论】:
【参考方案1】:将数据作为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 得到解决
【讨论】:
以上是关于如何将 XML 数据作为参数传递给从 C# 到 Sql 服务器的 TVP 参数的主要内容,如果未能解决你的问题,请参考以下文章
如何将 C# 对象作为参数传递给 Javascript 函数
如何将从表单提交中检索到的参数作为参数传递给 django 中的函数