如何将 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 参数的主要内容,如果未能解决你的问题,请参考以下文章

将 xml 数据作为存储过程的参数传递给 s-s-rs

如何将 C# 对象作为参数传递给 Javascript 函数

如何将从表单提交中检索到的参数作为参数传递给 django 中的函数

如何将参数传递给 ms 访问以取回数据

如何通过 HtmlDocument.InvokeScript 将对象作为参数传递给 javascript

如何将 JSON 返回数据作为参数传递给 URL 路由(laravel)