Note that there are some explanatory texts on larger screens.

plurals
  1. POBig data upload to server, better in chunks?
    text
    copied!<p>I've inherited a set of excel VBA macros that grabs the data from a spreadsheet and uploads the data to a database (SQL DB). The problem is the insane amount of time it takes when the data is "big" (46 columns * 10,500 rows on a particular sheet). It seems to me that it would be better to chunk the data to get it to the database, but is this correct? If so, what would be the best way to go about it? I'm currently trying encapsulating the following code in a for loop that chunks it into 500 rows, but it's not elegant as vba is not my forte.</p> <pre><code> Sub Upload_Claims() Dim SubmissionNumber As Integer Dim LoopVar As Integer, row As Integer Set cnnConn = New ADODB.Connection cnnConn.ConnectionString = "driver={SQL Server};server=" &amp; Server &amp; ";database=happyfunserver" cnnConn.Open SubmissionNumber = Sheets("Quality Check").Range("SubID").Value 'Upload HPL - PPL Set cmdCommand = New ADODB.Command Set cmdCommand.ActiveConnection = cnnConn With cmdCommand .CommandText = "Select * from losses where submission_id = " &amp; SubmissionNumber .CommandType = adCmdText .Execute End With ' Open the recordset. Set rstRecordset = New ADODB.Recordset Set rstRecordset.ActiveConnection = cnnConn rstRecordset.Open cmdCommand, , adOpenStatic, adLockBatchOptimistic 'upload ' Sheets("PL").Select row = 8 Do While Range("C" &amp; row).Value &lt;&gt; vbNullString With rstRecordset .AddNew .Fields("submission_id") = SubmissionNumber If Range("A" &amp; row).Value &lt;&gt; vbNullString Then .Fields("tag_id") = Range("A" &amp; row).Value End If If Range("B" &amp; row).Value &lt;&gt; vbNullString Then .Fields("batch_tag_id") = Range("B" &amp; row).Value End If If Range("C" &amp; row).Value &lt;&gt; vbNullString Then .Fields("source") = Left(Range("C" &amp; row).Value, 250) End If If IsDate(Range("D" &amp; row).Value) Then .Fields("evaluation_date") = Range("D" &amp; row).Value End If If Range("E" &amp; row).Value &lt;&gt; vbNullString Then If Range("E" &amp; row).Value = "HPL" Then .Fields("coverage_type_id") = 22 ElseIf Range("E" &amp; row).Value = "PL" Then .Fields("coverage_type_id").Value = 2 End If End If '--------------' If Range("F" &amp; row).Value &lt;&gt; vbNullString Then .Fields("claim_no") = Left(Range("F" &amp; row).Value, 250) End If If Range("G" &amp; row).Value &lt;&gt; vbNullString Then .Fields("claimant") = Left(Range("G" &amp; row).Value, 200) End If 'upload layer' If Range("H" &amp; row).Value &lt;&gt; vbNullString Then If UCase(Range("H" &amp; row).Value) = "UNKNOWN" Then .Fields("layer_id") = 0 ElseIf UCase(Range("H" &amp; row).Value) = "AAA" Then .Fields("layer_id") = 1 ElseIf UCase(Range("H" &amp; row).Value) = "BBBBBB" Then .Fields("layer_id") = 2 ElseIf UCase(Range("H" &amp; row).Value) = "CCCCC" Then .Fields("layer_id") = 3 ElseIf UCase(Range("H" &amp; row).Value) = "DDDDDDDD" Then .Fields("layer_id") = 4 ElseIf UCase(Range("H" &amp; row).Value) = "EEE" Then .Fields("layer_id") = 5 End If End If '-------------------' If Range("I" &amp; row).Value &lt;&gt; vbNullString Then .Fields("aaaaaaaa_name") = Left(Range("I" &amp; row).Value, 100) End If If IsNumeric(Range("J" &amp; row).Value) And Range("J" &amp; row).Value &lt;&gt; 0 Then .Fields("bbb_id") = Left(Range("J" &amp; row).Value, 7) End If If Not IsError(Range("K" &amp; row).Value) Then .Fields("ccc_id_verified") = Range("K" &amp; row).Value End If If Not IsError(Range("L" &amp; row).Value) Then If Range("L" &amp; row).Value &lt;&gt; vbNullString And Range("L" &amp; row).Value &lt;&gt; 0 Then .Fields("dddddddd_city") = Left(Range("L" &amp; row).Value, 80) End If End If If Range("M" &amp; row).Value &lt;&gt; vbNullString And Range("M" &amp; row).Value &lt;&gt; 0 Then .Fields("eeeeeeee_fips") = Left(Range("M" &amp; row).Value, 5) End If If Not IsError(Range("N" &amp; row).Value) Then If Range("N" &amp; row).Value &lt;&gt; vbNullString And Range("N" &amp; row).Value &lt;&gt; 0 Then .Fields("ffffffff_stateabbr") = Left(Range("N" &amp; row).Value, 2) End If End If If IsDate(Range("O" &amp; row).Value) Then .Fields("gggggggg_date") = Range("O" &amp; row).Value End If If IsDate(Range("P" &amp; row).Value) Then .Fields("hhhhhh_date") = Range("P" &amp; row).Value End If If IsNumeric(Range("Q" &amp; row).Value) Or Range("Q" &amp; row).Value = 0 Then .Fields("iiiiiiiii_paid") = Range("Q" &amp; row).Value End If If IsNumeric(Range("R" &amp; row).Value) Or Range("R" &amp; row).Value = 0 Then .Fields("jjjjjjjjj_reserve") = Range("R" &amp; row).Value End If If IsNumeric(Range("S" &amp; row).Value) Or Range("S" &amp; row).Value = 0 Then .Fields("kkkk_paid") = Range("S" &amp; row).Value End If If IsNumeric(Range("T" &amp; row).Value) Or Range("T" &amp; row).Value = 0 Then .Fields("llll_reserve") = Range("T" &amp; row).Value End If 'upload claim status' If Range("U" &amp; row).Value &lt;&gt; vbNullString Then If UCase(Range("U" &amp; row).Value) = "CLOSED" Then .Fields("status_id") = 1 ElseIf UCase(Range("U" &amp; row).Value) = "OPEN" Then .Fields("status_id") = 0 ElseIf UCase(Range("U" &amp; row).Value) = "REOPEN" Then .Fields("status_id") = 2 End If End If '---------------------------' If IsDate(Range("V" &amp; row).Value) Then .Fields("closed_date") = Range("V" &amp; row).Value End If If Range("W" &amp; row).Value &lt;&gt; vbNullString Then .Fields("description") = Range("W" &amp; row).Value End If If IsNumeric(Range("AN" &amp; row).Value) Then .Fields("manual") = Range("AN" &amp; row).Value End If If IsNumeric(Range("AB" &amp; row).Value) Then .Fields("11111") = Range("AB" &amp; row).Value End If If IsNumeric(Range("AC" &amp; row).Value) Then .Fields("2222222") = Range("AC" &amp; row).Value End If If IsNumeric(Range("AD" &amp; row).Value) Then .Fields("33333333333") = Range("AD" &amp; row).Value End If If IsNumeric(Range("AE" &amp; row).Value) Then .Fields("444444444") = Range("AE" &amp; row).Value End If If IsNumeric(Range("AF" &amp; row).Value) Then .Fields("55555555") = Range("AF" &amp; row).Value End If If IsNumeric(Range("AG" &amp; row).Value) Then .Fields("666666666") = Range("AG" &amp; row).Value End If If IsNumeric(Range("AH" &amp; row).Value) Then .Fields("7777777777777") = Range("AH" &amp; row).Value End If If IsNumeric(Range("AI" &amp; row).Value) Then .Fields("other") = Range("AI" &amp; row).Value End If If IsNumeric(Range("AJ" &amp; row).Value) Then .Fields("88") = Range("AJ" &amp; row).Value End If If IsNumeric(Range("AK" &amp; row).Value) Then .Fields("cause") = Range("AK" &amp; row).Value End If If IsNumeric(Range("AL" &amp; row).Value) Then .Fields("dept") = Range("AL" &amp; row).Value End If If IsNumeric(Range("AM" &amp; row).Value) Then .Fields("outcome") = Range("AM" &amp; row).Value End If If IsNumeric(Range("AS" &amp; row).Value) Then .Fields("report_lag") = Range("AS" &amp; row).Value End If If IsNumeric(Range("AT" &amp; row).Value) Then .Fields("closed_lag") = Range("AT" &amp; row).Value End If .Update End With row = row + 1 If row Mod 25 = 0 Then Application.StatusBar = "PL" &amp; " - " &amp; row DoEvents End If Loop Application.StatusBar = "Performing " &amp; "PL" &amp; " Batch Update..." rstRecordset.UpdateBatch '(Similar loop repeats for 5 different pieces) End Sub </code></pre> <p>Any advice is appreciated. I tried to keep it short, but it's hard when you don't know what you are really doing or what direction to go.</p>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload