首页 新闻 会员 周边

高分悬赏,说废话的请绕道,谢谢:关于通过dataset批量更新数据库winform

0
悬赏园豆:100 [已解决问题] 解决于 2016-02-25 17:35

操作界面:

dgv初始化

 private void dgvHeadInit(int id)
        {

            string sql1 = @"select id,fno,positation,
                            worktimeNo as 工序代码,
                            initialCount as 起始针数,
                            seamDistance as 车缝距离, 
                            endCount as 落回针数,
                            initialCount+seamDistance+endCount as [每小时指标(件)],
                            worktimeName as 工序名称,
                            samTime as SAM值,
                            target AS 工序指标,
                            equipment as 使用设备,
                            tool as 使用工具,
                            pid 
                            from product_desProductTime 
                            where pid=" + id + " and positation='头部' and fno='"+txtfNo.Text+"'";
            
            SqlConnection cn = new SqlConnection("server=172.20.50.4;uid=sa;pwd=p4japo020;database=gsd");
            sda1 = new SqlDataAdapter(sql1, cn);
            ds1 = new DataSet();
            sda1.Fill(ds1,"info");
            //dt1 = ds1.Tables[0];

            //ds1.Tables[0].TableName = "product_desProductTime";



            dgvHead.DataSource = ds1.Tables[0];
           // dgvHead.DataSource = dt1;
            
            dgvHead.Columns["id"].Visible = false;
            dgvHead.Columns["fNo"].Visible = false;

            dgvHead.Columns["positation"].Visible = false;
            dgvHead.Rows[0].Selected = false;
            //dgvHead.Columns["pid"].Visible = false;
            // dgv.DataSource = dt1;//分别绑定数据源
            //DataRow dr1 = ds1.Tables[0].NewRow();
            //ds1.Tables[0].Rows.Add(dr1);


        }
 1 private void dgvHead_CellLeave(object sender, DataGridViewCellEventArgs e)
 2         {
 3             //第一次加载时候,dgvHead.Rows[e.RowIndex].Cells[e.ColumnIndex].Value默认是第一行的id值
 4             if (dgvHead.Rows[e.RowIndex].Cells[e.ColumnIndex].Value == null)
 5             {
 6                 tempCellValue = null;
 7                 return;
 8             }
 9             tempCellValue = dgvHead.Rows[e.RowIndex].Cells[e.ColumnIndex].Value.ToString();
10         }
 1   private void dgvHead_CellValidated(object sender, DataGridViewCellEventArgs e)
 2         {
 3             string curValue = dgvHead.Rows[e.RowIndex].Cells[e.ColumnIndex].Value.ToString();
 4             if (tempCellValue==curValue)
 5             {
 6                 return;
 7             }
 8             else
 9             {
10                 if (e.ColumnIndex==3)
11                 {
12                     string workTimeNo = dgvHead.CurrentRow.Cells[3].Value.ToString();
13                     string sql2 = @"select count(*) from desProductTime where workTimeNo='"+workTimeNo+"'";
14                     cn = new SqlConnection(strconn);
15                     cmd = new SqlCommand(sql2,cn);
16                     cn.Open();
17                     int x = (int)(cmd.ExecuteScalar());
18                     cn.Close();
19                     if (x!=0)
20                     {
21                         cn = new SqlConnection(strconn);
22                         string sql3 = @"select * from desProductTime where workTimeNo='"+workTimeNo+"'";
23                         cmd = new SqlCommand(sql3,cn);
24                         cn.Open();
25 
26                         SqlDataReader sdr = cmd.ExecuteReader();
27                         while (sdr.Read())
28                         {
29 
30                             dgvHead.Rows[e.RowIndex].Cells[1].Value = txtfNo.Text;
31                             dgvHead.Rows[e.RowIndex].Cells[2].Value = "头部";
32                             dgvHead.Rows[e.RowIndex].Cells[4].Value = sdr["initialCount"].ToString();
33                             dgvHead.Rows[e.RowIndex].Cells[5].Value = sdr["seamDistance"].ToString();
34                             dgvHead.Rows[e.RowIndex].Cells[6].Value = sdr["endCount"].ToString();
35                             dgvHead.Rows[e.RowIndex].Cells[7].Value = (int)dgvHead.Rows[e.RowIndex].Cells[4].Value + (int)dgvHead.Rows[e.RowIndex].Cells[5].Value + (int)(dgvHead.Rows[e.RowIndex].Cells[6].Value);
36                             dgvHead.Rows[e.RowIndex].Cells[8].Value = sdr["worktimeName"].ToString();
37                             dgvHead.Rows[e.RowIndex].Cells[9].Value = sdr["samTime"].ToString();
38                             dgvHead.Rows[e.RowIndex].Cells[10].Value = sdr["target"].ToString();
39                             dgvHead.Rows[e.RowIndex].Cells[11].Value = sdr["equipment"].ToString();
40                             dgvHead.Rows[e.RowIndex].Cells[12].Value = sdr["tool"].ToString();
41                             dgvHead.Rows[e.RowIndex].Cells[13].Value = id;
42 
43 
44                         }
45                         cn.Close();
46                     }
47                     else
48                     {
49                         MessageBox.Show("工序代码输入有误!");
50                         return;
51                     }
52 
53 
54                 }
55                 else
56                 {
57 
58                     dgvHead.Rows[e.RowIndex].Cells[7].Value = (int)dgvHead.Rows[e.RowIndex].Cells[4].Value + (int)dgvHead.Rows[e.RowIndex].Cells[5].Value + (int)(dgvHead.Rows[e.RowIndex].Cells[6].Value);
59                 }
60             }
61         }
 1  private void btnSave_Click(object sender, EventArgs e)
 2         {
 3             //int id = 0;
 4             //保存到数据库之前先判断一下主表是否有重复记录
 5             string fno = txtfNo.Text.Trim();
 6             string fname = txtPname.Text.Trim();
 7             int orderqty = Convert.ToInt32(txtOrderQty.Text);
 8             double orderc = Convert.ToDouble(txtOrderCoefficient.Text);
 9             Image pic = pbchef.Image;
10             //主表的修改
11             string sql1 = "select count(1) from desProductAttach where fno='" + fno + "' and fno!='" + args["pNo"].ToString() + "' and fname='" + fname + "' and orderqty=" + orderqty + " and orderCoefficient=" + orderc + "";
12             int count = Convert.ToInt32(SqlHelp.GetValue(CommandType.Text, sql1));
13             if (count != 0)
14             {
15                 MessageBox.Show("数据库中已经存在重复记录,请修改后重新录入!");
16                 return;
17             }
18             string sql2 = @"update desProductAttach set fno='" + fno + "',fname='" + fname + "',orderqty=" + orderqty + ",orderCoefficient=" + orderc + " where id="+id+"";
19             SqlHelp.ExecuteNonQuery(CommandType.Text,sql2);
20 
21            //子表的更新(通过数据源更新)
22             //int flag = 2;
23             //flag= UpdateByDataSet(ds1, "product_desProductTime",strconn);
24             if (ds1.HasChanges())
25             {
26                 SqlCommandBuilder cb = new SqlCommandBuilder(sda1);
27                 sda1.Update(ds1.Tables[0]);
28                 ds1.AcceptChanges();
29                 dgvHead.Update();
30             }
31 
32         }

我现在知道问题出在dgvHead_CellLeave和dgvHead_CellValidated事件,导致现在更新有的时候成功,有时候失败,请教 我该怎么改? 

问题补充:

就是通过一个保存按钮直接实现对数据库的增删改操作

wq_vincent的主页 wq_vincent | 初学一级 | 园豆:5
提问于:2016-02-25 10:14
< >
分享
最佳答案
0

 

datagridview少一行数据这是最常见的问题了,吴瑞祥说的

“你试试点确定前,先点下其它地方,然后看看.”

至于为啥,怎么解决,你是一个程序员,想想就有办法了。

 

如果非要给出一个理由,那就是

Datagridview中的修改尚未提交到Dataset中,而工具栏“保存”的点击事件触发是在

Datagridview的LostFocus之前的,而Dataset中的数据要等到Datagridview行离开后才会更新相关行的数据。所以不离开行,那行数据的修改、新增都不在Dataset中。

这样就造成保存代码是在Dataset接收到数据修改前运行。

 

如果你使用的不是工具栏,而是按钮Button,你点击按钮的事件是在Datagridview的LostFocus之后的,就不会有这种问题。

微软就是这么设计的,你咬比尔盖茨去吧,不然就自己想想办法。

 

收获园豆:80
爱编程的大叔 | 高人七级 |园豆:30839 | 2016-02-25 11:09

大叔 你的回答是解释了为什么,但是没告诉我怎么做.按照道理只能给你一半分,不过还是给你80吧,能看得出来你经验很丰富, 我已经搞定了 多谢

wq_vincent | 园豆:5 (初学一级) | 2016-02-25 17:20

@wq_vincent: 做法很多,不想限制住你的创造新思维。

我觉得提供思路就够了,大部分情况我不喜欢直接给答案的。

爱编程的大叔 | 园豆:30839 (高人七级) | 2016-02-25 17:29
其他回答(3)
0

dataset和gridview不是可以直接用数据源绑定,然后自己做同步吗?什么代码都不用写的.

收获园豆:10
吴瑞祥 | 园豆:29449 (高人七级) | 2016-02-25 10:21

 更新失败是有异常,还是代码都正常指定,但没有结果?

支持(0) 反对(0) 吴瑞祥 | 园豆:29449 (高人七级) | 2016-02-25 10:25

@吴瑞祥: 所有代码都正常运行,但有时候没结果

支持(0) 反对(0) wq_vincent | 园豆:5 (初学一级) | 2016-02-25 10:28

我明明对datagridview增加了一行,但是调试的时候,发现if (ds1.HasChanges())是false,更新那步直接跳过了

支持(0) 反对(0) wq_vincent | 园豆:5 (初学一级) | 2016-02-25 10:32

@吴瑞祥: 我这个是对工序代码那列输入一个数据,然后自动从数据库中其他的表读取数据填充后面的列.

支持(0) 反对(0) wq_vincent | 园豆:5 (初学一级) | 2016-02-25 10:33

@wq_vincent:你试试点确定前,先点下其它地方,然后看看.

支持(0) 反对(0) 吴瑞祥 | 园豆:29449 (高人七级) | 2016-02-25 10:44
0

你看下数据库的各个字段的长度设置是不是短了

收获园豆:10
刘宏玺 | 园豆:14020 (专家六级) | 2016-02-25 10:30

跟这个没关系吧,我的问题是:比方说我在datagridview中增加了2行数据,但是点保存的时候,数据库中只增加了一行,最后输入的那行就没更新到数据库,这是什么原因??

支持(0) 反对(0) wq_vincent | 园豆:5 (初学一级) | 2016-02-25 10:58

@wq_vincent: 点击保存按钮的时候加上这句话试试

dgvHead.EndEdit();

支持(0) 反对(0) 刘宏玺 | 园豆:14020 (专家六级) | 2016-02-25 11:29

@刘宏玺: 已试,没用

支持(0) 反对(0) wq_vincent | 园豆:5 (初学一级) | 2016-02-25 12:21
0

DATASET作为DATAGRID的数据源,当DATAGRID的数据内容变更后,会自动的保存在DATASET里,此时,数据没有真正更新到数据库。

通过SQLDATAADAPTER的UPDATECOMMAND,可以实现DATASET变更数据的更新操作,这个操作从某种意义上说是批量的。

519740105 | 园豆:5810 (大侠五级) | 2016-02-25 14:23
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册