C#:SQLiteDataAdapter INSERT很慢

时间:2018-05-15 09:21:51

标签: c# database sqlite ado.net

我有一个JSON文件,包含~25-30K项目,我想保存在sqlite数据库中。 但是,对于15K项,SQLiteDataAdapter类使用包含所有项的DataTable对象更新数据库所花费的时间大约为35分钟。 执行更新的性能受到UpdateBatchSize的限制,在我的情况下为1,当我尝试更改它时,我会收到一个异常,说明"不支持指定的方法"。

以下是更新方法:

        public async Task<bool> SaveTable()
    {
        SQLiteDataAdapter data_adapter = null;
        try
        {

            data_adapter = new SQLiteDataAdapter(sql_cmd);
            data_adapter.UpdateBatchSize = 10;
        }
        catch (Exception e)
        {
            Console.WriteLine("Exception Thrown: " + e.Message);
            return false;
        }

        try
        {
            SQLiteCommandBuilder cmd_bldr = new SQLiteCommandBuilder(data_adapter);
            data_adapter.InsertCommand = cmd_bldr.GetInsertCommand();
            Console.WriteLine(data_adapter.InsertCommand.CommandText);
            data_adapter.AcceptChangesDuringUpdate = true;
            data_adapter.UpdateCommand = data_adapter.InsertCommand;
        }
        catch (Exception e)
        {
            Console.WriteLine("Exception Thrown: " + e.Message);
            return false;
        }

        try
        {
            var size = data_adapter.UpdateBatchSize;
            Console.WriteLine("Updating Table. Batch Size: " + size);
            var rows_updated = data_adapter.Update(data_table);
            Console.WriteLine("Rows Updated: " + rows_updated.ToString());
            data_adapter.Dispose();
        }
        catch(Exception e)
        {
            Console.WriteLine("Exception Thrown: " + e.Message);
            return false;
        }
        return true;
    }

有没有办法可以更改UpdateBatchSize或每秒增加更新次数?

1 个答案:

答案 0 :(得分:1)

我认为您使用SQLiteDataAdapter的方法是错误的。 UpdateBatchSize属性未由SQLite连接器实现,因此无法更改。默认值1表示禁用更新批处理功能。因此,当请求更新时,适配器被强制一行一行地进行慢速运行。

最好的方法是手动执行每个插入命令,但将它们包含在事务中

group_concat()