2014-03-03 47 views
3

我們有一個奇怪的問題,使用SqlCommand將數據插入到SQL Server數據庫中。如果我們嘗試將大文本插入到konnotiz1列中,則文本將在43245個字符後截斷。出於某種原因,我不明白真正的應用程序代碼會創建42909個字符。正在截斷文本插入到SQL Server數據庫中

這裏的列屬性頁面的截圖:

SQL-Server Management Studio propertypage

下面的代碼引起該問題:

static void Test() 
{ 
    using (System.Data.SqlClient.SqlConnection con = new System.Data.SqlClient.SqlConnection(getConString())) 
    { 
     con.Open(); 
     System.Data.SqlClient.SqlCommand cmd = con.CreateCommand(); 
     cmd.CommandText = "Insert into kontakte (konlfdnr, konNotiz1) values (@konlfdnr, @konNotiz1)"; 
     cmd.CommandType = CommandType.Text; 
     cmd.CommandTimeout = 60; 

     // you can ignore this param, it's owner pk-column. 
     System.Data.SqlClient.SqlParameter param = cmd.Parameters.Add("@konlfdnr", SqlDbType.Char, 10); 

     // better don't ask why we have to pad this... ;) 
     param.Value = "1".PadLeft(10); 
     param.Direction = ParameterDirection.Input; 

     param = cmd.Parameters.Add("@konNotiz1", SqlDbType.Text); 
     param.Direction = ParameterDirection.Input; 
     param.Value = getParamValue(); 

     cmd.ExecuteNonQuery(); 
     con.Close(); 
    } 
} 

private static string getParamValue() 
{ 
    // my Textfile has something about 300000 characters. It's a html code from a mail. 
    return System.IO.File.ReadAllText("C:\\Temp\\insert.txt"); 
} 

private static string getConString() 
{ 
    return @"Data Source=NB-JH1\SQLEXPRESS;Initial Catalog=Testsystem_Local;Integrated Security=True;Encrypt=True;TrustServerCertificate=True;Pooling=True;MultipleActiveResultSets=True; 
} 

有沒有人一個想法,爲什麼文本正在被截斷,以及我們如何可以得到這個工作?

+0

This [article](http://www.mssqltips.com/sqlservertip/2857/silent-truncation-of-sql-server-data-inserts/)會更好地啓發你。 – chridam

+0

你指定了參數的大小嗎?文本最多可容納2.1G字節 –

+0

數據加載完成後,您如何測量長度? –

回答

1

您的問題似乎在SQL Server Management Studio中是一個限制,而不是在數據庫中。 Here是一個關於該問題的錯誤報告,聲稱該錯誤已在最新版本中得到修復(我不知道這是否屬實)。有建議here的解決方法。我沒有親自嘗試過。

您應該使用len()函數(或類似的東西)測試長度。這會讓你知道是否所有的數據都在那裏。

我已經在數據庫中使用了非常長的字符串,在表,變量和存儲過程之間來回傳遞它們,以便數據庫可以處理字符串。問題在於提取它們的界面。

+0

如果我通過代碼讀取數據,結果不會改變。所以這不是管理工作室的限制。但是,thx。爲你的提示。 –

0

首先,Text是一個過時的sql數據類型。改用varchar(max)。 我會嘗試改變字段的類型和參數的類型。

這不會一定解決這個問題 - 但它消除(這是什麼導致了問題),這是一個很好的做法太(不使用棄用的功能)一個很好的可能性

+0

1)文字是_deprecated_,沒有過時 - 它仍然被支持,2)因爲它們是相同的,它可能贏了; t解決了這個問題。 –

+0

1.接受。 2.它們在功能上是等價的,但不是通過實現 - 因此,將類型更改爲不被棄用的類型是一個很好的建議,也許(不是肯定),它甚至可以解決問題...我應該寫這個。但忘了,因爲我是從手機寫的。 –

+0

不幸的是我無法更改數據類型。它現在已經使用了很多年,並被運送到許多客戶。我們軟件的某些部分是用VisualFoxPro編寫的,也許這就是他們決定使用這種類型的原因。 –

相關問題