gpt4 book ai didi

c#-4.0 - 链接服务器 "OLE DB provider ' 的奇怪 '(null)' STREAM' 返回了列 '[!BulkInsert].Value' 错误的无效数据

转载 作者:行者123 更新时间:2023-12-03 23:20:53 27 4
gpt4 key购买 nike

使用的软件:Windows 7 64 位 Ultimate、.Net 4、SQL Server 2008 R2。

选择@@version 返回:

Microsoft SQL Server 2008 R2 (RTM) - 10.50.1617.0 (X64)   Apr 22 2011 19:23:43   Copyright (c) Microsoft Corporation  Developer Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1) (Hypervisor) 

要重现,并假设您有一个本地 sql server 2008 R2 实例,请将以下代码粘贴到 linqpad 中并将其作为程序运行。

它爆炸了:

链接服务器 '(null)' 的 OLE DB 提供程序 'STREAM' 返回了列 '[!BulkInsert].Value' 的无效数据。
void Main()
{
SqlConnection cn = new SqlConnection("data source=localhost;Integrated Security=SSPI;initial catalog=tempdb;Connect Timeout=180;");
cn.Open();

IList<decimal> list = new List<decimal>() {-8m, 8m};

decimal result = list.Sum(x => x);

Console.WriteLine(result == 0);

string tableName = "#test";

CreateTemporaryTable(cn, tableName,
String.Format(@"
create table {0} (
Value sql_variant
);
", tableName));

SqlBulkCopy sqlBulkCopy = new SqlBulkCopy(cn);
sqlBulkCopy.DestinationTableName = tableName;

DataTable dt = new DataTable();
dt.Columns.Add("Value", typeof(object));
dt.Rows.Add(result);
sqlBulkCopy.WriteToServer(dt);

sqlBulkCopy.Close();

cn.Close();
}

// Define other methods and classes here


public static void CreateTemporaryTable(SqlConnection cn, string destinationTableName, string createTableStatement)
{
string objectIdValue = (destinationTableName.StartsWith("#") ? "tempdb.." : "") + destinationTableName;
string sql = String.Format(@"
if (object_id (N'{0}', N'U') is not null)
begin
drop table {1};
end;
{2}
", objectIdValue, destinationTableName, createTableStatement);

// Console.WriteLine(sql);
SqlCommand cmd = new SqlCommand(sql, cn);
try
{
cmd.ExecuteNonQuery();
}
finally
{
cmd.Dispose();
}
}

我可能会与微软一起创建一个案例,但我很想知道其他人之前是否看到过这个,以及是否有任何解决方法。似乎并非所有的零都是平等的。

只是一个更新:

我向微软开了一个案子。他们花了将近 2 个月的时间才提出了一些模糊的未记录的 dbcc 标志,该标志关闭了对通过批量复制泵入变量列的值的验证。这个案子在不同的团队之间反弹(支持由印度私有(private)承包商提供),他们从未解决根本问题,我认为这与以下几行产生的值(value)以及批量复制代码如何处理它有关:
  IList<decimal> list = new List<decimal>() {-8m, 8m};
decimal result = list.Sum(x => x);

因此,总而言之,这令人失望,我放弃了,因为这种情况很少见。

最佳答案

如果您的“值”列的数据类型是浮点数,您可能的问题是您将 double.NaN 发送到它不喜欢的 sql server。

请注意,像 double.TryParse("NaN", out dv) 这样的调用将愉快地返回 true 并将 dv 设置为 double.NaN

希望这可以帮助,
K。

关于c#-4.0 - 链接服务器 "OLE DB provider ' 的奇怪 '(null)' STREAM' 返回了列 '[!BulkInsert].Value' 错误的无效数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23229862/

27 4 0