繁体   English   中英

从Windows Mobile 6.1中的文本文件或DataTable批量插入SQL Server CE

[英]Bulk insert in SQL Server CE from text file or DataTable in Windows Mobile 6.1

我想在Windows Mobile 6.1的SQL Server CE中插入超过5个lac记录

我正在使用的代码每秒大约需要8行。 这简直难以忍受。

我的代码如下-我有大约5个lac记录的DataTable

     SqlCeCommand cmd1;
        for (int i = 0; i < table.Rows.Count; i++)
        {
            cmd1 = new SqlCeCommand("Insert into Master values('" + table.Rows[i].ItemArray[0].ToString() + "')", con);
            con.Open();
            cmd1.ExecuteNonQuery();
            con.Close();
        }

请提出更快的替代方法(最好是批量插入)。

由于您没有使用SqlCommand安全地添加参数,因此您应该:

SqlCeCommand command = conn.CreateCommand();
command.CommandText = "INSERT INTO Master (MasterValue) VALUES (@masterValue)";
SqlCeParameter param = null;
param = new SqlCeParameter("@masterValue", SqlDbType.Text);
command.Parameters.Add(param); 
command.Parameters["@masterValue"].Value = table.Rows[i].ItemArray[0].ToString();

您可以使用字符串连接并构建包含所有插入内容的长字符串(这不是一种很干净的方法,但是,如果您知道自己的数据并且不存在不安全地执行插入操作的问题,那么可以选择这样做)

string insert = string.Empty;
for(int i = 0; i < table.rows.Count; i++)
{
    insert += "Insert into Master values('" + table.Rows[i].ItemArray[0].ToString() + "');";
    if(i % 1000 == 0 || i+1 == table.rows.Count)
    {
        using (SqlCommand cmd1 = new SqlCommand(insert, con))
        {
            con.Open();
            cmd1.ExecuteNonQuery();
            con.Close();
            insert = string.Empty;
        }
    }   
}

请注意,每个插入符的末尾都有一个分号,需要单独运行插入符。 将模数调整为一次要插入的数量。

SqlCeResultSet.InsertSqlCeUpdatableRecord一起使用。 该答案演示了该过程。

而不是为每个条目打开/关闭数据库,而是在sqlCommand之前和之后打开:

改变那个

     SqlCeCommand cmd1;
    for (int i = 0; i < table.Rows.Count; i++)
    {
        cmd1 = new SqlCeCommand("Insert into Master values('" + table.Rows[i].ItemArray[0].ToString() + "')", con);
        con.Open();
        cmd1.ExecuteNonQuery();
        con.Close();
    }

 SqlCeCommand cmd1 = new SqlCeCommand();
 con.Open();
 cmd1.Connection = con;
 for (int i = 0; i < table.Rows.Count; i++)
 {
     cmd1.CommandText = "Insert into Master values('" + table.Rows[i].ItemArray[0].ToString() + "')";
     cmd1.ExecuteNonQuery();
 }
 con.Close();

可能会有更快的技术,例如使用参数化查询或封装所有插入并最终提交的事务。

 con.Open();
 SqlCeTransaction tx = conn.BeginTransaction();
 SqlCeCommand cmd1 = con.CreateCommand();
 cmd1.Transaction = tx;
 for (int i = 0; i < table.Rows.Count; i++)
 {
     cmd1.CommandText = "Insert into Master values('" + table.Rows[i].ItemArray[0].ToString() + "')";
     cmd1.ExecuteNonQuery();
 }
 tx.Commit();
 con.Close();

(未经测试的代码根据: http : //msdn.microsoft.com/zh-cn/library/system.data.sqlserverce.sqlcecommand.transaction%28v=vs.100%29.aspx

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM