【问题标题】:How to do bulk insert for over 1000 records using sqlite?如何使用 sqlite 批量插入超过 1000 条记录?
【发布时间】:2010-08-10 10:07:19
【问题描述】:

我正在尝试使用 sqlite 在数据库中插入 11000 条记录,但是尽管程序执行没有错误,但没有插入值。

Dim s As New System.Text.StringBuilder("")

sql = "insert into mulRecords1 (symbol, date_p,open_p,high_p,low_p,close_p,vol_p,oi_p) values ('@symbol', '@date_p','@open_p', '@high_p', '@low_p', '@close_p', '@vol_p', '@oi_p')"

cmd = New SQLiteCommand(sql, cnLite)
cmd.CommandText = sql

For i As Integer = 1 To 11000

cmd.Parameters.AddWithValue("@symbol", "test")
cmd.Parameters.AddWithValue("@date_p", "2010-08-20 12:00:00")
cmd.Parameters.AddWithValue("@open_p", 10)
cmd.Parameters.AddWithValue("@high_p", 10)
cmd.Parameters.AddWithValue("@low_p", 10)
cmd.Parameters.AddWithValue("@close_p", 10)
cmd.Parameters.AddWithValue("@vol_p", 10)
cmd.Parameters.AddWithValue("@oi_p", 10)

Next

cmd.ExecuteNonQuery()

我应该如何插入?

【问题讨论】:

    标签: c# vb.net sqlite


    【解决方案1】:

    您的循环只是一遍又一遍地添加参数,然后执行一次插入,您需要在每次循环迭代时执行查询,例如

    Dim s As New System.Text.StringBuilder("")
    
    sql = "insert into mulRecords1 (symbol, date_p,open_p,high_p,low_p,close_p,vol_p,oi_p) values ('@symbol', '@date_p','@open_p', '@high_p', '@low_p', '@close_p', '@vol_p', '@oi_p')"
    
    
    
    For i As Integer = 1 To 11000
    
    cmd = New SQLiteCommand(sql, cnLite)
    cmd.CommandText = sql
    
    cmd.Parameters.AddWithValue("@symbol", "test")
    cmd.Parameters.AddWithValue("@date_p", "2010-08-20 12:00:00")
    cmd.Parameters.AddWithValue("@open_p", 10)
    cmd.Parameters.AddWithValue("@high_p", 10)
    cmd.Parameters.AddWithValue("@low_p", 10)
    cmd.Parameters.AddWithValue("@close_p", 10)
    cmd.Parameters.AddWithValue("@vol_p", 10)
    cmd.Parameters.AddWithValue("@oi_p", 10)
    
    cmd.ExecuteNonQuery()
    
    Next
    

    这也假设您确实想要插入 11000 个相同的行。

    【讨论】:

      【解决方案2】:

      此时你只需添加参数11000次,然后执行一次命令。

      我怀疑您需要将 cmd.ExecuteNonQuery() 放入循环中(在 Next 之前)。

      【讨论】:

        【解决方案3】:

        有几个问题。

        您需要在 for 循环中调用 ExecuteNonQuery。如果要为每次迭代添加新参数值,请确保在每次迭代中清除参数列表。

        For i As Integer = 1 To 11000
            cmd.Parameters.Clear()
        
            // Add parameter values (I removed for clarity)
        
            cmd.ExecuteNonQuery()
        Next
        

        从参数周围删除单引号 (')。应该是

        sql = "insert into mulRecords1 (symbol, date_p,open_p,high_p,low_p,close_p,vol_p,oi_p) values (@symbol, @date_p,@open_p, @high_p, @low_p, @close_p, @vol_p, @oi_p)"
        

        我为我的代码中的 C# 注释道歉,无法使语法突出显示与 vb 注释一起使用。

        【讨论】:

          【解决方案4】:

          我的猜测是 cmd.ExecuteNonQuery() 应该在下一个之前。现在可能只插入最后一条记录。

          此外,您插入的是所有相同的行,我看不出同一行有 11K 次的意义,这可能是一个错误?

          【讨论】:

            【解决方案5】:

            cmd.ExecuteNonQuery() 是否在每次迭代中执行?

            【讨论】:

              【解决方案6】:

              考虑将您的 For 块更改为

              For i As Integer = 1 To 11000
              
              cmd.Parameters.AddWithValue("@symbol", "test")
              cmd.Parameters.AddWithValue("@date_p", "2010-08-20 12:00:00")
              cmd.Parameters.AddWithValue("@open_p", 10)
              cmd.Parameters.AddWithValue("@high_p", 10)
              cmd.Parameters.AddWithValue("@low_p", 10)
              cmd.Parameters.AddWithValue("@close_p", 10)
              cmd.Parameters.AddWithValue("@vol_p", 10)
              cmd.Parameters.AddWithValue("@oi_p", 10)
              
              cmd.ExecuteNonQuery()
              
              cmd.Parameters.Clear()
              
              Next
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2014-04-13
                • 1970-01-01
                • 1970-01-01
                • 2021-11-21
                • 2019-08-24
                • 1970-01-01
                相关资源
                最近更新 更多