CSharp - 在sql_variant列的表值参数中,传递'object'的参数

  显示原文与译文双语对照的内容
0 0

我有一个table-valued参数 SQL Server 2012定义为:

CREATE TYPE [dbo].[TVP] AS TABLE (
 [Id] [int] NOT NULL,
 [FieldName] [nvarchar](100) NOT NULL,
 [Value] [sql_variant] NOT NULL
)

我在 C# 中调用它,代码看起来类似于 LIKE:

var mdItems = new DataTable();
mdItems.Columns.Add("Id", typeof(int));
mdItems.Columns.Add("FieldName", typeof(string));
mdItems.Columns.Add("Value", typeof(object));
mdItems.Rows.Add(new object[] {2,"blah","value"});//'value' is usually a string
SqlCommand sqlCommand = conn.CreateCommand();
sqlCommand.CommandText ="[WriteFieldValues]";
sqlCommand.CommandType = CommandType.StoredProcedure;
sqlCommand.Parameters.AddWithValue("@FieldValues", mdItems);
sqlCommand.ExecuteNonQuery();

然后我得到以下错误从 SQL Server ExecuteNonQuery 电话:

不支持列'值'的类型。 类型是'对象'

我发现有人在 3年前遇到了同样的问题,它被识别为一个已知的微软 Bug 。 到 Bug的链接已经断开,尽管。 是否有人知道 Bug的状态或者潜在的解决办法有更新的信息? 就像这样,这个 Bug 真的杀死了 sql_variant 字段的值。

时间:原作者:7个回答

0 0

希望你对这个"一个大小适合所有"数据模型有一个很好的使用。 通常,当你试图对基于集合的关系代数和sargeability的误解进行缩放时,它会在你的脸上爆炸。 也许你已经给了一些想法。 我不想在这里模型上开发 web logic或者报告。

请记住,你试图将一个对象插入到数据库引擎中,而数据库引擎不知道底层结构。 对象是如此的通用,以至于对象的接收者不知道如何解释它。 对象具有属性,但是你只能访问这些属性,如果你有明确的指示或者使用反射来识别unpackage中的基础类型,那么该对象就可以了。 只有通过使用反射,( 我知道) 才能可靠地将对象转换为基础类型,而不需要了解任何内容。 也许. NET的一些高手会给我其他的方法。

无法将通用对象类型存储为 sql_variant LIKE 。 甚至sql_variant需要有一些强类型的值。 SQL Server 不会隐式地使用反射来尝试找出数据类型( 然后是基础数据的值) 是什么。

可以使用 system 。reflection方法的GetType,然后在插入之前抛出一个大小写语句,以便进行相应的转换。

原作者:
0 0

不幸的是,我现在没有时间完全回答这个问题,但是我可以让你走上正确的道路。

我在过去所做的是,使用一个XML参数,将数据集序列化为 XML,将数据集( 或者任何 POCO,比如) 作为XML传递到过程中,然后将该XML变量的". nodes"属性( 和其他成员) 提取到临时表local本地表 var 。"工作表"等等 中。

这很模糊,但是如果你序列化了该数据集,并检查了创建的XML,并在联机丛书中读取了XML数据类型,你可能会发现如何完成你的任务。

如果这没有帮助,我将尝试把一个实际的解决方案放在明天,就像我在今天离开时遇到的这个问题一样。

干杯 !

原作者:
...