由于语法错误,c#windows窗体中的保存功能未完成

时间:2016-03-16 18:31:53

标签: c# visual-studio

我正在努力让这个函数工作,因为它在INSERT INTO语句中不断标记语法错误,但是相同的代码在另一个页面/表单上工作...任何人都可以帮助我吗?

现在似乎也有另一种形式的问题,但是我看不出它有什么问题......

private void btnAssign_Click(object sender, EventArgs e)
{
        string LocID = txtLocID.Text;
        string AssID = txtAssID.Text; // declaing instance names
        string StaID = txtID.Text;
        string Sku = txtSKU.Text;

        if (txtLocID.Text.Length < 1) // validating a text box
        {
            MessageBox.Show("Please Enter an Location ID");
        }
        else if (txtAssID.Text.Length < 1)
        {
            MessageBox.Show("Please Enter an Assignment ID");
        }
        else if (txtID.Text.Length < 1)
        {
            MessageBox.Show("Please Enter a Staff ID");
        }
        else if (txtSKU.Text.Length < 1)
        {
            MessageBox.Show("Please Enter a Product SKU");
        }
        else
        {
            try
            {
                int Loc;
                Cons.ConnectionString = ConnectionDetail.Warehouse;

                OleDbCommand cmds = new OleDbCommand();
                Cons.Open();
                cmds.CommandText = @"Insert into Assign (Location ID, Assign ID, Staff ID, SKU) VALUES (@LocID, @AssID, @StaID, @Sku)";
                cmds.Connection = Cons;

                cmds.Parameters.AddWithValue("LocID", LocID);
                cmds.Parameters.AddWithValue("AssID", AssID);
                cmds.Parameters.AddWithValue("StaID", StaID);
                cmds.Parameters.AddWithValue("Sku", Sku);

                Loc = cmds.ExecuteNonQuery();

                if (Loc > 0)
                    MessageBox.Show("Location has successfully been assigned a product and Saved");
            }
            catch (Exception err)
            {
                MessageBox.Show("error:" + Environment.NewLine + err.Message);
            }
            finally
            {
                if (Cons.State == ConnectionState.Open)
                    Cons.Close();
            }
        }
}

2 个答案:

答案 0 :(得分:3)

当列名包含空格时,需要将它们封装在方括号之间,以避免混淆数据库解析器

cmds.CommandText = @"Insert into Assign ([Location ID], [Assign ID], 
                     [Staff ID], SKU) VALUES (@LocID, @AssID, @StaID, @Sku)";

我还建议避免使用AddWithValue,因为它可能会产生意想不到的副作用请参阅Can we stop using AddWithValue already?

例如: 我想位置ID是一个数字字段(可能是一个整数)。 AddWithValue不知道这一点。它看到一个字符串作为参数值传递。所以参数作为字符串传递。数据库引擎需要将其转换回字段所期望的类型,并且可以正确地完成此转换(可能是从仅包含数字的字符串到整数的简单转换)或者在发生时可能产生无效值很多日期时间值。
最好是明确的

 int locID;
 if(!Int32.TryParse(txtLocID.Text, out locID))
     MessageBox("Not a valid location number!");

 ......
 cmds.Parameters.Add("LocID", OleDbType.Integer).Value = locID;

答案 1 :(得分:1)

INSERT into Assign([Location ID], [Assign ID] ...) values ...

在sql中,如果列/ table / ...名称包含空格或其他特殊字符,则必须将其放在括号中。