绑定DataTable的Datagridview怎么更新

浩洁 2015-01-12 01:19:55

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)
是不是相同的更新过程呢?
...全文
619 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
於黾 2015-01-13
  • 打赏
  • 举报
回复
先用数据库客户端执行你的SQL语句,确认没问题了再放到代码里去
於黾 2015-01-13
  • 打赏
  • 举报
回复
这是告诉你这个数据库不支持多表查询 你不会是把多个excel工作簿当成数据表在操作吧??
浩洁 2015-01-13
  • 打赏
  • 举报
回复
引用 4 楼 Z65443344 的回复:
自己试一下呗 既然单表查询好使了,多表查询有什么区别吗 如果不好使再纠结为什么
今天试了发现异常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("数据保存完成!");
        }
浩洁 2015-01-13
  • 打赏
  • 举报
回复
引用 16 楼 Z65443344 的回复:
为什么要用ListView, 而且这种数据有什么需要多表查询的吗,不是每个人一张表而已吗 而且你即使使用了绑定控件的方式,后台依然还是变成sql语句循环插入或批量插入,给你封装了一下而已 想批量插入,你可以把多条insert语句拼接到一个sql里一次执行
这也是我学习C#的过程,刚开始是接触Listview,所以最先用那个作为工作任务清单,同部门的几个人同时操作(我们开始是用的Excel共享功能),现在是因为其他人需要像Excel那样编辑,所以开始学习使用Datagridview,为什么多张表呢,是因为A人的表的一部分字段是B人的表的基础,B人的表自己有另外的字段依据这些字段,B人的表的一部分呢又是C人的表的基础,就像做产品流程一样。我没有做过这种QA流程,所以走了好多弯路。
於黾 2015-01-13
  • 打赏
  • 举报
回复
为什么要用ListView, 而且这种数据有什么需要多表查询的吗,不是每个人一张表而已吗 而且你即使使用了绑定控件的方式,后台依然还是变成sql语句循环插入或批量插入,给你封装了一下而已 想批量插入,你可以把多条insert语句拼接到一个sql里一次执行
浩洁 2015-01-13
  • 打赏
  • 举报
回复
引用 14 楼 Z65443344 的回复:
根据我们的经验,多表查询的数据就不应该更新回去.这已经不是原始数据了. 或者其实你只是某些字段想替换成汉字,完全可以使用另外的手段实现,比如在表格里添加combobox类型的列,绑定displaymember和valuemember,让它显示汉字,但是值还是跟数据库中一致 而且不要只会绑定来绑定去的,也该学学如何sql语句更新数据库了.不要老怕麻烦,其实就是一个循环而已
是这样的,因为大家都习惯了Excel表格,几个人的工作分前后,又各分表格,但是大部分数据是A人的表拷贝到B人的表,B人再在自己的这个表再加几列,这样表格就太多了,想要跟踪进度都比较困难,我现在想整合大家。之前我同部门几个人的表我都采用的是Listview显示,双击一行后弹窗显示修改的。我不是怕写更新SQL的麻烦,我是怕影响速度,到时候速度还不如Excel方便。大家都不愿意整合了,就没什么意义。
於黾 2015-01-13
  • 打赏
  • 举报
回复
根据我们的经验,多表查询的数据就不应该更新回去.这已经不是原始数据了. 或者其实你只是某些字段想替换成汉字,完全可以使用另外的手段实现,比如在表格里添加combobox类型的列,绑定displaymember和valuemember,让它显示汉字,但是值还是跟数据库中一致 而且不要只会绑定来绑定去的,也该学学如何sql语句更新数据库了.不要老怕麻烦,其实就是一个循环而已
浩洁 2015-01-13
  • 打赏
  • 举报
回复
引用 12 楼 Z65443344 的回复:
单表绑定,你是绑定了一个实体表,有主键,有字段,有数据,当然就可以更新回去 而多表绑定,你相当于绑定了一个视图,谁知道你到底要把数据更新回哪个表里,数据都是动态计算出来的,那些列可能其实哪个表里都没有,也可能2个表里都有
那按照你们的经验应该要怎么操作这种情况?遍历Datagridview的行进行SQL语句多表更新? 或者有什么更快的方法吗?总感觉这样好麻烦
於黾 2015-01-13
  • 打赏
  • 举报
回复
单表绑定,你是绑定了一个实体表,有主键,有字段,有数据,当然就可以更新回去 而多表绑定,你相当于绑定了一个视图,谁知道你到底要把数据更新回哪个表里,数据都是动态计算出来的,那些列可能其实哪个表里都没有,也可能2个表里都有
浩洁 2015-01-13
  • 打赏
  • 举报
回复
引用 10 楼 Z65443344 的回复:
哦,我知道你到底是什么问题了 你这根本不是"Datagridview怎么更新",而是要把Datagridview里的数据更新回数据库 那么绑定了多表,当然是更新不回去的了 你得学会自己写sql语句更新,不要只知道绑定Datagridview
单表绑定为什么可以更新回去呢?只能一行行用SQL语句再更新数据库吗?
於黾 2015-01-13
  • 打赏
  • 举报
回复
哦,我知道你到底是什么问题了 你这根本不是"Datagridview怎么更新",而是要把Datagridview里的数据更新回数据库 那么绑定了多表,当然是更新不回去的了 你得学会自己写sql语句更新,不要只知道绑定Datagridview
浩洁 2015-01-13
  • 打赏
  • 举报
回复
引用 7 楼 Z65443344 的回复:
先用数据库客户端执行你的SQL语句,确认没问题了再放到代码里去
导入时绑定可以出结果,但是更新的那段出错
浩洁 2015-01-13
  • 打赏
  • 举报
回复
引用 6 楼 Z65443344 的回复:
这是告诉你这个数据库不支持多表查询 你不会是把多个excel工作簿当成数据表在操作吧??
我的是Access数据库,我应该要怎么操作?
於黾 2015-01-12
  • 打赏
  • 举报
回复
自己试一下呗 既然单表查询好使了,多表查询有什么区别吗 如果不好使再纠结为什么
浩洁 2015-01-12
  • 打赏
  • 举报
回复
引用 2 楼 Z65443344 的回复:
如果你的代码里不得不重新new datatable(比如使用的数据库操作类就是返回一个新的datatable而不是更新现有的),那么你需要将新的datatable重新绑定到控件,控件就更新了
你说的有点让我头晕,刚开始用这个控件,感觉好多都不明白,总觉得有比Listview更快捷的方式但是又不会。上面少了这么一句
DataTable dt = this.dataGridView.DataSource as DataTable;
你看能不能给
於黾 2015-01-12
  • 打赏
  • 举报
回复
如果你的代码里不得不重新new datatable(比如使用的数据库操作类就是返回一个新的datatable而不是更新现有的),那么你需要将新的datatable重新绑定到控件,控件就更新了
於黾 2015-01-12
  • 打赏
  • 举报
回复
绑定了datatable(后台数据源)之后,数据源里的数据变化,表格里的数据就会跟着变化 前提是,datatable是引用类型,不要重新new,重新new过的dt就跟绑定表格的那个没有任何关系了

110,536

社区成员

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

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

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