我想将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的列表,有人遇到类似的东西吗?
以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#传递为字符串并在SQL中将tvp参数保持为Xml的方式解决了]