none
C#批量插入Access数据库最快的方法 RRS feed

答案

  • 请教高手,C#批量插入Access数据库最高效的方法! 谢谢

    希望能给出部分代码!


    建议你使用类似“存储过程”一样的功能(在Access中是“查询”)。

    我用2012做了示例代码——我的查询语句:insert into tb_demo(tname)values(@tname)

    public class Program
            {
                static void Main(string[] args)
                {
                    using (OleDbCommand cmd = new OleDbCommand("DoInsert", new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=d:\\MyTest.mdb;Persist Security Info=False;")))
                    {
                        cmd.CommandType = CommandType.StoredProcedure;
                        cmd.Connection.Open();
                        OleDbTransaction trans = null;
    
                        trans = cmd.Connection.BeginTransaction();
                        cmd.Transaction = trans;
                        cmd.Parameters.Add("@tname", OleDbType.VarWChar);
                        //插入1000个数据
                        for (int i = 1; i < 1001; i++)
                        {
                            cmd.Parameters["@tname"].Value = i;
                            cmd.ExecuteNonQuery();
                        }
                        trans.Commit();
                        cmd.Connection.Close();
                        Console.WriteLine("OK");
                    }
                }
            }

    【制作Access中的“存储过程”——查询】


       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2012年5月12日 9:32
    版主
  • 应该也一样吧——可以创建一个查询,然后最多连接字符串改成Provider=Microsoft.Jet.OLEDB4.0啥的,可以查询:http://www.connectionstrings.com/access

       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    • 已标记为答案 yyyukai 2012年5月15日 4:42
    2012年5月14日 2:47
    版主

全部回复

  • 没有最高效的这一说法吧.. 试试下面的方法...就是先构造好插入语句..然后最后一次执行..减少与数据库交互。。这样速度应该还不赖!

    OleDbConnection conn = new OleDbConnection("数据库连接字符串"); conn.Open(); OleDbCommand cmd = new OleDbCommand("", conn); try { for (循环语句) { cmd.CommandText += "插入语句"; }

     cmd.ExecuteNonQuery(); } catch { } finally { conn.Close(); }




    2012年5月9日 3:39
    版主
  • 恩 目前是用的这个方法! 但是销量不是很理想!

    下面是目前的代码

    OleDbConnection inconn = new OleDbConnection("数据库链接");
    inconn.Open();
    OleDbTransaction myTrans = inconn.BeginTransaction();
    OleDbCommand incmd = inconn.CreateCommand();
    incmd.Transaction = myTrans;
    string time = DateTime.Now.ToString();
    string content = txtSmsContent.Text.ToString();
    plbar.Visible = true;
    for (int i = 0; i < tb.Rows.Count; i++)
    {
        incmd.CommandText = "insert into ...";
    incmd.ExecuteNonQuery();
    }
    myTrans.Commit();

    2012年5月9日 4:03
  • incmd.ExecuteNonQuery();

    这句话移动到for循环外面..一次性执行插入

    incmd.CommandText = "insert into ...";改成

    incmd.CommandText += " insert into ...";

    这样效率会好一些...试试看咯!

    2012年5月9日 8:53
    版主
  • OleDbConnection inconn = new OleDbConnection("数据库链接");
    inconn
    .Open();
    OleDbTransaction myTrans = inconn.BeginTransaction();
    OleDbCommand incmd = inconn.CreateCommand();
    incmd
    .Transaction = myTrans;
    string time = DateTime.Now.ToString();
    string content = txtSmsContent.Text.ToString();
    plbar
    .Visible = true;
    for (int i = 0; i < tb.Rows.Count; i++)
    {
        incmd
    .CommandText = "insert into ...";
    incmd
    .ExecuteNonQuery();
    }
    myTrans
    .Commit();

    将上面的 for 替换为 并行的效率会高许多

     Parallel.ForEach(插入语句集合, url =>
                    {

    incmd.CommandText = "insert into ...";
                        cmd.ExecuteNonQuery(); 
                    });


    爱吃西瓜的小强[mcpd]

    • 已建议为答案 蒙田 2012年5月13日 4:47
    2012年5月9日 9:04
  • incmd.ExecuteNonQuery();

    这句话移动到for循环外面..一次性执行插入

    incmd.CommandText = "insert into ...";改成

    incmd.CommandText += " insert into ...";

    这样效率会好一些...试试看咯!

    执行多条sql语句,一般是用“;”分开的,你用incmd.CommandText += " insert into ...";,请问“;”分号怎么输入呢?最后一句带分号是不能ExecuteNonQuery的。

    • 已编辑 蒙田 2012年5月12日 3:05
    2012年5月12日 2:38
  • incmd.ExecuteNonQuery();

    这句话移动到for循环外面..一次性执行插入

    incmd.CommandText = "insert into ...";改成

    incmd.CommandText += " insert into ...";

    这样效率会好一些...试试看咯!

    执行多条sql语句,一般是用“;”分开的,你用incmd.CommandText += " insert into ...";,请问“;”分号怎么输入呢?最后一句带分号是不能ExecuteNonQuery的。


    在insert into 后面代入“;” 号即可。。最后一句带不带分号都是可以执行的 。。所以不用理会。。每一句话后面都带上分号!
    2012年5月12日 6:52
    版主
  • 请教高手,C#批量插入Access数据库最高效的方法! 谢谢

    希望能给出部分代码!


    建议你使用类似“存储过程”一样的功能(在Access中是“查询”)。

    我用2012做了示例代码——我的查询语句:insert into tb_demo(tname)values(@tname)

    public class Program
            {
                static void Main(string[] args)
                {
                    using (OleDbCommand cmd = new OleDbCommand("DoInsert", new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=d:\\MyTest.mdb;Persist Security Info=False;")))
                    {
                        cmd.CommandType = CommandType.StoredProcedure;
                        cmd.Connection.Open();
                        OleDbTransaction trans = null;
    
                        trans = cmd.Connection.BeginTransaction();
                        cmd.Transaction = trans;
                        cmd.Parameters.Add("@tname", OleDbType.VarWChar);
                        //插入1000个数据
                        for (int i = 1; i < 1001; i++)
                        {
                            cmd.Parameters["@tname"].Value = i;
                            cmd.ExecuteNonQuery();
                        }
                        trans.Commit();
                        cmd.Connection.Close();
                        Console.WriteLine("OK");
                    }
                }
            }

    【制作Access中的“存储过程”——查询】


       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2012年5月12日 9:32
    版主
  • incmd.ExecuteNonQuery();

    这句话移动到for循环外面..一次性执行插入

    incmd.CommandText = "insert into ...";改成

    incmd.CommandText += " insert into ...";

    这样效率会好一些...试试看咯!

    执行多条sql语句,一般是用“;”分开的,你用incmd.CommandText += " insert into ...";,请问“;”分号怎么输入呢?最后一句带分号是不能ExecuteNonQuery的。


    在insert into 后面代入“;” 号即可。。最后一句带不带分号都是可以执行的 。。所以不用理会。。每一句话后面都带上分号!

    我试了一下,总是会提示"在 SQL 语句结尾之后找到字符。",如果去掉“;”就会提示“SQL 语句的结束位置缺少分号 (;)”,把incmd.CommandText += " insert into ...";改成incmd.CommandText = " insert into ...";只加一条记录,命令是成功的。说明“;”不是关键,关键是出在“+”这里。

    • 已编辑 蒙田 2012年5月13日 4:33
    2012年5月13日 3:39
  • incmd.ExecuteNonQuery();

    这句话移动到for循环外面..一次性执行插入

    incmd.CommandText = "insert into ...";改成

    incmd.CommandText += " insert into ...";

    这样效率会好一些...试试看咯!

    执行多条sql语句,一般是用“;”分开的,你用incmd.CommandText+=" insert into ...";,请问“;”分号怎么输入呢?最后一句带分号是不能ExecuteNonQuery的。


    在insert into 后面代入“;” 号即可。。最后一句带不带分号都是可以执行的 。。所以不用理会。。每一句话后面都带上分号!

    我试了一下,总是会提示"在 SQL 语句结尾之后找到字符。",如果去掉“;”就会提示“SQL 语句的结束位置缺少分号 (;)”,把incmd.CommandText+=" insert into ...";改成incmd.CommandText=" insert into ...";只加一条记录,命令是成功的。说明“;”不是关键,关键是出在“+”这里。

    你好 蒙田

    是我的疏忽,access 不支持一次执行多条sql,所以那么写..会错误,关于采用 "存储过程"   也就是 access中的查询

    这样会改善插入速度,但是也没减少与数据库的交互次数。


    2012年5月14日 1:10
    版主
  • 不太明白你的意思能详细说明下吗?
    2012年5月14日 1:36
  • 不太明白你的意思能详细说明下吗?
    我的方法应该可以吧?啊哈哈,我自己试过了……应该速度比较快的……集成查询。

       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2012年5月14日 1:37
    版主
  • 不太明白你的意思能详细说明下吗?
    我的方法应该可以吧?啊哈哈,我自己试过了……应该速度比较快的……集成查询。

       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处


    你的方法可以,问题是access2003呢?
    2012年5月14日 2:45
  • 应该也一样吧——可以创建一个查询,然后最多连接字符串改成Provider=Microsoft.Jet.OLEDB4.0啥的,可以查询:http://www.connectionstrings.com/access

       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    • 已标记为答案 yyyukai 2012年5月15日 4:42
    2012年5月14日 2:47
    版主