今天在使用.net 的数据适配器操作数据库记录(添加、删除、编辑)时出现了一些问题,然后通过一陈子查阅发现了一些值得注意的地方。
1。对于“不返回任何键列信息的 SelectCommand 不支持 UpdateCommand 的动态 SQL 生成”问题的解决
出现这样的错误,原因在于操作的表没有主键。所以SqlCommandBuilder无法为SqlDataAdapter自动生成需要的UpdateCommand。修改表的定义加一个主键就可以解决此类问题;
2。当传递具有已修改的DataRow集合时,更新要求有效的UpdateCommand
出现这样的提示, 一般是这样的,如果用设计器将SqlDataAdapter拖到页面中使用时,不会出现这种情况,因为系统会自动生成SqlDataAdapter的属性命令,比如: .UpdateCommane insertCommand selectCommand等。 但是有些程序员不喜欢用设计器,或者是有些地方没必要拖动 OleDbDataAdapter oleDapter = new OleDbDataAdapter();
//OleDbCommandBuilder oleBuilder = new OleDbCommandBuilder(oleDapter);
oleDapter.SelectCommand = new OleDbCommand("select * from FH where id='" + DataView.Rows[DataView.CurrentRow.Index].Cells[0].Value+"'", oleConn);
DataSet DS = new DataSet();
oleDapter.Fill(DS, "FH");
SqlDataAdapter这么个庞大物来实现,那么SqlDataAdapter就不会自动生成相关的查询或更新
语句了. 所以当执行到SqlDataAdapter.Update(ds)语句时,SqlDataAdapter桥接器不知道更
新哪个表.就报错了.
if (DS.Tables["FH"].Rows.Count!=0)
{
DS.Tables["FH"].Rows[0]["SBZ"] = txtSbz.Text.Trim();
DS.Tables["FH"].Rows[0]["SBRL"] = txtSBRL.Text.Trim();
DS.Tables["FH"].Rows[0]["KD"] = txtKD.Text.Trim();
DS.Tables["FH"].Rows[0]["COS"] = txtCos.Text.Trim();
DS.Tables["FH"].Rows[0]["TAN"] = dblTan;
DS.Tables["FH"].Rows[0]["HAVE_POWER"] = dblYsg;
DS.Tables["FH"].Rows[0]["NO_POWER"] = dblWsg;
DS.Tables["FH"].Rows[0]["SZ_POWER"] = dblSzg;
}
try
{
oleDapter.Update(DS,"FH");
}
catch (Exception ce)
{
MessageBox.Show(ce.Message);
return;
}
******************************
以上代码便会出现这样的问题
解决方法在上面加一句 OleDbCommandBuilder oleBuilder = new OleDbCommandBuilder(oleDapter);
这样数据适配器就明确要操作哪一张表了,对象就明确了。
另外使用这种方法操作数据记录时需要注意以下几点:
a.操作的表只能有一个并且有主键,否则会出现第一个错误提示;
b.更新的表中字段不能有image类型的
孤夜寒心泪