我通过查询数据遍历datareader,自定义生成了一个datatable,它的列结构和数据库表结构一致,然后将它添加了到了dataset中,绑定在datagridview上,现在希望界面上修改数据后,点保存能够更新数据库表,请问如何操作?这个dataset不是通过SqlDataAdapter填充的,而是查询数据库后构造的。csdn找到一个问题
自定义的DataTable如何存入SQL Server中同名的空表中? 
http://topic.csdn.net/u/20090311/13/959416E2-C859-499D-B9ED-7C225158A48B.html#r_55717246但这是insert操作,而我想进行更新操作。

解决方案 »

  1.   


    SqlDataAdapter sda = DataAccessBlock.GetDataAdapter() as SqlDataAdapter;
    SqlConnection sc = DataAccessBlock.GetDataConnection() as SqlConnection;
    sda.Fill(dsUpDate数据);
    SqlCommandBuilder scq = new SqlCommandBuilder(sda);
    sda.InsertCommand = scq.GetInsertCommand();
    sda.Update(dsUpDate数据, stTableName);
    dsUpDate数据.Dispose();
      

  2.   

     public static SqlDataAdapter AdapterUpdate(DataTable TableName, string SelectString,string connectionString)
            {
               
                SqlDataAdapter Adapter = new SqlDataAdapter();
                DataTable table = TableName;
                using (SqlConnection connection = new SqlConnection(connectionString))
                {
                    Adapter.SelectCommand = new SqlCommand(SelectString, connection);
                    SqlCommandBuilder builder = new SqlCommandBuilder(Adapter);
                    Adapter.UpdateCommand = builder.GetUpdateCommand();
                    try
                    {
                        Adapter.Update(table);
                        table.AcceptChanges();
                        return Adapter;
                    }
                    catch (Exception ex)
                    {
                        throw new Exception(ex.Message);
                    }
                }
            }
    //调用
    DataTable Table=(DataTable)datagridview1.DataSource;
    string sql="select * from 你要更新的表名"
    AdapterUpdate(Table, sql,数据库连接字串)
      

  3.   

    数据量小的时候可以用,用SqlDataAdapter更新数据时,貌似会把你要更新的表做遍历.
      

  4.   

    得设置 SqlDataAdapter 的 UpdateCommand 属性.
      

  5.   

    回2楼,谢谢你的回答
    有两个地方没看懂
    1.DataAccessBlock是自定义类吗?
    2.sda.Fill(dsUpDate数据);是什么意思? 我的datatable是自己构造的,不是通过sda Fill的
      

  6.   

    6楼打错了,是回复1楼回复2楼,谢谢你的回答你的方法我试了,点保存后报错:不能插入重复键
    我想是不是他执行的是insert操作,而表中有主键 不能重复。
      

  7.   

    我百度许久,找到这样一段话并不是从数据库中先读出一张DataTable,进行一些添加或删除或修改,然后Update(),而是我有一张现成的dataTable,我最初的想法是想让我的这张DataTable和数据库中对应的表进行对比,然后根据两张表的不同之处进行更新,但实际上这是无法实现的,是我最初没有真正明白Update()函数的原理。所以,SqlDataAdapter的Update()方法不是拿数据库中的表和程序中的一个DataTable进行对比更新,而是根据程序中的DataTable中记录的RowState进行更新。我想,2楼得方法,执行报错的原因可能就是,不是拿数据库中的表和程序中的一个DataTable进行对比更新,
    所以执行了insert操作,因为主键不允许重复,所以出错。一个自定义的datatable(和数据库表结构一致)就没有办法能用SqlDataAdapter更新了吗?
      

  8.   

    DataTable  table=(DataTable)datagridview1.DataSource;
    string sql="select * from 你要更新的表名"
    AdapterUpdate(Table, sql,数据库连接字串)
    你用断点可以看看table.Rows里面每个DataRow的属性DataRowState , Adapter.Update会自动更具行状态来更新:包括添加、删除、修改!数据库看看MSDN,上面有源码:public DataSet CreateCmdsAndUpdate(DataSet dataSet, string connectionString,
        string queryString) 
    {
        using (OleDbConnection connection = new OleDbConnection(connectionString))
        {
            OleDbDataAdapter adapter = new OleDbDataAdapter();
            adapter.SelectCommand = new OleDbCommand(queryString, connection);
            OleDbCommandBuilder builder = new OleDbCommandBuilder(adapter);        connection.Open();        DataSet customers = new DataSet();
            adapter.Fill(customers);        //code to modify data in dataset here        adapter.Update(customers);        return customers;
        }
    }