使用DataTable和DataAdapter在SQL Server XML / string列中存储序列化数据

z3yyvxxp  于 2023-01-25  发布在  SQL Server
关注(0)|答案(2)|浏览(136)

我想知道是否有人可以帮助我通过这个场景:
在SQL Server中,我有一个类型为XMLstring的列。我的应用程序有一个可序列化的数据对象,我想将其存储在该列中。
我的DataTable中的DataColumn有这个对象的类型,但是当我尝试更新我的数据库时,我得到了异常
不存在从对象类型[...]到已知托管提供程序本机类型的Map
这实际上是很清楚的,但是有没有一种方法可以在FillUpdate使用DataAdapter时注入一个转换器/Map器来执行这种类型化的序列化和反序列化?
[编辑] x1c 0d1x

owfi6suc

owfi6suc1#

是的,我这样做。我在SQL Server表中的列定义是:

[FileData] [varchar](max) NOT NULL

我的应用程序中的数据集定义如下,一个字符串:

b09cbbtk

b09cbbtk2#

一个例外
不存在从对象类型[...]到已知托管提供程序本机类型的Map
当您在使用xml列时忘记序列化对象时,会出现。下面是使用xml类型字段时正确方法的示例

using (SqlConnection cnn = new SqlConnection(connectionString))
{
    string sql = "INSERT INTO Sale_T(SaleID, SaleInfo) values(@SaleId, @SaleInfo);";
    cnn.Open();
    using (SqlCommand cmd = new SqlCommand(sql, cnn))
    {
        Sale saleInfo = new Sale
        {
            Client = "Thomas",
            SaleDate = DateTime.Now,
            Items = new List<Product> {
                new Product { ProductName = "Apple", Price = 1.5 },
                new Product { ProductName = "Orange", Price = 0.8 } }
        };
        cmd.Parameters.AddWithValue("@SaleId", 2);
        // An attempt to directly assign an object leads to System.ArgumentException "No mapping exists from object type Sale to a known managed provider native type."
        // cmd.Parameters.AddWithValue("@SaleInfo", saleInfo);
        // you have to pre-serialize

        var Ser2String = (Sale si) =>  { 
            XmlSerializer mySerializer = new XmlSerializer(typeof(Sale));
            using (StringWriter stringWriter = new StringWriter())
            {
                mySerializer.Serialize(stringWriter, si);
                return stringWriter.ToString();
            }
        };

        string serSale = Ser2String(saleInfo);
        cmd.Parameters.AddWithValue("@SaleInfo", serSale);
        cmd.ExecuteNonQuery();
    }
}

好的,接下来是故事的继续,只是现在使用了

void DataAdapterFillExample(){
using (SqlConnection con = new SqlConnection(connectionString))
{
    using (SqlCommand cmd = new SqlCommand("SELECT * FROM Sale_T", con))
    {
        cmd.CommandType = CommandType.Text;
        using (SqlDataAdapter dataAdapter = new SqlDataAdapter(cmd))
        {
            using (DataTable dataTable = new DataTable())
            {
                dataAdapter.Fill(dataTable);
                foreach (DataRow row in dataTable.Rows)
                {
                    string saleID = row["SaleID"].ToString();
                    // here you can add desSerialization
                    string saleInfo = row["SaleInfo"].ToString();
                    Console.WriteLine($"{saleID} | {saleInfo}");
                }
            }
        }
    }
}

结果:
1个|彼得0001 - 01 - 01T00:00:00苹果1.5橙子0.8 2|托马斯2023年1月23日18:01:50.4545511 + 03:00苹果1.5橙子0.8

相关问题