2016-02-12 112 views
-5

我在使用sql server2008存儲數字,百分比等數據庫的winforms上創建一個標記表..但是,我在使用以下代碼時遇到了上述異常錯誤:「真實」附近的語法不正確。關鍵字'where'的語法不正確

private void button1_Click(object sender, EventArgs e) 
     { 
      float a = float.Parse(textBox1.Text); 
      float b = float.Parse(textBox2.Text); 
      float c = float.Parse(textBox3.Text); 
      float d = float.Parse(textBox4.Text); 
      float f = float.Parse(textBox5.Text); 
      float g = (a + b + c + d + f); 
      float h = (g/500) * 100; 
      label11.Text = Convert.ToString((g)); 
      label14.Text = Convert.ToString(h + "%"); 
      label11.Visible = label14.Visible = true; 
      SqlConnection con = new SqlConnection("Data Source=Emmad-PC;Initial Catalog=SchoolManagement;User ID=sa;Password=lenovo"); 
      SqlCommand j =new SqlCommand("Insert into Marksheet(RollNo, English, Math, Science, PSt, Islamiat, Total, Percentage) where values(@ROLL NO, @English, @Math, @Science, @Pakistan Studies, @Islamiat, @Total, @Percentage",con); 
      j.Parameters.AddWithValue("@ROLL NO",float.Parse(textBox6.Text)); 
      j.Parameters.AddWithValue("@English", float.Parse(textBox1.Text)); 
      j.Parameters.AddWithValue("@Math", float.Parse(textBox2.Text)); 
      j.Parameters.AddWithValue("@Science", float.Parse(textBox3.Text)); 
      j.Parameters.AddWithValue("@Pakistan Studies", float.Parse(textBox4.Text)); 
      j.Parameters.AddWithValue("@Islamiat", float.Parse(textBox5.Text)); 
      j.Parameters.AddWithValue("@Total",Convert.ToString(label11.Text)); 
      j.Parameters.AddWithValue("@Percentage",Convert.ToString(label14.Text)); 

      con.Open(); 
      j.ExecuteNonQuery(); 
      con.Close(); 
     } 

您的建議將是非常可觀的:)

+0

正如其他人所說的,你應該刪除'where',你寫什麼意圖? – HoneyBadger

+0

除了其他意見,你還有其他一些問題在這裏。首先是你的桌子看起來非常不規範。其次是你正在使用花車存儲成績。浮點數據類型是近似值,在精確值很重要時不應使用。在這種情況下,int或numeric可能是更好的選擇。最後但並非最不重要的一點是,您的Total列應該是一個計算列,因此您不會將該值與其他列值不同步。 –

回答

0

刪除WHERE關鍵字,這是不正確在INSERT語句中使用它。

3

多個事情不對的查詢:

Insert into Marksheet 
    (RollNo, English, Math, Science, PSt, Islamiat, Total, Percentage) 
where values 
    (@ROLL NO, @English, @Math, @Science, @Pakistan Studies, @Islamiat, @Total, @Percentage 
  1. 您有沒有理由額外WHERE關鍵字。 (刪除它)
  2. 可能在這些列名稱中使用一些保留字。 (將它們包含在[]中以明確將它們定義爲標識符而不是關鍵字)
  3. 您的參數名稱中有空格。 (刪除它)
  4. 您沒有關閉圓括號。 (關閉它)

這裏:

INSERT INTO [Marksheet] 
    ([RollNo], [English], [Math], [Science], [PSt], [Islamiat], [Total], [Percentage]) 
VALUES 
    (@ROLLNO, @English, @Math, @Science, @PakistanStudies, @Islamiat, @Total, @Percentage) 

,當然,更新參數,增加線校正參數名:

j.Parameters.AddWithValue("@ROLLNO",float.Parse(textBox6.Text)); 
j.Parameters.AddWithValue("@PakistanStudies", float.Parse(textBox4.Text)); 

更多的建議,而我們關於這個問題:

  1. AddWithValue()工程,但isn't always the best idea。它依賴於系統爲你確定類型,並不總是正確的。在添加參數時顯式設置類型的bug可能性較小。
  2. float.Parse()根據用戶輸入有例外的可能性。在嘗試在數據庫交互中使用它們之前,首先使用float.TryParse()解析值。一旦它們被成功解析,然後移動到代碼的數據庫部分。
  3. (嗯,「2A。」實際上......)你正在分析兩次的值,並且由於某種原因而忽略了第一個變量。
  4. 利用using聲明來附上任何IDisposable對象的用法。 (在這種情況下,主要是您的SqlConnection對象)。由於它會生成finally塊並且爲您處理關閉/處置連接,因此出錯和資源泄漏的風險較低。
  5. 您無需撥打Convert.ToString()就可獲得string值。它已經是一個字符串了。
+1

另外'AddWithValue'不應該被使用,因爲[它*可能*有時會產生意想不到的結果](http://blogs.msmvps.com/jcoehoorn/blog/2014/05/12/can-we-stop- using-addwithvalue-already /) –

+1

@SonerGönül:確實,在這種情況下,顯式打字可能也是一個好主意。 – David

+1

不要忘記提及使用''語句來自動處理連接和命令,而不是手動調用'Close'方法:) –

相關問題