VBA 将数据从 Excel 导出到对应的 SQL 字段的代码

VBA code to export data from Excel to corresponding SQL field

我有一个 Excel VBA 程序可以扫描条形码来打印标签。我想要做的是编写一个子程序,当与其余代码一起执行时,它将采用今天的日期并将其插入 SQL 数据库中的特定日期字段。为了进一步解释 Excel 程序使用了与我们数据库中的订单号相对应的订单号。我不是 100% 确定如何进行此操作,如果有帮助,我可以提供其他信息。

|OrderNo| |TodaysDateFromExcel|   
033707     7/15/2019   

我的VBA代码我目前

Dim conn As New ADODB.Connection

Dim sDate As Date

sDate= Today()

'Open a connection to SQL Server
        conn.Open "Provider=SQLOLEDB;Data Source=ANF-M2MCLIENT;Initial Catalog=ExcelDemo;Integrated Security=SSPI;"

 conn.Execute "insert into dbo.Customers (TodaysDate) values ('" & sDate & "')"

MsgBox "Today's Date imported."

        conn.Close
        Set conn = Nothing

End sub

我假设您有一个稍微规范化的模式 - 像这样:

如果您想 INSERT 一个新的 Order 记录,您需要知道它是针对哪个客户 Id (以及可能为 Order).

INSERT INTO dbo.Orders (CustomerId, OrderNumber, OrderDate) VALUES (?, ?, ?)

如果您的 Customers table 有一个唯一的密钥,例如CustomerNumber,那么你可以从中得到 Id 外键:

INSERT INTO dbo.Orders (CustomerId, OrderNumber, OrderDate) 
SELECT c.Id, ?, ?
FROM dbo.Customers c
WHERE c.Number = ?

如果您想 UPDATE 一个现有的 Order 记录,您需要知道更新的顺序 Id - 假设有一个 自然键 OrderNumber 定义为在 Order 记录中唯一,您可以在给定 OrderNumber 的情况下更新订单的 OrderDate - SQL 命令字符串如下所示:

UPDATE o SET o.OrderDate = ? FROM dbo.Orders o WHERE o.OrderNumber = ?

这需要两个参数,在 VBA 中看起来像这样:

Public Sub SaveOrderDate(ByVal orderNumber As String, ByVal orderDate As Date)

    Dim conn As ADODB.Connection
    Set conn = New ADODB.Connection 'note: avoid auto-instantiated "As New" objects
    conn.ConnectionString = "your connection string"
    conn.Open

    Const sql As String = "UPDATE o SET o.OrderDate = ? WHERE OrderNumber = ?"

    Dim cmd As ADODB.Command
    Set cmd.ActiveConnection = conn
    cmd.CommandType = adCmdTypeText
    cmd.CommandText = sql

    cmd.Parameters.Append cmd.CreateParameter(Type:=adDate, Value:=orderDate)
    cmd.Parameters.Append cmd.CreateParameter(Type:=adVarChar, Value:=orderNumber)

    cmd.Execute
    conn.Close

End Sub

然后您将从宏中调用它,如下所示:

Public Sub Macro1()
    On Error GoTo CleanFail
    SaveOrderDate Sheet1.Cells(1, 1).Value, Sheet1.Cells(1, 2).Value
    MsgBox "Order updated!"
CleanExit:
    Exit Sub
CleanFail:
    MsgBox "Something went wrong, couldn't update the order."
    Debug.Print Err.Description
    Resume CleanExit 'break here to debug (F9 to toggle a breakpoint)
    Resume 'make this the current statement to step through errorring SaveOrderDate call
End Sub

注:未经测试air-code。

Private Sub CommandButton1_Click()

Dim cn_ADO As ADODB.Connection
    Dim cmd_ADO As ADODB.Command
    Set cmd_ADO = New ADODB.Command

    Dim Dbconn As String

    Dim SQLQuery As String
    Dim strWhere As String


    Dim i As Integer
    Dim j As Integer
    Dim jOffset As Integer
    Dim iStartRow As Integer

    'Data Columns
     Dim strOrderNumber As String
     Dim strOrderDate As String

    jOffset = 3
    iStartRow = 2
    i = iStartRow

Dbconn = "Provider=SQLOLEDB;Data Source=ANF-M2MCLIENT;Initial Catalog=ExcelDemo;Integrated Security=SSPI;"


 Set cn_ADO = New ADODB.Connection

 cn_ADO.Open Dbconn

While Cells(i, jOffset).Value <> ""
    strOrderNumber = Cells(i, 0 + jOffset).Value
    strOrderDate = Cells(i, 1 + jOffset).Value

    strWhere = "OrderNumber = " & strOrderNumber

         'Update Statement

         SQLQuery = "update dbo.Orders " & _
                    "set " & _
                    "OrderDate = '" & strOrderDate & "' " & _
                    "where " & strWhere

    cmd_ADO.CommandText = SQLQuery
    cmd_ADO.ActiveConnection = cn_ADO
    cmd_ADO.Execute

    i = i + 1
    Wend


       Set cmd_ADO = Nothing
        Set cn_ADO = Nothing

End Sub