获取异常','附近的语法不正确。在C#中

时间:2017-11-02 10:51:52

标签: sql sql-server winforms

我在C#中遇到错误,我在使用int,date,float,varchar数据类型

按照命令

con.Open();
string cb = "insert into tran1(tno,billno,Tdate,Acno,SubTotal,TaxPer,Discountper,DiscountAmt,TaxAmount,GrandTotal,UserId,Remarks,cash,change)values(" + txtTno.Text + ",'" + txtBillNo.Text + "',"+dtpBillDate.Text+","+txtACNO.Text+","+txtSubTotal.Text+","+txtTaxPer.Text+","+txtDiscountPer.Text+","+txtDiscountAmount.Text+","+txtTaxAmt.Text+","+txtTotal.Text+","+txtUserId.Text+",'"+txtNarr.Text+"',"+txtCash.Text+",'"+txtChange.Text+"')";
cmd = new SqlCommand(cb);
cmd.Connection = con;
cmd.ExecuteReader();
if (con.State == ConnectionState.Open)
{
    con.Close();
}
con.Close();

2 个答案:

答案 0 :(得分:2)

您的SQL语句中的参数缺少引号... 例如;

values (" + txtTno.Text + ",

只会做

values ( Whatever ,

应该是

values ('" + txtTno.Text + "',

给出正确的;

values ('Whatever',

然而正如其他人在评论中所说的那样不要这样做 - 而是使用SQL参数,因为这样既不容易出错,也更容易阅读,并且可以让您免于SQL注入等令人讨厌的事情。

这看起来像;

values ( @txtTno ,

然后

cmd.Parameters.AddWithValue("@txtTno", txtTno.Text);

答案 1 :(得分:1)

错误的原因是你连接了'周围应该有Date个标记的值,如INSERT/DELETE/UPDATE s。您可以通过使用参数来解决此问题,但我建议您执行以下所有操作:

  1. 如果您正在执行ExecuteNonQuery之类的非查询操作,请使用{strong>非 ExecuteReader,这是用于从查询中读取结果的。
  2. 始终在查询中使用参数而不是字符串连接。它可以防止sql注入,并确保您永远不会遇到包含转义字符的字符串的问题。
    • 参数是价值占位符
    • 当您添加参数的值时,它应该与架构中的类型匹配,因此对于日期使用System.DateTime,对int使用int,对{{1}使用string } / varchar等。
    • 始终指定nvarchar
    • 如果适用,请指定长度
  3. 除非必须,否则尽量不要重复使用连接。主要原因是您通常希望尽快关闭连接,如果您有多个可以在数据驱动的同时发生的事件/操作,它将在以后防范可能的竞争条件。
  4. 尽快关闭您的连接,这样您就没有开放的外部资源。
  5. 确保1和2出现在SqlDbType块中包裹IDisposable类型。
  6. 将您的连接字符串添加到usingapp.config并使用web.config检索它(需要对程序集System.Configuration.ConfigurationManager.ConnectionStrings["name-here"].ConnectionString 的引用)
  7. 代码

    System.configuration