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

问题描述 投票:0回答:1

我想将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的列表,有人遇到类似的东西吗?

c# sql sql-server xml table-valued-parameters
1个回答
0
投票

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的方式解决了]

© www.soinside.com 2019 - 2024. All rights reserved.