2016-02-12 102 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'方法:) –

相关问题