【发布时间】:2017-12-07 12:23:08
【问题描述】:
我有两个表,我正尝试使用我的 C# 应用程序将数据插入其中。它们与ID有关。
我已经阅读了一些关于如何执行此操作的问题,但没有一个有效,我现在决定将它们作为单独的 sql 查询来执行。
private void btnSave_Click(object sender, EventArgs e)
{
//table 1
String acctCode = tbAcctCode.Text;
String address1 = tbAdd1.Text;
String address2 = tbAdd2.Text;
String address3 = tbAdd3.Text;
String balance = tbBalance.Text;
String yearSales = tbSales.Text;
String yearCost = tbCost.Text;
//table 2
String date = tbDate.Text;
String transaction = tbTrans.Text;
String docNum = tbDocNum.Text;
String grossVal = tbGross.Text;
String vatVal = tbVat.Text;
//SQL statement set to Add a new value
sql = String.Format("INSERT INTO "+ table1 + "(Account_Code,Address1,Address2,Address3,Balance,Sales_Year_To_Date,Cost_Year_To_Date) " +
"VALUES " +
"('{0}'," + "{1}," + "{2}," + "'{3}'," + "'{4}'," + "{5}," + "'{6}');", acctCode, address1, address2, address3, balance, yearSales, yearCost);
sql2 = String.Format("INSERT INTO " + table2 + "(Date,Transaction_Type,Document_No,Gross_Transaction_Value,Vat_Value) " +
"VALUES " +
"('{0}'," + "'{1}'," + "'{2}'," + "'{3}'," + "'{4}');", date, transaction, docNum, grossVal, vatVal);
try
{
dbConn = new OleDbConnection(conString);
dbCmd = new OleDbCommand(sql, dbConn);
dbConn.Open();
dbCmd.ExecuteNonQuery();
dbCmd = new OleDbCommand(sql2, dbConn);
dbCmd.ExecuteNonQuery();
}
catch (SqlException E)
{
MessageBox.Show(E.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
finally
{
dbConn.Close();
}
}
}
数据被插入到第一个表中,但问题出现在 sql2 的 OleDbCommand 中。 "它抛出 System.Data.OleDb.OleDbException: 'INSERT INTO 语句中的语法错误。'"
我感觉我的 sql 语法有问题,但我没发现。
【问题讨论】:
-
“我感觉我的 sql 语法有问题,但我没发现。” 是的,你不使用 sql 参数 ;-)跨度>
-
执行前
sql2的值是多少? -
这是执行前的 sql2。 "INSERT INTO Debtors_Transaction_File(Date,Transaction_Type,Document_No,Gross_Transaction_Value,Vat_Value) VALUES ('2017/12/06','EFT','6','150','50');"
-
正如@TimSchmelter 指出的那样,您应该使用参数化查询来减少 SQL 注入攻击的可能性并在适当的情况下转义文本。它还将使您的查询在代码中更易于阅读。见msdn example。您也无需将字符串格式参数连接在一起(这会降低可读性)。
-
日期是保留字?但一定要使用参数,最后的分号也是不必要的。