using (OleDbConnection cCon = new OleDbConnection(con)) { OleDbDataAdapter ada = new OleDbDataAdapter(string.Format(@"select * from [{0}]", mySet), cCon); OleDbCommandBuilder cBu = new OleDbCommandBuilder(ada); try { ada.Update(dt); dt.AcceptChanges(); MessageBox.Show("数据保存完成!"); this.NavigatorSave.Enabled = false; } catch { MessageBox.Show("数据保存失败!"); } } 我想请问的是这个更新过程是什么原理?更新的过程是什么样的? string.Format(@"select * from [{0}]", mySet) 如果我使用的是多个表查询的语句 string.Format(@"select * from [{0}] inner join [{1}] on {0}.ID={1}.{0}ID",Table1,Table2) 是不是相同的更新过程呢? |
|
绑定了datatable(后台数据源)之后,数据源里的数据变化,表格里的数据就会跟着变化
前提是,datatable是引用类型,不要重新new,重新new过的dt就跟绑定表格的那个没有任何关系了 |
|
如果你的代码里不得不重新new datatable(比如使用的数据库操作类就是返回一个新的datatable而不是更新现有的),那么你需要将新的datatable重新绑定到控件,控件就更新了
|
|
你说的有点让我头晕,刚开始用这个控件,感觉好多都不明白,总觉得有比Listview更快捷的方式但是又不会。上面少了这么一句 DataTable dt = this.dataGridView.DataSource as DataTable; 你看能不能给 |
|
自己试一下呗
既然单表查询好使了,多表查询有什么区别吗 如果不好使再纠结为什么 |
|
今天试了发现异常Dynamic SQL generation is not supported against multiple base tables. using (OleDbConnection conn = new OleDbConnection(con)) { try { if (conn.State == ConnectionState.Closed) { conn.Open(); } string sql = "select " + "表1.姓名," + "表1.性别," + "表1.年龄," + "表1.手机," + "表1.邮箱," + "表2.部门," + "表2.职位," + "表2.职责," + "表2.备注" + " from [表1] inner join [表2] on 表2.姓名=表1.姓名"; DataTable dt = new DataTable(); using (OleDbDataAdapter da = new OleDbDataAdapter(sql, conn)) { da.Fill(dt); } this.dataGridView.AutoGenerateColumns = false; this.dataGridView.DataSource = dt; } using (OleDbConnection cCon = new OleDbConnection(con)) { string sql = "select " + "表1.姓名," + "表1.性别," + "表1.年龄," + "表1.手机," + "表1.邮箱," + "表2.部门," + "表2.职位," + "表2.职责," + "表2.备注" + " from [表1] inner join [表2] on 表2.姓名=表1.姓名"; OleDbDataAdapter da = new OleDbDataAdapter(sql, cCon); OleDbCommandBuilder cBu = new OleDbCommandBuilder(da); DataTable dt = this.dataGridView.DataSource as DataTable; try { da.Update(dt); dt.AcceptChanges(); MessageBox.Show("数据保存完成!"); } |
|
这是告诉你这个数据库不支持多表查询
你不会是把多个excel工作簿当成数据表在操作吧?? |
|
先用数据库客户端执行你的SQL语句,确认没问题了再放到代码里去
|
|
我的是Access数据库,我应该要怎么操作? |
|
导入时绑定可以出结果,但是更新的那段出错 |
|
哦,我知道你到底是什么问题了
你这根本不是”Datagridview怎么更新”,而是要把Datagridview里的数据更新回数据库 那么绑定了多表,当然是更新不回去的了 你得学会自己写sql语句更新,不要只知道绑定Datagridview |
|
单表绑定为什么可以更新回去呢?只能一行行用SQL语句再更新数据库吗? |
|
单表绑定,你是绑定了一个实体表,有主键,有字段,有数据,当然就可以更新回去
而多表绑定,你相当于绑定了一个视图,谁知道你到底要把数据更新回哪个表里,数据都是动态计算出来的,那些列可能其实哪个表里都没有,也可能2个表里都有 |
|
那按照你们的经验应该要怎么操作这种情况?遍历Datagridview的行进行SQL语句多表更新? |
|
根据我们的经验,多表查询的数据就不应该更新回去.这已经不是原始数据了.
或者其实你只是某些字段想替换成汉字,完全可以使用另外的手段实现,比如在表格里添加combobox类型的列,绑定displaymember和valuemember,让它显示汉字,但是值还是跟数据库中一致 而且不要只会绑定来绑定去的,也该学学如何sql语句更新数据库了.不要老怕麻烦,其实就是一个循环而已 |
|
是这样的,因为大家都习惯了Excel表格,几个人的工作分前后,又各分表格,但是大部分数据是A人的表拷贝到B人的表,B人再在自己的这个表再加几列,这样表格就太多了,想要跟踪进度都比较困难,我现在想整合大家。之前我同部门几个人的表我都采用的是Listview显示,双击一行后弹窗显示修改的。我不是怕写更新SQL的麻烦,我是怕影响速度,到时候速度还不如Excel方便。大家都不愿意整合了,就没什么意义。 |
|
30分 |
为什么要用ListView,
而且这种数据有什么需要多表查询的吗,不是每个人一张表而已吗 而且你即使使用了绑定控件的方式,后台依然还是变成sql语句循环插入或批量插入,给你封装了一下而已 想批量插入,你可以把多条insert语句拼接到一个sql里一次执行 |
这也是我学习C#的过程,刚开始是接触Listview,所以最先用那个作为工作任务清单,同部门的几个人同时操作(我们开始是用的Excel共享功能),现在是因为其他人需要像Excel那样编辑,所以开始学习使用Datagridview,为什么多张表呢,是因为A人的表的一部分字段是B人的表的基础,B人的表自己有另外的字段依据这些字段,B人的表的一部分呢又是C人的表的基础,就像做产品流程一样。我没有做过这种QA流程,所以走了好多弯路。 |