【问题标题】:OledbCommandBuilder Syntax error in insert into Statement c#?插入语句 c# 中的 OledbCommandBuilder 语法错误?
【发布时间】:2013-01-20 12:59:09
【问题描述】:

我知道这个问题已经被问过一百次了,而且我都看了一遍,不知道出了什么问题。 这是访问中的表:

tbl_Slip

SlipNo*,
EmpID,
ScaleID,
Month-Year,
RaiseBasic,
OtherDed,
Tax,
Arrears,
Notes,

所有字段都是整数类型,除了月-年和注释是文本。

现在是 C# 部分: 这是我使用的代码。 我试图找出错误,所以制作了一个带有硬编码值的按钮。

(oledbConnection 工作正常。我用它在表单上显示数据)

我用这个函数链接到 tbl_Slip。

    private void linkToSlip()
    {
        con.Open();

        string sqlRecords = "Select * FROM tbl_Slip ORDER BY SlipNo";
        SlipDA = new OleDbDataAdapter(sqlRecords, con);
        SlipDA.Fill(SlipDS, "Slip");

        // Primary key so DataTable.Rows.Find[] can be used
        SlipDS.Tables["Slip"].PrimaryKey = new DataColumn[] { SlipDS.Tables["Slip"].Columns["SlipNo"] };
        maxSlipRows = SlipDS.Tables["Slip"].Rows.Count;

        dataGrid_Slip.DataSource = SlipDS;
        dataGrid_Slip.DataMember = "Slip";

        con.Close();
    }

这是表单加载部分:

    private void frm_Slip_Load(object sender, EventArgs e)
    {
        SlipDS = new DataSet();
        createcon();
        linkToSlip();
    }

(createcon是我用来连接数据库的函数)

这是按钮代码:

    private void button1_Click(object sender, EventArgs e)
    {
        OleDbCommandBuilder saveCB = new OleDbCommandBuilder(SlipDA);

        DataRow dR = SlipDS.Tables["Slip"].NewRow();

        dR[0] = Convert.ToInt32("2");
        dR[1] = Convert.ToInt32("1");
        dR[2] = Convert.ToInt32("1");
        dR[3] = "January-2013";
        dR[4] = Convert.ToInt32("15");
        dR[5] = Convert.ToInt32("20");
        dR[6] = Convert.ToInt32("2");
        dR[7] = Convert.ToInt32("223");
        dR[8] = "notes";

        SlipDS.Tables["Slip"].Rows.Add(dR);
        saveCB.DataAdapter.Update(SlipDS.Tables["Slip"]);
        maxSlipRows++;
    }

当我按下按钮时,给出的错误是

INSERT INTO 语句中的语法错误。

我不知道是什么问题。我检查了重复,我检查了数据是否保存在 SlipDS.Tables["Slip"] (IT WAS) 中。我想不出别的了。

怎么了?

【问题讨论】:

  • 您知道dR[0] = Convert.ToInt32("2");dr[0] = 2; 相同,只是使用了更多的单词和运行时间?
  • 是的,但我尝试了一切可以让它发挥作用的方法!!!

标签: c# ms-access dataset oledb


【解决方案1】:

快速回答:不要使用OleDbCommandBuilder。手动创建一个OleDbCommand 作为INSERT INTO ... (...) VALUES (...) 并使用参数化查询。然后,适当添加参数。

您必须向我们展示INSERT 声明,以便我们知道它有什么问题。

【讨论】:

  • 我写了一个简单的代码来插入值并且它工作但你能告诉我为什么我的第一个方法失败了。我在其他表单上使用了 Oledbcommandbuilder 并且它有效???另外为什么我应该使用参数而不是仅仅在语句中提供值?​​??谢谢
  • 为什么要使用参数??嗯,类型安全、SQL 注入等等……不如使用 SO 搜索功能看看如何让它发挥作用?这个问题已经被问过很多次了。
【解决方案2】:

我敢打赌,无效命令的问题是您的字段名称中有一个连字符,并且可能没有正确创建并被解释为

insert into tbl_Slip ( EmpID, ScaleID, Month-Year, ...

使用带有空格和/或连字符的列是个坏主意。是的,数据库允许这样做,但你不必仅仅因为你可以就自取其辱。

【讨论】:

  • 您可以通过设置列名分隔符来处理这个问题:saveCB.QuotePrefix = "["; cb.QuoteSuffix = "]";
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-10
  • 2012-04-07
  • 1970-01-01
  • 2014-05-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多