如何解决此查询错误

时间:2016-05-19 23:58:34

标签: c# winforms ms-access

如何让此查询生效?不断收到此错误:

  

" INSERT INTO语句中的语法错误"

我很困惑,因为它曾经在另一个程序上工作,但我全都搞砸了这个。

 string item = listView1.Items[listView1.FocusedItem.Index].Text;
 MessageBox.Show(item); //test Value

 string thisDay1 = DateTime.Now.ToString();

 ad.InsertCommand = new OleDbCommand("INSERT INTO Scrap-Rework Master Data (Is_today, S_Line, Status, T_Number, Test_Cp, think_a, Rew_Hos, QAffect, Comments) 
    values (?, ?, ?, ?, ?, ?, ?, ?, ?)", con);

ad.InsertCommand.Parameters.AddWithValue("@S_Line", OleDbType.VarChar).Value = textBox1.Text;
ad.InsertCommand.Parameters.AddWithValue("@Status", OleDbType.VarChar).Value = domainUpDown1.Text;
ad.InsertCommand.Parameters.AddWithValue("@T_Number", OleDbType.VarChar).Value = textBox2.Text;
ad.InsertCommand.Parameters.AddWithValue("@Test_Cp", OleDbType.VarChar).Value = item;
ad.InsertCommand.Parameters.AddWithValue("@think_a", OleDbType.VarChar).Value = domainUpDown2.Text;
ad.InsertCommand.Parameters.AddWithValue("@Rew_Hos", OleDbType.Numeric).Value = Double.Parse(textBox4.Text);
ad.InsertCommand.Parameters.AddWithValue("@QAffect", OleDbType.Numeric).Value = int.Parse(textBox3.Text);
ad.InsertCommand.Parameters.AddWithValue("@Comments", OleDbType.VarChar).Value = textBox5.Text;
ad.InsertCommand.Parameters.AddWithValue("@Is_today", OleDbType.DBTime).Value = thisDay1;

Listview有两列:

ListViewItem listitem = new ListViewItem(dr["Test_Cp"].ToString());
 listitem.SubItems.Add(dr["Description"].ToString());

访问数据库和类型字段:

S_Line          -Short Text;    
Status          -Short Text;    
T_Number        -Short Text;    
Test_Cp         -Short Text;    
think_a         -Short Text;    
Rew_Hos         -Number;    
QAffect         -Number;    
Comments        -Long Text;    
Is_today        -Date/Time;

提前非常感谢你。

3 个答案:

答案 0 :(得分:1)

首先,您必须始终使用方括号[]作为查询中包含空格的名称,例如[Scrap-Rework Master Data]

2-声明OleDbCommand参数。

3-按顺序将Parameters的名称放入查询中。

4-格式DateTime字段。

为插入数据添加cmd.ExecuteNonQuery();

string item = listView1.Items[listView1.FocusedItem.Index].Text;
MessageBox.Show(item); //test Value

OleDbCommand cmd = new OleDbCommand("INSERT INTO [Scrap-Rework Master Data] (S_Line, Status, T_Number, Test_Cp, think_a, Rew_Hos, QAffect, Comments, Is_today)" +
                                     "values(@S_Line, @Status, @T_Number, @Test_Cp, @think_a, @Rew_Hos, @QAffect, @Comments, @Is_today)", con);

cmd.Parameters.AddWithValue("@S_Line", textBox1.Text);
cmd.Parameters.AddWithValue("@Status", domainUpDown1.Text);
cmd.Parameters.AddWithValue("@T_Number", textBox2.Text);
cmd.Parameters.AddWithValue("@Test_Cp", item) ;
cmd.Parameters.AddWithValue("@think_a", domainUpDown2.Text);
cmd.Parameters.AddWithValue("@Rew_Hos", Double.Parse(textBox4.Text)) ;
cmd.Parameters.AddWithValue("@QAffect", int.Parse(textBox3.Text)) ;
cmd.Parameters.AddWithValue("@Comments", textBox5.Text) ;
cmd.Parameters.AddWithValue("@Is_today", DateTime.Now.ToString("#yyyy/MM/dd#"));

cmd.ExecuteNonQuery();

答案 1 :(得分:1)

您正在使用OleDB,因此can't use named parameters

  

System.Data.OleDb   使用由问号(?)表示的位置参数标记。

表示(来自同一页面)

  

因此,Parameter对象添加到Parameters集合的顺序必须直接对应于?的位置?参数的占位符。

问题是您的订单错误:INSERT中的第一个值是Is_Today,但这是您添加到参数数组的最后一个值。因此所有的价值类型都是错误的。尝试移动

ad.InsertCommand.Parameters.AddWithValue("@Is_today", OleDbType.DBTime).Value = thisDay1;

到参数添加列表的头部。

此外,我同意abrown's comment:您可能需要将表名[Scrap-Rework Master Data]括起来,因为它有空格和短划线。

答案 2 :(得分:0)

尝试在DB中使用存储过程:

using (var command1 = new SqlCommand("InsertData", conn)
{
    CommandType = CommandType.StoredProcedure
})
{
    command1.Parameters.Add("@a1", SqlDbType.Text).Value = A1;
    command1.Parameters.Add("@a2", SqlDbType.Text).Value = A2;
    command1.Parameters.Add("@a3", SqlDbType.Text).Value = A3;
    command1.Parameters.Add("@a4", SqlDbType.Text).Value = A4;

    command1.ExecuteNonQuery();
}