使用的軟件:Windows 7 64位Ultimate,.Net 4,SQL Server 2008 R2。
select @@ 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標誌,該標誌關閉了通過批量副本泵入變量列的值的驗證。案件在不同的團隊之間反彈(支持由印度私人承包商提供),他們從來沒有遇到根本問題,我認為這與以下幾行產生的價值有關,以及如何通過批量複製代碼處理:
IList<decimal> list = new List<decimal>() {-8m, 8m};
decimal result = list.Sum(x => x);
所以,總而言之,這是令人失望的,我放棄了,因為這是罕見的。
如果列'value'的數據類型是float,那麼你可能遇到的問題是你發送了一個double.NaN到sql server,它不喜歡它。
請注意,像double.TryParse(“NaN”,out dv)之類的調用將很高興返回true並將dv設置為double .NaN
希望這會有所幫助,K。