……
MyDataAdapter.SelectCommand = MyCommand; 
DataSet MyDataSet = new DataSet(); 
MyDataAdapter.Fill(MyDataSet,"table");
OleDbCommandBuilder MyCommandBuild = new OleDbCommandBuilder(MyDataAdapter);//!!注意:关联DataSet和数据库的操作!!!
{
//操作
MyDataSet.Tables["table"].Rows[0][0] = "ss";//更新DataSet中第一行第一列的值
//……
}
MyDataAdapter.Update(MyDataSet,"table");//将DataSet中”table”表中的数据提交给数据库,完成数据库的更新
MyConnection.Close();

解决方案 »

  1.   

    myConn = new OleDbConnection(connStr);
    myDataAdapter = new OleDbDataAdapter();
    myDataAdapter.SelectCommand = new OleDbCommand(str_Sql, myConn);
    myCommandBuilder = new OleDbCommandBuilder(myDataAdapter);myConn.Open();
    myDataAdapter.Update(myDataSet.Tables[0].GetChanges());
    myConn.Close();
      

  2.   

    如果不用OleDbCommandBuilder,有没有办法呢
    我很想知道为什么我的办法不行,我以前用过这种办法的,感觉很好用,不过那个类是操作SQL的,现在是操作DB2的,想想该没有什么问题的,类文件不复杂,用到的代码俺都粑上了
      

  3.   

    用我的方法每次都提示
    "对于不返回任何基表信息的SelectCommand不支持动态SQL生成。"
    不知道这句话是什么意思,有没有解决的办法。
      

  4.   

    >>>"对于不返回任何基表信息的SelectCommand不支持动态SQL生成。"use CommandBuilder, maker your table has a primary keybut see
    Avoiding the CommandBuilder Object
    http://www.theserverside.net/articles/showarticle.tss?id=OptimizingADONETyou can write your own Insert/Delete/Update command, see
    http://www.csharpfriends.com/Articles/getArticle.aspx?articleID=103
      

  5.   

    另外我试了一下,发觉OleDb和Odbc两种方式存在很大差别,如下:
    这是界面层代码:
    string strSQL=string.Format("SELECT * FROM UTEST");
    DataSet ds =db.GetData(strSQL);
    DataRow myRow;
    for(int i=0;i<3;i++)
    {
    myRow=ds.Tables[0].NewRow();
    myRow["TEST"] = i.ToString();
    ds.Tables[0].Rows.Add(myRow);
    }
    bool isOK = db.OdbcUpdate(ds);这是数据层代码:
    public bool OleDbUpdate(DataSet ds)
    {
    try
    {
    DataTable dt = ds.Tables[0];
    string strSQL = string.Format("SELECT * FROM {0}",dt.TableName);
    OleDbDataAdapter da = new OleDbDataAdapter(strSQL, conn != null ? conn : new OleDbConnection(strConn));
    OleDbCommandBuilder MyCB = new OleDbCommandBuilder(da);
    DataSet dss = new DataSet(dt.TableName);
    dss = ds.Copy();
    da.Update(dss,dt.TableName);
    return true;
    }
    catch(Exception ex)
    {
    throw ex;
    }
    }public bool OdbcUpdate(DataSet ds)
    {
    try
    {
    string con = "DSN=bzbjDB;UID=DBO;PWD=DBO;MODE=SHARE;LONGDATACOMPAT=1;GRAPHIC=1;LOBMAXCOLUMNSIZE=2048575;DBALIAS=bzbjDB;";
    OdbcConnection ODBC_conn = new System.Data.Odbc.OdbcConnection(con);
    ODBC_conn.Open(); DataTable dt = ds.Tables[0];
    string strSQL = string.Format("SELECT * FROM {0}",dt.TableName);
    OdbcDataAdapter da = new OdbcDataAdapter(strSQL, ODBC_conn != null ? ODBC_conn : new OdbcConnection(strConn));
    OdbcCommandBuilder MyCB = new OdbcCommandBuilder(da);
    DataSet dss = new DataSet(dt.TableName);
    dss = ds.Copy();
    da.Update(dss,dt.TableName);
    return true;
    }
    catch(Exception ex)
    {
    throw ex;
    }
    }如果我调用OleDbUpdate则失败,
        提示"对于不返回任何基表信息的SelectCommand不支持动态SQL生成。"
    如果我调用OdbcUpdate则成功....
    而且我在界面层写通过dataset更改记录的代码,不能成功执行(现在是通过dataset新增记录的代码可以执行),搞不懂,按照思归的意思应该是都不能执行吧?(因为表里没有primary key)
    这里我比较糊涂,还请大家赐教
      

  6.   

    要用da.update应该注意1、da关联的表要有主键 2、da要与conn关联
    我个人认为使用此功能不是很灵活的而且效率上也不高
    灵活的方式就是构建sql串提交数据库执行,这样就完全避免了前面的限制
    这样操作数据是很容易控制的
      

  7.   

    http://blog.csdn.net/langmafeng/archive/2004/07/02/32287.aspx
      

  8.   

    此问题源于我要往表中插入9条记录,因此想到生成1个这9条记录的DataSet,然后调用1次搞定
    linaren的说法给了我一些启发,不过我还是不很清楚,例如用构建sql串提交数据库执行的示例代码可否提供参考下
    langmafeng的文章我大概看了下,确实是好文章,我已收藏,争取尽快吸收,谢了
      

  9.   

    各位帮帮忙啊
    为什么我这种方式效率不高?
    怎么才能用构建sql串提交数据库执行解决1次插入9条记录?
    为什么OleDbUpdate和OdbcUpdate有截然不同的结果?