Как передать данные XML в качестве параметра параметру TVP с сервера C# на Sql - PullRequest
0 голосов
/ 21 января 2020

Я хочу передать параметр типа XML параметру в TVP. Я попробовал приведенный ниже код, который не работает. Я не могу выяснить, есть ли способ передать данные xml в TVP на сервере sql.

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 профилей вместе с соответствующими идентификаторами, кто-нибудь сталкивался с чем-то подобным?

1 Ответ

0 голосов
/ 21 января 2020

передача данных как 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...