DialogResult result = MessageBox.Show("确定要保存吗?", "请确认", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
            OleDbConnection cnn = new OleDbConnection(connections);
            cnn.Open();
            oda=new OleDbDataAdapter("select MaterielRegiser_Number as 货料编号,MaterielRegiser_Name as 货料名称,MaterielRegiser_Model as 规格型号,MaterielRegiser_Unit as 单位 from MIS_MaterielRegiser",cnn);
            OleDbCommandBuilder ocb=new OleDbCommandBuilder(oda);            DataSet ds=new DataSet();
            oda.Fill(ds,"MIS_MaterielRegiser");
            //try
            //{
                if (result == DialogResult.Yes)
                {
                    //for (int i = 0; i < dgv_Data.Rows.Count; i++)
                    //{
                        string number = Convert.ToString(this.dgv_Data.Rows[2].Cells[0].Value);
                        string name = Convert.ToString(this.dgv_Data.Rows[2].Cells[1].Value);
                        string model =Convert.ToString(this.dgv_Data.Rows[2].Cells[2].Value);
                        string unit = Convert.ToString(this.dgv_Data.Rows[2].Cells[3].Value);//前面三个变量都能取到值,就这个取不到                        DataRow row = ds.Tables["MIS_MaterielRegiser"].NewRow();
                        row["货料编号"] = number;
                        row["货料名称"] = name;
                        row["规格型号"] = model;
                        row["单位"] = unit;
                        ds.Tables["MIS_MaterielRegiser"].Rows.Add(row);
                        oda.Update(ds, "MIS_MaterielRegiser");
单步调试发现这2行代码根代根本没运行,怎么办

解决方案 »

  1.   

    dgv_Data  这是个DataTable吧,你去它的列时,不用cell看看,直接this.dgv_Data.Rows[2][2].ToString(),这样应该是可以取到值的
      

  2.   

    string unit = Convert.ToString(this.dgv_Data.Rows[2].Cells[3].Value);//前面三个变量都能取到值,就这个取不到里面是否有值?
      

  3.   

    ds.Tables["MIS_MaterielRegiser"].Rows.Add(row);看一下是否加入表中,表状态是什么
    oda.Update(ds, "MIS_MaterielRegiser"); 上面没错的话,应该就是你数据库操作这出的问题。
      

  4.   

    this.dgv_Data.Rows[2].Cells[3].Value
    你确定dgv_Data重新绑定数据了吗?
    为什么不从ds里取数据?
      

  5.   

    其实dgv本身就维护了数据记录,所以你不需要自己循环提取只需要 dataset ds=(dataset)dgv.datasource 把这个东西提取出来然后使用适配器去更新即可
      

  6.   

    sorry,我是个小菜鸟,有个问题我想问一下,datagridview的数据是不是可以双向的,也就是说他的数据也可以做为数据源填到数据库里面去?
      

  7.   


    不要太早下结论,我做了一个简单的东西,你看一下   private void Form4_Load(object sender, EventArgs e)
            {
                OleDbConnection conn = new OleDbConnection(); 
                    conn.ConnectionString=@"provider=sqloledb.1;data source=。\MSSQL2008;initial catalog=xfcms;user id=sa;pwd=";//连接数据库的字符串
                    DataSet ds = new DataSet();//
                    string sql = "select * from test";
                    OleDbDataAdapter da = new OleDbDataAdapter(sql, conn);//从数据库中查询                da.Fill(ds);//将数据填充到DataSet                this.dataGridView1.DataSource = ds.Tables[0];
            }        private void button1_Click(object sender, EventArgs e)
            {
                DataTable dt = (DataTable)dataGridView1.DataSource;
                  OleDbConnection conn = new OleDbConnection(); 
                    conn.ConnectionString=@"provider=sqloledb.1;data source=。\MSSQL2008;initial catalog=xfcms;user id=sa;pwd=";//连接数据库的字符串
                    DataSet ds = new DataSet();//
                    string sql = "select * from test";
                    OleDbDataAdapter da = new OleDbDataAdapter(sql, conn);
                    OleDbCommandBuilder ocb = new OleDbCommandBuilder(da);
                    da.Update(dt);
            }winform不象webform,大多数程序员受webform代码编写方式的影响,很多东西都喜欢自己搞,但是实际上winform的数据绑定因为都是在本地,所以他的状态是自维护的,你可以直接用适配器去更新
      

  8.   

    再问一下,你的click事件里string sql = "select * from test";这是查询,如果要插入数据库是不是可以直接换成insert into 语句呢?
      

  9.   

    @17楼这并不是查询,因为我们这里根本没有查询,之所以给这个sql语句
    是要使用OleDbCommandBuilder ocb = new OleDbCommandBuilder(da);
    这个自动生成对应的InsertCommand语句,使用这条语句后,微软会自动根据你的查询语句生成对应的插入语句(省掉你自己手写update,insert命令语句的过程)以便让适配器去更新
      

  10.   

    我能问一下是你使用的什么数据库吗按照上面的代码,本身是可以正常运作的,数据库是可以被更新的如果你没看到被更新,我觉着很有可能是使用access或者excel这类文本数据库,如果是这类数据库winform调试比较古怪,很多时候运行结果并不在你代码目录下的那个数据库里面,而是在bin/debug 那个目录下
      

  11.   

    你说对了,正是用的ACCESS数据库,我是从没用过,这次是没办法,上面交待一定要用这个。
      

  12.   

    但是,debug下面的那个数据库也是一样的没有更新!
      

  13.   

    我现在把具体问题跟说一下吧,问题应该是出在ACCESS数据库,因为我点保存后,再刷新下datagridview它上面是有我输入的值的,但是数据库里没有。所以说,这个很纠结……还有,如果我datagridview里绑定的数据不是对应该表的所有字段的话是会报错的
    DialogResult result = MessageBox.Show("确定要保存吗?", "请确认", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
                if (result == DialogResult.Yes)
                {
                    DataTable dt = (DataTable)dgv_Data.DataSource;
                    ocnn = new OleDbConnection(connections);
                    ocnn.Open();
                
                    DataSet ds = new DataSet();     
                    string sql = "select * from MIS_MaterielRegiser";
                    oda = new OleDbDataAdapter(sql, ocnn);
                    ocb = new OleDbCommandBuilder(oda);
                    oda.Update(dt);DataTable“MIS_MaterielRegister”中缺少 SourceColumn“MaterielRegiser_Number”的 DataColumn“MaterielRegiser_Number”。            }
                ocnn.Close();
      

  14.   

    好了,问题解决了。我发出来供人参考吧:
     DialogResult result = MessageBox.Show("确定要保存吗?", "请确认", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
                if (result == DialogResult.Yes)
                {
                    DataTable dt = (DataTable)dgv_Data.DataSource;
                    ocnn = new OleDbConnection(connections);
                    ocnn.Open();
                
                    DataSet ds = new DataSet();     
                    string sql = "select MaterielRegiser_Number as 货料编号,MaterielRegiser_Name as 货料名称,MaterielRegiser_Model as 规格型号,MaterielRegiser_Unit as 单位 from MIS_MaterielRegiser";//这条语句一定要跟绑定时的语句是一样的
                    oda = new OleDbDataAdapter(sql, ocnn);
                    ocb = new OleDbCommandBuilder(oda);
                    ocb.QuotePrefix = "[";
                    ocb.QuoteSuffix = "]";这两行是解决我问题的关键,这是为它自动生成的SQL语句的字段添加‘[]’,ACCESS要求比较严格!

                    oda.Update(dt);            }
                ocnn.Close();
      

  15.   

    最后要注意的就是连接数据库的字符串,不要使用debug下面的数据库,否则再次运行,会把先前保存的覆盖!
    结帖!