gpt4 book ai didi

c# - 在 sql_variant 列的表值参数中传递类型为 'object' 的参数

转载 作者:可可西里 更新时间:2023-11-01 07:58:37 25 4
gpt4 key购买 nike

我在 SQL Server 2012 中有一个表值参数定义为:

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

我在 C# 中调用它的代码大致如下所示:

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();

然后我在 ExecuteNonQuery 调用中从 SQL Server 收到以下错误:

The type of column 'Value' is not supported. The type is 'Object'

我找到了 someone 3 年前,当它被确定为已知的 Microsoft 错误时,他遇到了同样的问题。但是,指向该错误的链接已断开。有谁知道是否有关于错误状态或潜在解决方法的更新信息?就目前而言,这个错误确实扼杀了 sql_variant 字段的值(value)。

最佳答案

这篇文章已经有很多年了,但我遇到了同样的问题并找到了解决方案。如果您不使用 DataTable 而是填充 SqlDataRecord 的集合,那么您可以将 SqlDataRecord 的数据类型设置为 SqlDbType.Variant。

 List<SqlDataRecord> dataTable = new List<SqlDataRecord>();
var dr = new SqlDataRecord(
new SqlMetaData("Id", SqlDbType.Int),
new SqlMetaData("Value", SqlDbType.Variant));

dr.SetInt32(0, id);
dr.SetValue(1, myObject);

dataTable.Add(dr);

[...]

SqlCommand sqlCommand = new SqlCommand("dbo.MyProc");
var structuredParam = sqlCommand.Parameters.Add("myTableParam", SqlDbType.Structured);
structuredParam.Value = dataTable;

关于c# - 在 sql_variant 列的表值参数中传递类型为 'object' 的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14148301/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com