2016-02-02 61 views
0

我使用C#代碼將一些值插入到SQL Server中。我在數據庫中創建了RemainingPayment列作爲Decimal(18,2)數據類型,並且還允許爲空。但是,當我從C#執行我的查詢,它抱怨:通過C#代碼向SQL Server插入空(空文本框)值時出錯

附近有語法錯誤,

重要的是要注意,我得到這個錯誤僅適用於具有Decimal(18,2)數據類型RemainingPayment列是很重要的。對於另一個有nvarchar數據類型的列,它工作正常。

這裏是我的代碼:

try 
{ 
    using (SqlConnection con = new SqlConnection(ConStr)) 
    { 
     string query = "INSERT INTO tblExpEntry(RemainingPayment, CHQNo, TransactionID) VALUES (" + tbRemainingPayment.Text + ", '"+tbCHQNo.Text+"', '"+lbl_ID.Text+"')"; 

     using (SqlCommand cmd = new SqlCommand(query,con)) 
     { 
      cmd.CommandType = CommandType.Text; 
      con.Open(); 
      cmd.ExecuteNonQuery(); 

      MessageBox.Show("Transaction Successful.", "Created"); 
      generateTransactionID(); 
     } 
    } 
} 
catch (Exception ex) 
{ 
    MessageBox.Show(ex.Message); 
} 
+3

使用參數,而不是將值填入查詢字符串中。 –

+2

它也有助於避免您看到的錯誤,這些錯誤有時是由於忘記了引號以及您可以創建的所有字符串問題而導致的。這種方法也是一個MASSIVE SQL注入漏洞。 – Lukos

+0

您沒有在代碼中指定'TotalPayment'列。 「RemainingPayment」,「CHQNo」和「TransactionID」列有哪些類型? –

回答

1

您應該使用參數來執行sql命令而不是字符串連接。參數包含一個DataType字段,該字段顯式定義傳遞給數據庫引擎的類型,並且不允許從字符串轉換來引入無效的字符。例如,您的語言環境設置可能會將逗號定義爲分隔符,但數據庫需要一個點。在ToString方法用於文本框值連接到您的字符串的隱式調用產生無效的輸入(和,當然,也是在文本框中缺少值)

使用參數,代碼將出現

decimal remainingPayment; 
if(!decimal.TryParse(tbRemainingPayment.Text, out remainingPayment)) 
{ 
    // Add a message for your user and return, or continue 
    // inserting the default value for a decimal (that's zero) 
} 

using (SqlConnection con = new SqlConnection(ConStr)) 
{ 
    string query = @"INSERT INTO tblExpEntry 
    (RemainingPayment , CHQNo, TransactionID) 
    VALUES(@total, @chq, @transid)"; 

    using (SqlCommand cmd = new SqlCommand(query,con)) 
    { 
     con.Open(); 
     cmd.Parameters.Add("@total", SqlDbType.Decimal).Value = remainingPayment; 
     cmd.Parameters.Add("@chq", SqlDbType.NVarChar).Value = tbCHQNo.Text; 
     cmd.Parameters.Add("@transid", SqlDbType.NVarChar).Value = lbl_ID.Text; 
     cmd.ExecuteNonQuery(); 

     MessageBox.Show("Transaction Successful.", "Created"); 
     generateTransactionID(); 
    } 
} 
+0

當我應用這段代碼時,它說「輸入字符串的格式不正確」,錯誤在哪裏? –

+0

如果您的文本框tbRemainingPayment不包含有效的十進制值,那麼您需要將它與tryParse進行轉換。當我將RemainingPayment文本框留空時,我將更新答案 – Steve

+0

,它會引發輸入字符串格式不正確的錯誤。當我把'在CHQNo文本框中它也會引發相同的錯誤。如果我填寫兩個文本框(使用正確的數據類型值),可以正常工作。錯誤只有當我保持空時 –

1

如果問題是當文本框爲空,那麼這就是你的答案。你只是把tbRemainingPayment.Text放入一個通常會產生...(12.23,'whatever','whatever')的字符串中,但是如果文本框是空白的,你將得到......(,'whatever','whatever ')

將文本值解析爲小數,如果它是空白的,您將得到零而不是文本錯誤。

你應該永遠不要這樣創建SQL的另一個原因!

相關問題