我有一个excel表和一个Postgres表匹配相同。到目前为止,我编写的代码将成功地将excel表中的第一行插入到Postgres表中。我需要帮助的是创建一个循环做到这一点,直到它达到excel范围的最后一行。我试了一些方法,但似乎行不通。代码如下:
也接受其他更有效的方法。如果有一种不同的方法可以做到这一点,那就太好了,因为如果你有一个包含大量列的表,这个过程将非常低效。
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
不需要重写所有的代码,我可以告诉你一些技巧,让你走上正确的轨道。
你的构造是错误的。它只适用于一行,但不能扩展。正确的结构应该是这样的:
Declare/Open Connection
Declare Command Object
Declare All Parameters
Loop rows
Assign parameter values
Execute command object
Close Connection
此外,参数将是命令集合的一部分,因此您甚至不需要通过名称访问它们;您可以作为命令集合(cmd.Parameters(1).Value =
)的一部分访问这些值。
另一个提示——有很多行?使用一个事务,最后只执行一次提交。
这让我想到了另一点。按行、列而不是范围名称访问行值。通过这种方式,您可以简单地循环遍历列并按行和列id分配值(您已经在循环行)。
最后,@Belayer也有丢麦克风的时刻…避免所有这些痛苦,使用copy
。它不仅更简单,而且在数据库端比逐行插入更快、更高效。我从来没有在VBA中做过,但如果你使用。net,它是PostgreSQL优秀的Npgsql驱动程序的本机。
https://stackoverflow.com/a/66318417/1001884