【问题标题】:Inserting data into a related database. C#将数据插入相关数据库。 C#
【发布时间】: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。您也无需将字符串格式参数连接在一起(这会降低可读性)。
  • 日期是保留字?但一定要使用参数,最后的分号也是不必要的。

标签: c# sql ms-access


【解决方案1】:
Try This Would Be Prefect

private void btnSave_Click(object sender, EventArgs e)
{
    //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 " + (@acctCode, @address1, @address2, @address3, @balance, @yearSales, @yearCost));

        sql2 = String.Format("INSERT INTO " + table2 + "([Date],Transaction_Type,Document_No,Gross_Transaction_Value,Vat_Value)" +
                             "VALUES " + (@date, @transaction, @docNum, @grossVal, @vatVal));


        try
        {
            dbConn = new OleDbConnection(conString);
            cmd = new OleDbCommand(sql, dbConn);

            //table 1
            cmd.Parameters.AddWithValue("@acctCode", tbAcctCode.Text);
            cmd.Parameters.AddWithValue("@address1", tbAdd1.Text);
            cmd.Parameters.AddWithValue("@address2", tbAdd2.Text);
            cmd.Parameters.AddWithValue("@address3", tbAdd3.Text);
            cmd.Parameters.AddWithValue("@balance", tbBalance.Text);
            cmd.Parameters.AddWithValue("@yearSales", tbSales.Text);
            cmd.Parameters.AddWithValue("@yearCost", tbCost.Text);

            dbConn.Open();
            cmd.ExecuteNonQuery();
            cmd = new OleDbCommand(sql2, dbConn);

            //table 2
            cmd.Parameters.AddWithValue("@date", tbDate.Text);
            cmd.Parameters.AddWithValue("@transaction", tbTrans.Text);
            cmd.Parameters.AddWithValue("@docNum", tbDocNum.Text);
            cmd.Parameters.AddWithValue("@grossVal", tbGross.Text);
            cmd.Parameters.AddWithValue("@vatVal", tbVat.Text);

            cmd.ExecuteNonQuery();
        }
        catch (SqlException E)
        {
            MessageBox.Show(E.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
        finally
        {
            dbConn.Close();
        }
    }

【讨论】:

  • 而不是 "dbCmd = new OleDbCommand(sql2, dbConn)" 你可以更好地使用 "dbCmd.CommandText = sql2;"
  • 您是否检查过第二个表中名为“日期”的字段名称是否存在问题?
  • 这是我在第一个参数上得到的——“System.NullReferenceException:'对象引用未设置为对象的实例。' cmd 为空”
  • 通过我发布的编辑它可以工作,但现在我回到原来的错误,我得到 System.Data.OleDb.OleDbException: 'Syntax error in INSERT INTO statement.'" 从我的原始问题。
  • 刚刚尝试创建一个虚拟数据库。这是日期字段。您应该用方括号括起来,因为 Date 是保留关键字。使用 [日期]
猜你喜欢
  • 1970-01-01
  • 2013-06-06
  • 2012-08-21
  • 2018-07-04
  • 2017-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-11
相关资源
最近更新 更多