none
OleDbDataAdapter设置了InsertCommand但是不更新DataTable RRS feed

  • 问题

  • 我是想从一个access文件中读取一些数据,然后保存到另一个access表中。

    先读入DataTable中,然后调用update();

    using (OleDbConnection conrd = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+fileToRead))
                    {
                        OleDbDataAdapter adapter = new OleDbDataAdapter("select * from codeinf order by id", conrd);
    
                        adapter.MissingSchemaAction = MissingSchemaAction.AddWithKey;
    
                        // Create the Insert, Update and Delete commands.
                        adapter.InsertCommand = new OleDbCommand();
                        adapter.InsertCommand.Connection = InitUtility.Connection; //这个Connection是指向我的目标文件的Connection
                        adapter.InsertCommand.CommandText = "INSERT INTO `codeinf` (`username`, `buycode`, `buycount`, `codetype`, `intime`) VALUES (?, ?, ?, ?, ?)";
                        adapter.InsertCommand.Parameters.Add("@username", OleDbType.WChar, 6, "username");
                        adapter.InsertCommand.Parameters.Add("@buycode", OleDbType.WChar, 5, "buycode");
                        adapter.InsertCommand.Parameters.Add("@buycount", OleDbType.Double, 0, "buycount");
                        adapter.InsertCommand.Parameters.Add("@codetype", OleDbType.SmallInt, 0, "codetype");
                        adapter.InsertCommand.Parameters.Add("@intime", OleDbType.Date, 0, "intime");
    
                        DataTable tablerd = new DataTable();
                        adapter.Fill(tablerd );
    
                        int i = adapter.Update(tablerd );
                    }
    发现这样不能插入,为什么呢?
    2009年7月10日 9:26

答案

  • 读取的所有数据行的 RowState 都为 UnChanged ,当然不能更新。尝试遍历所有行将这些行 Add 到一个新的数据集,然后再 Update 那个新的数据集,或者自己生成SQL提交

    知识改变命运,奋斗成就人生!
    • 已标记为答案 GoSurf 2009年7月11日 1:56
    2009年7月10日 13:23
    版主
  • 你好!
        这个InsertCommand属性是用来在数据源中插入行的,你看看数据源中的数据改变了没有!
        如果执行此命令后返回行,这些行可能会添加到 DataSet 中,具体取决于如何设置 OleDbCommand 对象的 UpdatedRowSource 属性。
    周雪峰
    • 已标记为答案 GoSurf 2009年7月11日 1:56
    2009年7月10日 14:19
    版主
  • 您好,如楼上所示,您的代码中为指示要插入哪些行,OleDbDataAdapter是靠判断DataTable中行记录的RowSate状态来做相应的动作。就所示的代码而言需要在tablerd中增加新行。
    同时还有更新和删除的command未完成,并不能发挥OleDbDataAdapter的优势。如果只要简单的插入,可不用采用DataAdapter机制。
    • 已标记为答案 GoSurf 2009年7月11日 1:56
    2009年7月10日 14:21

全部回复

  • 读取的所有数据行的 RowState 都为 UnChanged ,当然不能更新。尝试遍历所有行将这些行 Add 到一个新的数据集,然后再 Update 那个新的数据集,或者自己生成SQL提交

    知识改变命运,奋斗成就人生!
    • 已标记为答案 GoSurf 2009年7月11日 1:56
    2009年7月10日 13:23
    版主
  • 你好!
        这个InsertCommand属性是用来在数据源中插入行的,你看看数据源中的数据改变了没有!
        如果执行此命令后返回行,这些行可能会添加到 DataSet 中,具体取决于如何设置 OleDbCommand 对象的 UpdatedRowSource 属性。
    周雪峰
    • 已标记为答案 GoSurf 2009年7月11日 1:56
    2009年7月10日 14:19
    版主
  • 您好,如楼上所示,您的代码中为指示要插入哪些行,OleDbDataAdapter是靠判断DataTable中行记录的RowSate状态来做相应的动作。就所示的代码而言需要在tablerd中增加新行。
    同时还有更新和删除的command未完成,并不能发挥OleDbDataAdapter的优势。如果只要简单的插入,可不用采用DataAdapter机制。
    • 已标记为答案 GoSurf 2009年7月11日 1:56
    2009年7月10日 14:21
  • 哦。明白了,原来adapter的update是更加row的状态来确定要不要调用insert的。

    我的目的是 读入分机产生的数据文件,然后把这些数据文件中的表都合并到一个主文件的表中。

    我用datareader一条一条的读取,然后插入感觉太慢了,看到dataadapter可以把selectcommand和insertcommand的connection链接设置为不同的值,所以以为可以进行一个读,一个写的操作。

    如果想效率高有什么好的批量插入方法吗?
    2009年7月10日 16:21
  • 确实是简单的插入。感觉DataReader效率太低了。不用DataAdapter机制,那用什么好呢?
    2009年7月10日 16:22
  • 数据源没改变。我把selectcommand和updatecommand设置了不同文件的connection连接了
    2009年7月10日 16:23
  • 你目前这种方式就是比较好的咯也就是一次提交多条数据,减少往返次数
    知识改变命运,奋斗成就人生!
    2009年7月10日 16:37
    版主
  • 确实,如楼上所说如果一次插入多条记录的话DataAdapter机制可以减少往返次数。
    DataAdapter好处还有很多,如果设置好DataAdapter,程序编写起来也会很简单。对于单个表vs还提供了向导生成DataAdapter。
    如果用command,请参考下面代码。
    例如:SqlConnection conn = new SqlConnection(connection);
                try
                {
                    conn.Open();
                    SqlCommand command = new SqlCommand("insert into ......"), conn);
                    command.ExecuteNonQuery();
                }
                finally
                {
                    conn.Close();
                }
    2009年7月10日 17:34