DataGridInvoice???是控件吗??可以说一下吗
如果在DataGrid中是可以直接对DataSet 更新的
try
{
sqlDataAdapter1.Update(dsOrders1);//dsOrders1是绑定的数据集
MessageBox.Show("更新成功!","提示信息",MessageBoxButtons.OK,MessageBoxIcon.Information);
}
catch(Exception err)
{
MessageBox.Show("更新出错:"+err.ToString());
}

解决方案 »

  1.   

    private System.Windows.Forms.DataGrid dataGridInvoice;这行你没看到吗?你的方法好象不行吧,我记得试过的,我再试试吧,好象没那么简单的。
      

  2.   

    这样的update当然会那样了,因为你的insert语句,你应该用DataGrid的update方法,而insert语句不要写
      

  3.   

    大哥,拜托,哪有insert语句啊,还有到底用DataGrid的Update方法,还是OleDbDataAdapter方法啊。如果在buttonUpdate_Click里只有da.Update(ds,"invoice");这一句的话,错误提示是“当传递具有已修改行的DataRow集合时,更新要求有效的UpdateCommand。”那位高手帮忙解决一下啊。各位负点责任好不好,拿一些不好用的代码让我浪费时间,唉,到底行不行啊。
      

  4.   

    string Src="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Invoice.mdb";
    string Invoice="SELECT 购货单位,日期,货名及规格,单位,数量,单价,金额,图片位置,备注 FROM invoice";
    OleDbConnection conn=new OleDbConnection(Src);
    da=new OleDbDataAdapter(Invoice,conn);OleDbCommandBuilder custCB = new OleDbCommandBuilder (da);//加上这一句看看;ds=new DataSet();
    da.Fill(ds,"invoice");
    dataGridInvoice.SetDataBinding(ds,"invoice");
      

  5.   

    DataGrid的更新我没用过,但我感觉错误应该处在下面这句:string Upt="UPDATE invoice SET 购货单位=@购货单位,日期=@日期,货名及规格=@货名及规格,单位=@单位,数量=@数量,单价=@单价,金额=@金额,图片位置=@图片位置,备注=@备注";没有Where子句,更新时当然会把所有数据都更新成相同的内容.
      

  6.   

    titicaca:
    OleDbCommandBuilder custCB = new OleDbCommandBuilder (da);这一句不管是加到buttonShowAll里面还是buttonUpdate里面都不管用,你想啊,只加这么一句后面根本没用上custCB这个OleDbCommandBuilder类的实例,你能不能写详细一点啊。alexlimingjun:
    你肯定没看明白我的意思,我说得是当我修改了一个网格的数据之后,注意,这个网格可以在任一行的任一列,当我更新的时候,所有行的内容和我修改的网格所在行的内容都一样了,但列与列之间的内容还是不一样的,就是下面这样
    a  b  c  d   e
    a  b  c  d   e
    a  b  c  d   e
    a  b  c  d   e我查询那部分没问题的,显示出来的和数据库内容完全一致,只是更新有问题,是你们没看明白我的问题还是怎么回事,怎么我问得问题很难吗,是不是高手都回家过年了。
      

  7.   

    问题更新using System;
    using System.Drawing;
    using System.Data;
    using System.Data.OleDb;
    using System.Collections;
    using System.ComponentModel;
    using System.Windows.Forms;namespace Invoice
    {
    /// <summary>
    /// InvoiceUpdate 的摘要说明。
    /// </summary>
    public class InvoiceUpdate : System.Windows.Forms.Form
    {
    private System.Windows.Forms.DataGrid dataGridInvoice;
    private System.Windows.Forms.Label labelTitle;
    private System.Windows.Forms.Button buttonShowAll;
    private System.Windows.Forms.Button buttonUpdate;
    int i=0;
    int[] Cell=new int[9];//创建一个数组,用于存储用户曾经点击过的单元格对应的列的列号,且无重复
    DataSet ds;
    OleDbDataAdapter da;
    /// <summary>
    /// 必需的设计器变量。
    /// </summary>
    private System.ComponentModel.Container components = null; public InvoiceUpdate()
    {
    //
    // Windows 窗体设计器支持所必需的
    //
    InitializeComponent(); //
    // TODO: 在 InitializeComponent 调用后添加任何构造函数代码
    //
    } /// <summary>
    /// 清理所有正在使用的资源。
    /// </summary>
    protected override void Dispose( bool disposing )
    {
    if( disposing )
    {
    if(components != null)
    {
    components.Dispose();
    }
    }
    base.Dispose( disposing );
    } #region Windows Form Designer generated code
    //这部分已被我略去
    #endregion
    private void buttonShowAll_Click(object sender, System.EventArgs e)//显示数据库所有内容到dataGridInvoice,这部分肯定没问题
    {
    string Src="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Invoice.mdb";
    string Invoice="SELECT 购货单位,日期,货名及规格,单位,数量,单价,金额,图片位置,备注 FROM invoice";
    OleDbConnection conn=new OleDbConnection(Src);
    da=new OleDbDataAdapter(Invoice,conn);
    ds=new DataSet();
    da.Fill(ds,"invoice");
    dataGridInvoice.SetDataBinding(ds,"invoice");
    } private void buttonUpdate_Click(object sender, System.EventArgs e)//这部分语法没问题,逻辑问题严重
    {
    labelTitle.Text=Cell[i].ToString();////经显示,一切正常,Cell[i]的当前值就是用户最后一次点击的以前没有点击过的网格的列号
    string Upt="";
    string Src="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Invoice.mdb";
    switch(Cell[i])//这里本来需要将数组Cell[i]的值依次读出进行判断的,现在只是测试看最后一次点击的网格的列号与下列值如果匹配的话能不能更新
    {
    case 0:Upt="UPDATE invoice SET 购货单位=@购货单位 WHERE 日期=@日期 AND 货名及规格=@货名及规格 AND 单位=@单位 AND 数量=@数量 AND 单价=@单价 AND 金额=@金额 AND 图片位置=@图片位置 AND 备注=@备注";break;
    case 1:Upt="UPDATE invoice SET 日期=@日期 WHERE 购货单位=@购货单位 AND 货名及规格=@货名及规格 AND 单位=@单位 AND 数量=@数量 AND 单价=@单价 AND 金额=@金额 AND 图片位置=@图片位置 AND 备注=@备注";break;
    case 2:Upt="UPDATE invoice SET 货名及规格=@货名及规格 WHERE 购货单位=@购货单位 AND 日期=@日期 AND 单位=@单位 AND 数量=@数量 AND 单价=@单价 AND 金额=@金额 AND 图片位置=@图片位置 AND 备注=@备注";break;
    }
    OleDbConnection conn=new OleDbConnection(Src);
    da.UpdateCommand=new OleDbCommand(Upt,conn);
    OleDbParameter Para;
    Para=da.UpdateCommand.Parameters.Add("@购货单位",OleDbType.Char);
    Para.SourceColumn="购货单位";
    Para.SourceVersion=DataRowVersion.Current;
    Para=da.UpdateCommand.Parameters.Add("@日期",OleDbType.Char);
    Para.SourceColumn="日期";
    Para.SourceVersion=DataRowVersion.Current;
    Para=da.UpdateCommand.Parameters.Add("@货名及规格",OleDbType.Char);
    Para.SourceColumn="货名及规格";
    Para.SourceVersion=DataRowVersion.Current;
    Para=da.UpdateCommand.Parameters.Add("@单位",OleDbType.Char);
    Para.SourceColumn="单位";
    Para.SourceVersion=DataRowVersion.Current;
    Para=da.UpdateCommand.Parameters.Add("@数量",OleDbType.Char);
    Para.SourceColumn="数量";
    Para.SourceVersion=DataRowVersion.Current;
    Para=da.UpdateCommand.Parameters.Add("@单价",OleDbType.Char);
    Para.SourceColumn="单价";
    Para.SourceVersion=DataRowVersion.Current;
    Para=da.UpdateCommand.Parameters.Add("@金额",OleDbType.Char);
    Para.SourceColumn="金额";
    Para.SourceVersion=DataRowVersion.Current;
    Para=da.UpdateCommand.Parameters.Add("@图片位置",OleDbType.Char);
    Para.SourceColumn="图片位置";
    Para.SourceVersion=DataRowVersion.Current;
    Para=da.UpdateCommand.Parameters.Add("@备注",OleDbType.Char);
    Para.SourceColumn="备注";
    Para.SourceVersion=DataRowVersion.Current;
    da.Update(ds,"invoice");
    } private void dataGridInvoice_CurrentCellChanged(object sender, System.EventArgs e)
    {
    int CurrentNumber=dataGridInvoice.CurrentCell.ColumnNumber;//获取当前网格的列号
    bool ExistNumber=false;
    for(int j=0;j<=i;j++)//判断数组Cell[i]的前面所有项中有没有当前网格的列号,如果有就不再重复添加了
    {
    if(Cell[j]==CurrentNumber)
    {
    ExistNumber=true;
    }
    }
    if(ExistNumber==false)//否则,将当前网格的列号添加到Cell[]数组中
    {
    i++;
    Cell[i]=dataGridInvoice.CurrentCell.ColumnNumber;
    }
    labelTitle.Text=Cell[i].ToString();//经显示,一切正常,Cell[i]的当前值就是用户最后一次点击的以前没有点击过的网格的列号
    }
    }
    }
    虽然这段程序即使如果能成功的话,当用户点击某一个网格即使不修改也有可能使Cell[i]包含该列,但问题不大。
    这段程序运行的时候,第一列总能成功更新,而且可以批量更新该列的所有行,所以我只是获取了修改过的数据对应的列号,因为只要知道了列号而且使列号不重复,就是说当你点击了第一列然后第二列然后再第一列的话Cell[i]里面不会再有0这个值,最终不管你点击了那一行的那一列都会更新,多么美好的愿望可惜问题很多,主要是:更新第一列的所有行都没有问题,成功无误,注意,如果只点击了第一列,Cell[0]=0,对应case 0:,但只要点击过第二列,此时显示Cell[i]为1,对应Case 1:,但更新不成功,提示错误:“并发冲突:UpdateCommand影响0个记录”,说明更新不成功,不知道为什么,高手请指点,我保证谁帮我解决了datagrid的更新问题给200分我都乐意。
      

  8.   

    虽然没有看全你的程序,但是你的UpdateCommand好象有点问题,数据库也不是很好,没有主键!比如ID,不要用点击DataGrid行来取得所改变行!你可以试试加一主键例,取出来,在设DataGridComlumn不要显示出来,更改时只要根据它为作条件即可,我以前这样做过,没有出错过!
    ////
    还有你用列来改变时,第一例改变时正确,第二次点时,因为第一次已改变,并且好象可能改变某个主键列,主键列是不可改变,你的问题我以前也出现过。
      

  9.   

    alexlimingjun说的对!虽然没有看全你的程序,但你的update有问题,如果没有where,肯定是所有行被update,
      

  10.   

    数据库我曾尝试添加过主键,可能是因为其他问题结果没用
    我的程序思路是获取更改过的网格所对应的列,不是行,我的确是要更新所有行,之所以不获取网格的行是因为随着数据库的增大,行数会越来越多,而列数毕竟有限而且不会很多,所以当我获取了修改过的网格对应的列号以后,更新该列的所有行,而且现在还不考虑性能优化,程序还没实现呢。huan_jinwu你的解答很不错,不过这句我不懂,“还有你用列来改变时,第一例改变时正确,第二次点时,因为第一次已改变,并且好象可能改变某个主键列,主键列是不可改变,你的问题我以前也出现过。”问题好象不是你说的这样,我的数据库里的确没有主键,当列改变时,Cell[i]获取的是当前网格的列号,所以我还需要一个循环依次提取Cell[i]数组里的内容,他们是获取的列号的集合,然后依次更新每列的所有行,我觉得思路好象还可以,只是实现不了。我会考虑添加一个主键ID,那样的话好象必须得获取行号而不是列号了,因为只有行号和主键ID才能对应的上,这样我就得要限制一次可修改的行数了,不过大批量修改的可能性也不大,主要是修改出错的内容,然后把主键ID加到WHERE里面作为条件,不知道这个思路对不对,请huan_jinwu指点,另外,你做过的那段程序能不能给我看看,我只要那一段,发到或者贴在这里如果不涉及商业秘密的话,不胜感激。2002pine我更新的程序里面有where了,只是好象不对。
      

  11.   

    我终于想明白了,下面是我的更该过的程序,但是还是有问题,不过问题已经变了:
    OleDbConnection conn;
    DataSet ds;
    OleDbDataAdapter da;
    private void buttonShowAll_Click(object sender, System.EventArgs e)
    {
    string Src="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Invoice.mdb";
    string Invoice="SELECT * FROM invoice";
    conn=new OleDbConnection(Src);
    da=new OleDbDataAdapter(Invoice,conn);
    ds=new DataSet();
    da.Fill(ds,"invoice");
    dataGridInvoice.SetDataBinding(ds,"invoice");
    }
    private void buttonUpdate_Click(object sender, System.EventArgs e)
    {
    string Upt="UPDATE invoice SET 购货单位=@购货单位,日期=@日期,货名及规格=@货名及规格,单位=@单位,数量=@数量,单价=@单价,金额=@金额,图片位置=@图片位置,备注=@备注,旋转=@旋转 WHERE 编号=@编号";
    da.UpdateCommand=new OleDbCommand(Upt,conn);
    OleDbParameter Para;
    Para=da.UpdateCommand.Parameters.Add("@编号",OleDbType.BigInt);
    Para.SourceColumn="编号";
    Para.SourceVersion=DataRowVersion.Original;
    Para=da.UpdateCommand.Parameters.Add("@购货单位",OleDbType.VarChar);
    Para.SourceColumn="购货单位";
    Para.SourceVersion=DataRowVersion.Current;
    Para=da.UpdateCommand.Parameters.Add("@日期",OleDbType.VarChar);
    Para.SourceColumn="日期";
    Para.SourceVersion=DataRowVersion.Current;
    Para=da.UpdateCommand.Parameters.Add("@货名及规格",OleDbType.VarChar);
    Para.SourceColumn="货名及规格";
    Para.SourceVersion=DataRowVersion.Current;
    Para=da.UpdateCommand.Parameters.Add("@单位",OleDbType.VarChar);
    Para.SourceColumn="单位";
    Para.SourceVersion=DataRowVersion.Current;
    Para=da.UpdateCommand.Parameters.Add("@数量",OleDbType.VarChar);
    Para.SourceColumn="数量";
    Para.SourceVersion=DataRowVersion.Current;
    Para=da.UpdateCommand.Parameters.Add("@单价",OleDbType.VarChar);
    Para.SourceColumn="单价";
    Para.SourceVersion=DataRowVersion.Current;
    Para=da.UpdateCommand.Parameters.Add("@金额",OleDbType.VarChar);
    Para.SourceColumn="金额";
    Para.SourceVersion=DataRowVersion.Current;
    Para=da.UpdateCommand.Parameters.Add("@图片位置",OleDbType.VarChar);
    Para.SourceColumn="图片位置";
    Para.SourceVersion=DataRowVersion.Current;
    Para=da.UpdateCommand.Parameters.Add("@备注",OleDbType.VarChar);
    Para.SourceColumn="备注";
    Para.SourceVersion=DataRowVersion.Current;
    Para=da.UpdateCommand.Parameters.Add("@旋转",OleDbType.VarChar);
    Para.SourceColumn="旋转";
    Para.SourceVersion=DataRowVersion.Current;
    da.Update(ds,"invoice");
    }可是还有运行错误,提示是:"标准表达式中数据类型不匹配",我的Invoice.mdb文件中只有“编号“字段是“自动编号”,类型是“长整型”,其他全为文本,不知道怎么就类型不匹配,把所有的OleDbType.VarChar改为OleDbType.Char提示不变。另外,“编号”字段不能设成主键,否则,提示错误:“并发冲突:UpdateCommand影响0个记录”,什么问题,我真的不知道为什么了。
      

  12.   

    搞定了,原来datagrid绑定的数据顺序应该和update的顺序一致,而且where子句里的那个数据在parameter参数里面也排在最后,终于被我发现,成功更新了,这下插入,删除,更新都没问题了,多谢各位了,结贴.