今天做的项目需要对表格进行自动更新和增加。以前用到的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;
}