2016-10-26 56 views
0

我正在使用SQL Server數據庫,並且有一個名爲Cell(VARCHAR)數據類型的列。在使用reader.Read()進行閱讀時,出現轉換錯誤。任何人都可以善意解釋錯誤的原因嗎?varchar值'5566778891'的轉換溢出了一個int列

這是我的代碼:

string myConnection = dbController.connectionString; 
     string query1 = "SELECT ID, Name from Manager Where Cell = " + managerNo.Text; 
     using (var conn = new SqlConnection(myConnection)) 
     using (var cmd = new SqlCommand(query1, conn)) 
     { 
      conn.Open(); 
      SqlDataReader reader = cmd.ExecuteReader(); 

      while (reader.Read()) 
      { 
       managerID = reader.GetString(0); 
       mgrID.Text = managerID; 
       managerNames.Text = reader.GetString(1); 
      } 
      conn.Close(); 
     } 

我讀從一個文本框(managerNo)的值。我已經測試了SQL Server Management Studio中的查詢操作:

select Name, DOB 
from Contact 
where Cell = 1233453411 

當我使用Cell = 1233453411不作爲字符串我得到的轉換誤差值,但是使用Cell = '1233453411'作爲字符串結果是牽強。

這是什麼原因以及如何解決這個問題。

謝謝。

+0

什麼Manager.Cell的數據類型? –

+0

@DourHighArch其varchar(最大) – EL323

+0

您的查詢需要在'managerNo.Text'周圍添加引號 - 就像您手動運行查詢時一樣。但是,您的代碼非常容易受到SQL注入的影響,您應該調查。 – Rob

回答

3

這是兩種不同類型的,一個字符串和一個整數之間的比較:

where Cell = 1233453411 

SQL Server必須決定要使用哪種類型。它決定更嚴格的類型,即數字。所以,字符串被轉換爲一個數字。

說,你有一個在紐約的手機號碼是:917-555-5555。那麼,這就變成了一個數字,如9,175,555,555,這超過了最大整數的值。因此,你會得到一個轉換溢出。

道德:進行比較時總是使用類似的類型。

編輯:

你應該怎麼做?請勿將電話號碼存儲爲號碼;它們應該作爲字符串存儲(例如,前導零可能很重要)。

如果可以做一個快速和骯髒,並把單引號圍繞參數的值。但是,你應該真的做的是改變你的SQL代碼使用一個字符串類型的參數。將值(特別是用戶輸入)填充到查詢字符串中是不好的編程。

+0

所以我應該將數據類型更改爲int或bigint,對嗎? – EL323

+0

@ EL323。 。 。不,將類型更改爲字符串,因爲這是該列的存儲方式。 –

0

您的代碼工作正常SQL Server 2008 R2。 (下面是測試代碼)

私人無效的button1_Click(對象發件人,EventArgs的) {

 string str = "Server=.\\SQL2008R2;Database=Practice;User ID=sa;Password=123;Trusted_Connection=True;Connection Timeout=0"; 

     string query1 = "SELECT * from tblTest Where Cell = " + textBox1.Text; 
     using (var conn = new SqlConnection(str)) 
     using (var cmd = new SqlCommand(query1, conn)) 
     { 
      conn.Open(); 
      SqlDataReader reader = cmd.ExecuteReader(); 

      while (reader.Read()) 
      { 

       string aa = reader.GetString(0); 
      } 
      conn.Close(); 
     } 

否則使用可以改變您查詢像在下面的格式。

string query1 = "SELECT * from tblTest Where Cell = '" + textBox1.Text + "' "; 

感謝

相關問題