无法更新访问数据库

时间:2017-03-26 12:28:13

标签: c#

这是我的项目类添加按钮方法

2 * 3 * 4* 1

thismy CLSItems Class

private void btnEdit_Click(object sender, EventArgs e)
{
    BL.CLSItems itemsADE = new BL.CLSItems();

    try
    {
        itemsADE.EditItem(Convert.ToInt32(itemId.Text), 
        itemBarcode.Text, itemName.Text, itemGroup.Text, 
        itemCompany.Text, itemPlace.Text, 
        Convert.ToInt32(itemPrice.Text), 
        Convert.ToInt32(itemquantity.Text), 
        Convert.ToInt32(itemLimit.Text), 
        Convert.ToInt32(itemMaxDiscount.Text), 
        Convert.ToInt32(itemprofit.Text));
        MessageBox.Show("تم تعديل البيانات بنجاح", "تعديل", MessageBoxButtons.OK, MessageBoxIcon.Information);
        dataGridRefresh();
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message, "خطأ", MessageBoxButtons.OK, MessageBoxIcon.Error);
    }
    finally
    {
        connection.Close();
    }
}

这是我的DataAccessLayer类

public void EditItem(int itemId, string itemBarcode, 
     string itemName, string itemGroup, string itemCompany, 
     string itemPlace, int itemPrice, int itemquantity, 
     int itemLimit, int itemMaxDiscount, int itemprofit)
{
    DAL.DataAccessLayer Dal = new DAL.DataAccessLayer();

    Dal.open();
   string procedure = @"update Items
       (itemBarcode,itemName,itemGroup,itemCompany,
        itemPlace,itemPrice,itemquantity,itemLimit,itemMaxDiscount,
        itemprofit)values
       (@itemBarcode,@itemName,@itemGroup,@itemCompany,
        @itemPlace,@itemPrice,@itemquantity,@itemLimit,@itemMaxDiscount,
        @itemprofit) where itemId=@itemId";

    //string procedure = @"update Items set 
    //itemBarcode=@itemBarcode, itemName=@itemName,  
    //itemGroup=@itemGroup, 
    //itemCompany=@itemCompany, itemPlace=@itemPlace,        
    //itemPrice=@itemPrice, 
    //itemquantity=@itemquantity, itemLimit=@itemLimit, 
    //itemMaxDiscount=@itemMaxDiscount, itemprofit=@itemprofit 
    //where itemId=@itemId ";

    OleDbParameter[] param = new OleDbParameter[11];
    param[0] = new OleDbParameter("@itemBarcode", OleDbType.VarChar);
    param[0].Value = itemBarcode;
    param[1] = new OleDbParameter("@itemName", OleDbType.VarChar);
    param[1].Value = itemName;
    param[2] = new OleDbParameter("@itemGroup", OleDbType.VarChar);
    param[2].Value = itemGroup;
    param[3] = new OleDbParameter("@itemCompany", OleDbType.VarChar);
    param[3].Value = itemCompany;
    param[4] = new OleDbParameter("@itemPlace", OleDbType.VarChar);
    param[4].Value = itemPlace;
    param[5] = new OleDbParameter("@itemPrice", OleDbType.Integer);
    param[5].Value = itemPrice;
    param[6] = new OleDbParameter("@itemquantity", OleDbType.Integer);
    param[6].Value = itemquantity;
    param[7] = new OleDbParameter("@itemLimit", OleDbType.Integer);
    param[7].Value = itemLimit;
    param[8] = new OleDbParameter("@itemMaxDiscount", OleDbType.Integer);
    param[8].Value = itemMaxDiscount;
    param[9] = new OleDbParameter("@itemprofit", OleDbType.Integer);
    param[9].Value = itemprofit;
    param[10] = new OleDbParameter("@itemId", OleDbType.Integer);
    param[10].Value = itemId;
    Dal.excuteCommand(procedure, param);
    Dal.close();
}

问题是当我尝试更新我的访问数据库时,我收到此消息

  

输入字符串的格式不正确

有什么问题?在我的代码? 在我的数据库中?

public void excuteCommand(string procedure,OleDbParameter[] param)
{
    OleDbCommand command = new OleDbCommand();
    command.CommandType = CommandType.Text;
    command.CommandText = procedure;
    command.Connection = accessConnection;
    if (param!=null)
    {
        command.Parameters.AddRange(param);
    }
    command.ExecuteNonQuery();
}

我使用了这个陈述和同样的问题

itemId/int,itemBarcode/Text ,itemName/Text,itemPlace/Text ,itemPrice/currency,itemquantity/int,itemLimit/int,itemMaxDiscount/int,itemprofit/currency 

2 个答案:

答案 0 :(得分:0)

update Items(...) values (....) 

不是正确的SQL更新语法。 (我认为您对insert语法感到困惑?)

正确的语法是您注释掉的:

update Items 
set 
itemBarcode=@itemBarcode, 
itemName=@itemName, 
itemGroup=@itemGroup, 
itemCompany=@itemCompany, 
itemPlace=@itemPlace, 
itemPrice=@itemPrice, 
itemquantity=@itemquantity, 
itemLimit=@itemLimit, 
itemMaxDiscount=@itemMaxDiscount, 
itemprofit=@itemprofit 
where itemId=@itemId

答案 1 :(得分:0)

您正在将大量变量传递给EditItem方法,并且您在输入文本框上盲目地调用Convert.ToInt32。但是,如果这些文本框中的任何一个包含无法转换为整数的值,则会出现无效字符串格式异常。
(例如,空白输入是无效的整数并触发异常)

您应该使用Int32.TryParse

检查输入是否有效为整数
int id;
if(!Int32.TryParse(itemId.Text, out id))
{
    MessageBox.Show("Invalid input for ID field! Please write a valid integer");
    return;
}
int price;
if(!Int32.TryParse(itemPrice.Text, out price))
{
    MessageBox.Show("Invalid input for the price field! Please write a valid integer");
    return;
}
.... and so on for all integer values


itemsADE.EditItem(id,itemBarcode.Text, itemName.Text, itemGroup.Text, 
                  itemCompany.Text, itemPlace.Text, 
                  price, ......);

最后的笔记。

UPDATE语句需要以下语法:

UPDATE <tablename> SET <fieldname> = <value> WHERE <keyfield> = <keyvalue>

您确定要使用整数类型的价格字段吗?通常这些字段使用十进制数据类型定义,以正确处理货币值。