绑定数据库更新问题.

quieter 2009-01-08 12:30:29
请指教, 不好意思内容有点多. 先谢谢了.

有两个表Employees, Relatives
Employees有3个字段 eID, eName
Relatives有3个字段 rID, eID, rName
一个雇员(Employee)有0个或多个亲属(Relative)
其中Relatives中的eID是Employees的处键,且on update cascade on delete cascade

现在有一个form, textBox1绑定到Employees.eID, textBox2绑定到Employees.eName
dataGridView1绑定到Relatives表.

//绑定数据

DataSet ds = new DataSet();
SqlDataAdapter da = new SqlDataAdapter();
BindingSource bs;
BindingSource bs2;

da.SelectCommand = new SqlCommand("select * from Employees", _conn);
da.Fill(ds, "Employees");
da.SelectCommand = new SqlCommand("select * from Relatives", _conn);
da.Fill(ds, "Relatives");

ds.Relations.Add(ds.Tables["Employees"].Columns["eID"], ds.Tables["Relatives"].Columns["eID"]);

bs = new BindingSource(ds, "Employees");
bs.Filter = "eID = '" + eIDString + "'";
textBox1.DataBindings.Add("Text", bs, "eID");
textBox2.DataBindings.Add("Text", bs, "eName");

bs2 = new BindingSource(ds, "Relatives");
bs2.Filter = "eID = '" + eIDString + "'";
dataGridView1.DataSource = bs2;

//更新数据
//更新Employees
da.UpdateCommand = new SqlCommand("update Employees Set eID = @eID, eName = @eName where eID = @eIDOriginal", _conn);
da.UpdateCommand.Parameters.Add("@eID", SqlDbType.Char, 6, "eID");
da.UpdateCommand.Parameters.Add("@eName", SqlDbType.NVarChar, 20, "eName");
da.UpdateCommand.Parameters.Add("@eIDOriginal", SqlDbType.Char, 6, "eID");
da.UpdateCommand.Parameters["@eIDOriginal"].SourceVersion = DataRowVersion.Original;

bs.EndEdit();
da.Update(ds, "Employees");

//更新Relatives
da.UpdateCommand = new SqlCommand("update Relatives Set rName = @rName where rID = @rIDOriginal", _conn);
da.UpdateCommand.Parameters.Add("@rName", SqlDbType.NVarChar, 10, "rName");
da.UpdateCommand.Parameters.Add("@rIDOriginal", SqlDbType.Int, 4, "rID");
da.UpdateCommand.Parameters["@rIDOriginal"].SourceVersion = DataRowVersion.Original;

bs2.EndEdit();
da.Update(ds, "Relatives");

//重新绑定数据.
bs.Filter = "eID = '" + textBox1.Text.Trim() +"'";
bs.ResetBindings(false);
bs2.Filter = "eID = '" + textBox1.Text.Trim() +"'";
bs2.ResetBindings(false);



问题1: 请问这样写有什么问题? 当更新Employees.eID后, DataGridView就不能绑定了(自动清空了).是不是设置了cascade的问题?
应该在Employees.eID更改后, Relatives.eID也更改的啊?

问题2: 还想到另一个问题, 可否判断表中有没有被更改再执行Update()

问题3: 我这个表单一次只显示Employees中的一行数据, 需要绑定到整个表吗? 可以改成DataAdapter中增加"where eID = '某一个ID'"吗?
我现在用BindingSource.Filter(),那么还是绑定到整张表. 那么在Insert操作时,要求textbox和datagridview都为空,怎么做,能只绑定表结构吗?
...全文
130 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
nsl204 2009-01-09
  • 打赏
  • 举报
回复
"还想到另一个问题, 可否判断表中有没有被更改再执行Update() "
这个可以的,ds.Tables[0].Rows[0].RowState有三个状态,好像是“added”,"updated"和“delete”你可以根据这个状态
来控制是否执行。
hero0617 2009-01-09
  • 打赏
  • 举报
回复
uP
a21999 2009-01-08
  • 打赏
  • 举报
回复
三层比较简单。
jiang_jiajia10 2009-01-08
  • 打赏
  • 举报
回复
把绑定代码放到page_load加if(!ispostBack){//绑定}
cgilovecode 2009-01-08
  • 打赏
  • 举报
回复
分层
srgcc 2009-01-08
  • 打赏
  • 举报
回复
chong xin bang ding shi zai zhi xing yi xia bang ding shu ju de dai ma:

DataSet ds = new DataSet(); 
SqlDataAdapter da = new SqlDataAdapter();
BindingSource bs;
BindingSource bs2;

......

...
...
EveryCase 2009-01-08
  • 打赏
  • 举报
回复
ding
ximi82878 2009-01-08
  • 打赏
  • 举报
回复
沙发~~帮顶,积分
sunshine_anycall 2009-01-08
  • 打赏
  • 举报
回复
把数据库操作的东西都放到另外的一个文件中
在页面中调用时,然后初始化这个类。

111,131

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧