简体   繁体   中英

How to create a loop to upload from Excel into PostgresSQL table

I have an excel table and a Postgres table that match identically. So far I wrote code that will successfully insert the first line in the excel table into the Postgres table. What I need help with is creating a loop to do this until it reaches the final row of the excel range. I've tried some things but can't seem to get it to work. The code is here below:

Also open to other ideas for doing this more efficiently. If there is a different way to do this, it would be great, because if you have a table with a ton of columns this process would be really inefficient.

Sub Upload_Records()

'Open Connection
  Dim conn As ADODB.Connection
  Dim cmd As ADODB.Command
  Set conn = New ADODB.Connection
  conn.ConnectionString = "DSN=vsbslgprd01;DATABASE=postgres;SERVER=vsbslgprd01.zmr.zimmer.com;PORT=5432;UID=breedenz;PWD=110percent;"
  conn.Open
  
  Set cmd = New ADODB.Command
  cmd.ActiveConnection = conn
  cmd.CommandText = "insert into asset_management.expired_recalled values(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"
  
'Set Parameters (Columns)
  Dim LRow As Long
  Dim pm1 As ADODB.Parameter
  Dim pm2 As ADODB.Parameter
  Dim pm3 As ADODB.Parameter
  Dim pm4 As ADODB.Parameter
  Dim pm5 As ADODB.Parameter
  Dim pm6 As ADODB.Parameter
  Dim pm7 As ADODB.Parameter
  Dim pm8 As ADODB.Parameter
  Dim pm9 As ADODB.Parameter
  Dim pm10 As ADODB.Parameter
  Dim pm11 As ADODB.Parameter
  Dim pm12 As ADODB.Parameter
  Dim pm13 As ADODB.Parameter
  Dim pm14 As ADODB.Parameter
  Dim pm15 As ADODB.Parameter
  Dim pm16 As ADODB.Parameter
  Dim pm17 As ADODB.Parameter
  Dim pm18 As ADODB.Parameter
  Dim pm19 As ADODB.Parameter
  Dim pm20 As ADODB.Parameter
  Dim pm21 As ADODB.Parameter
  Dim pm22 As ADODB.Parameter
  Dim pm23 As ADODB.Parameter
  Dim pm24 As ADODB.Parameter
  Dim pm25 As ADODB.Parameter
  Dim pm26 As ADODB.Parameter
  Dim pm27 As ADODB.Parameter
  
  Set pm1 = cmd.CreateParameter("run_date", adVarChar, adParamInput, 1000)
  pm1.Value = Sheets("Load").Range("H3").Value
  cmd.Parameters.Append pm1
  
  Set pm2 = cmd.CreateParameter("legacy", adVarChar, adParamInput, 1000)
  pm2.Value = Sheets("Load").Range("I3").Value
  cmd.Parameters.Append pm2
  
  Set pm3 = cmd.CreateParameter("bucket", adVarChar, adParamInput, 1000)
  pm3.Value = Sheets("Load").Range("J3").Value
  cmd.Parameters.Append pm3
  
  Set pm4 = cmd.CreateParameter("terr", adVarChar, adParamInput, 1000)
  pm4.Value = Sheets("Load").Range("K3").Value
  cmd.Parameters.Append pm4
  
  Set pm5 = cmd.CreateParameter("dist_name", adVarChar, adParamInput, 1000)
  pm5.Value = Sheets("Load").Range("L3").Value
  cmd.Parameters.Append pm5
  
  Set pm6 = cmd.CreateParameter("site", adVarChar, adParamInput, 1000)
  pm6.Value = Sheets("Load").Range("M3").Value
  cmd.Parameters.Append pm6
  
  Set pm7 = cmd.CreateParameter("team_name", adVarChar, adParamInput, 1000)
  pm7.Value = Sheets("Load").Range("N3").Value
  cmd.Parameters.Append pm7
  
  Set pm8 = cmd.CreateParameter("location", adVarChar, adParamInput, 1000)
  pm8.Value = Sheets("Load").Range("O3").Value
  cmd.Parameters.Append pm8
  
  Set pm9 = cmd.CreateParameter("contained_in", adVarChar, adParamInput, 1000)
  pm9.Value = Sheets("Load").Range("P3").Value
  cmd.Parameters.Append pm9
  
  Set pm10 = cmd.CreateParameter("customer_number", adVarChar, adParamInput, 1000)
  pm10.Value = Sheets("Load").Range("Q3").Value
  cmd.Parameters.Append pm10
  
  Set pm11 = cmd.CreateParameter("product_group", adVarChar, adParamInput, 1000)
  pm11.Value = Sheets("Load").Range("R3").Value
  cmd.Parameters.Append pm11
  
  Set pm12 = cmd.CreateParameter("item", adVarChar, adParamInput, 1000)
  pm12.Value = Sheets("Load").Range("S3").Value
  cmd.Parameters.Append pm12
  
  Set pm13 = cmd.CreateParameter("item_desc", adVarChar, adParamInput, 1000)
  pm13.Value = Sheets("Load").Range("T3").Value
  cmd.Parameters.Append pm13
  
  Set pm14 = cmd.CreateParameter("lot", adVarChar, adParamInput, 1000)
  pm14.Value = Sheets("Load").Range("U3").Value
  cmd.Parameters.Append pm14
  
  Set pm15 = cmd.CreateParameter("qty", adVarChar, adParamInput, 1000)
  pm15.Value = Sheets("Load").Range("V3").Value
  cmd.Parameters.Append pm15
  
  Set pm16 = cmd.CreateParameter("expiration_date", adVarChar, adParamInput, 1000)
  pm16.Value = Sheets("Load").Range("W3").Value
  cmd.Parameters.Append pm16
  
  Set pm17 = cmd.CreateParameter("ext_list", adVarChar, adParamInput, 1000)
  pm17.Value = Sheets("Load").Range("X3").Value
  cmd.Parameters.Append pm17
  
  Set pm18 = cmd.CreateParameter("possible_financial_impact", adVarChar, adParamInput, 1000)
  pm18.Value = Sheets("Load").Range("Y3").Value
  cmd.Parameters.Append pm18
  
  Set pm19 = cmd.CreateParameter("brand_code", adVarChar, adParamInput, 1000)
  pm19.Value = Sheets("Load").Range("Z3").Value
  cmd.Parameters.Append pm19
  
  Set pm20 = cmd.CreateParameter("due_date", adVarChar, adParamInput, 1000)
  pm20.Value = Sheets("Load").Range("AA3").Value
  cmd.Parameters.Append pm20
  
  Set pm21 = cmd.CreateParameter("scope", adVarChar, adParamInput, 1000)
  pm21.Value = Sheets("Load").Range("AB3").Value
  cmd.Parameters.Append pm21
  
  Set pm22 = cmd.CreateParameter("charge", adVarChar, adParamInput, 1000)
  pm22.Value = Sheets("Load").Range("AC3").Value
  cmd.Parameters.Append pm22
  
  Set pm23 = cmd.CreateParameter("eligible_item", adVarChar, adParamInput, 1000)
  pm23.Value = Sheets("Load").Range("AD3").Value
  cmd.Parameters.Append pm23
  
  Set pm24 = cmd.CreateParameter("prod_release_dom_cde", adVarChar, adParamInput, 1000)
  pm24.Value = Sheets("Load").Range("AE3").Value
  cmd.Parameters.Append pm24
  
  Set pm25 = cmd.CreateParameter("location_type", adVarChar, adParamInput, 1000)
  pm25.Value = Sheets("Load").Range("AF3").Value
  cmd.Parameters.Append pm25
  
  Set pm26 = cmd.CreateParameter("container_type", adVarChar, adParamInput, 1000)
  pm26.Value = Sheets("Load").Range("AG3").Value
  cmd.Parameters.Append pm26
  
  Set pm27 = cmd.CreateParameter("stock_type", adVarChar, adParamInput, 1000)
  pm27.Value = Sheets("Load").Range("AH3").Value
  cmd.Parameters.Append pm27
  
'Execute
  cmd.Execute
  conn.Close
      
    
End Sub

Without re-writing all of your code, I can tell you some tips to get you on the right track.

Your construct is wrong. It works for the one row, yes, of course, but it's not scalable. The proper construct would look like this:

Declare/Open Connection
Declare Command Object
Declare All Parameters
Loop rows
  Assign parameter values
  Execute command object
Close Connection

Also, the parameters will be part of a collection for the command, so you don't need to even access them by name; you can access the values as part of the command's collection ( cmd.Parameters(1).Value = ).

Another tip -- have a lot of rows? Use a transaction and do a single commit at the end.

That brings me to another point. Access the row values by Row, Column instead of range name. This way you can simply loop through the columns and assign the value by the row and column id (you are already looping rows).

Finally, @Belayer had the mic drop moment as well... avoid all of this pain and use copy . Not only is it easier, but it's significantly faster and more efficient on the database side than row by row inserts. I've never done it in VBA, but if you were using .NET it's native to the PostgreSQL superb Npgsql driver.

https://stackoverflow.com/a/66318417/1001884

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM