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.
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.