1

我使用 OLEDB 将数据插入到 DB4 .dbf 文件中。插入 13 行几乎需要 1 分钟,这太长了,这个问题只发生在插入一个包含 varchar 20、2 个日期和一个小数的表中。有没有其他更快的方法可以做到这一点?

 foreach (DataRow row in fstathotel.Rows)
            {
                cmd.CommandText = @"insert into fstathote values (" + Convert.ToInt32(row["mpe"]) + ",'" + Convert.ToDateTime(row["date"]) + "','" + row["type"].ToString() + "',?,'" + Convert.ToDateTime(row["edate"]) + "')";
                cmd.Parameters.AddWithValue("parmSlot1", Decimal.Parse(row["value"].ToString()));
                cmd.ExecuteNonQuery();
            }
4

1 回答 1

2

cmd.Parameters.AddWithValue在循环中做。

这意味着在每次迭代时添加一个参数。我不了解 DB4,但我敢打赌 OleDB 驱动程序正试图尽其所能处理额外的额外未使用参数。它成功了,但操作需要更多时间。

请像这样插入cmd.Parameters.Clear(),并判断事情是否运行得更好。

foreach (DataRow row in fstathotel.Rows)
{
    cmd.CommandText = @"insert into fstathote values (" + Convert.ToInt32(row["mpe"]) + ",'" + Convert.ToDateTime(row["date"]) + "','" + row["type"].ToString() + "',?,'" + Convert.ToDateTime(row["edate"]) + "')";
    cmd.Parameters.Clear(); // Clear the parameter list 
    cmd.Parameters.AddWithValue("parmSlot1", Decimal.Parse(row["value"].ToString()));
    cmd.ExecuteNonQuery();
}

此外,我还会尝试将循环包含在数据库事务中。请记住,表上过多的索引不利于插入性能。

于 2013-03-18T16:00:09.690 回答