0

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

我正在使用的代码每秒大约需要 8 行。这是无法忍受的。

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

     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();
        }

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

4

3 回答 3

0

由于您没有按照应有的方式使用 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;
        }
    }   
}

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

于 2013-11-08T12:13:57.613 回答
0

SqlCeResultSet.InsertSqlCeUpdatableRecord. _ 这个答案演示了这个过程。

于 2013-11-08T12:19:59.590 回答
0

而不是为每个条目打开/关闭数据库,而是在 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/en-us/library/system.data.sqlserverce.sqlcecommand.transaction%28v=vs.100%29.aspx

于 2013-11-09T09:07:17.637 回答