SqlDataAdaper 能插入不能更新。更新显示违反主键

今天做的项目需要对表格进行自动更新和增加。以前用到的SqlDataAdaper ,这次打算也使用它。代码完成后,发现不能更新值。显示违反主键。开始怀疑是存储过程的原因。在数据库中直接跑存储过程。却没有问题。又试了若干方法,都报同样的错误。即违反主键。后来度娘了很久都没有找到原因。其中一位网友提示查看datarowstate。才恍悟。原来我以前是直接用dataset装载表格数据。所以状态没有变化。这次是使用了SqlDataReader依次写入DataTable之中。才发生这个情况。原来这时表的行状态都是新增。因此,它需要插入表表格中。所以报错说违反了主键。解决方法是装载完成后,调用DataTable.AcceptChanges();方法。

即:

GetSalerData();这个为DataTable(grid_saler)装载数据。
                    salerTable.AcceptChanges();清除掉插入的状态。
                    grid_saler.DataSource = salerTable;

顺便附上源代码若干。

参数数组:

        private string[] saleTableInsertUpdateParameter = new string[5] { "@salerID", "@name", "@tel", "@mobileTel", "@enable" };
        private string[] saleTabelDeleteParameter = new string[1] { "@salerID" };

声明变量:

 private SqlDataAdapter salerSqladapter = new SqlDataAdapter();
        private SqlCommand salerInsertCommand;
        private SqlCommand salerUpdateCommand;
        private SqlCommand salerDeleteCommand;

这是一个静态方法,主要的作用是构造SqlCommand:

static public SqlCommand SqlProcedureCommandBuilder(string CommandProcedureName,string[] CommandParameter)
        {
            SqlCommand cmd = new SqlCommand(CommandProcedureName);
            cmd.CommandType = CommandType.StoredProcedure;
            if (CommandParameter.Count()>0)
            {
                foreach (var item in CommandParameter)
                {
                    SqlParameter pam = new SqlParameter();
                    pam.ParameterName = item;
                    pam.SourceColumn = item.Substring(1);
                    cmd.Parameters.Add(pam);
                }
            }
            return cmd;
        }

下面是连接字符串。这个字符串是生成的。原因是项目中会连接不同的数据库。

    salerInsertCommand.Connection = new SqlConnection(SQLRepository.WQXTYConncetion);
            salerUpdateCommand.Connection = new SqlConnection(SQLRepository.WQXTYConncetion);
            salerDeleteCommand.Connection = new SqlConnection(SQLRepository.WQXTYConncetion);


            salerSqladapter.InsertCommand = salerInsertCommand;
            salerSqladapter.UpdateCommand = salerUpdateCommand;
            salerSqladapter.DeleteCommand = salerDeleteCommand;

下面是连接的属性。

static public string WQXTYConncetion
        {
            get
            {
                Properties.Settings ps = new Properties.Settings();
                return ps.SQLConnection;
            }
        }

最后是更新的调用的方法。

if (grid_saler.CurrentCell !=null && grid_saler.IsCurrentCellDirty)
                    { WF.MessageBox.Show("请结束编辑!", "提醒", WF.MessageBoxButtons.OK, WF.MessageBoxIcon.Warning); return; }
                    if (salerTable.GetChanges() !=null && salerTable.GetChanges().Rows.Count != 0)
                    {
                        salerSqladapter.Update(salerTable.GetChanges());
                        salerTable.AcceptChanges();
                        WF.MessageBox.Show("更新成功!", "提醒", WF.MessageBoxButtons.OK, WF.MessageBoxIcon.Information);
                        return;
                    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值