Оператор INSERT INTO из Excel в таблицу SQL Server с использованием VBA - PullRequest
0 голосов
/ 19 октября 2018

Приведенный ниже код предназначен для простого добавления строк информации из листа Excel в таблицу в SQL Server.Это утомительно написано, где он идет ряд за рядом и клетка за клеткой.Он работает без всплывающих окон с ошибками, но когда я проверяю таблицу на наличие данных, там ничего нет.

Я запрашивал проверку в SQL с помощью предложения WHERE, и поле «Аналитик» должно совпадать с моим именем.Ничего не выскакивает

Почему мои данные не отображаются в таблице? И Я открыт, чтобы выслушать чьи-либо предложения о лучших способах сделать это.Спасибо!

Public Sub ConnectToDB()
    Dim DBCONT As Object
    Dim strConn As String
    Dim Server_Name As String
    Dim Database_Name As String
    Dim Table_Name As String
    Dim User_ID As String
    Dim Password As String
    Dim strSQL As String
    Dim rs As Object
    Dim Fields As String
    Dim LastRowAudit As Long
    Dim i As Long

    Dim sAuditType, sClaimeReceivedDate, sDateAssigned, sDateCompleted, sAnalyst, sCustomer, sID, sAffiliate, sFacility, sDEA, sAcctNumber, sWholesaler, sVendor, sProduct, sNDC, sRef, sClaimedContract, sClaimedContractCost, sContractPriceStartDate, sContractPriceEndDate, sCatalogNumber, sInvoiceNumber, sInvoiceDate, sChargebackID, sContractIndicator, sUnitCost, sWAC, sPotentialCreditDue, sQTY, sSpend, sIpDshIndicator, sDSHorHRSANumber, sUniqueGPOCode, sComment, sResCode, sCorrectCost, sCRRBCM, sCRRBRebill, sCRRBDate As String

'   SET ALL VARIABLES
    Server_Name = "I have this in my actual code" ' Enter your server name here
    Database_Name = "I have this in my actual code" ' Enter your database name here
    Table_Name = "I have this in my actual code"
    User_ID = "I have this in my actual code" ' enter your user ID here
    Password = "I have this in my actual code" ' Enter your password here


    WkbName = ThisWorkbook.Name
    SheetName = "Audit Data" '  WHERE RS IS


'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'   SET SQL STRING

    strSQL = "INSERT INTO " & Database_Name & ".[dbo]." & Table_Name & _
    " ([Audit],[Audit Type],[Claim Received Date],[Date Assigned],[Date Completed]," & _
    " [Analyst],[Customer],[ID],[Affiliate],[Facility],[DEA],[Acct Number],[Wholesaler],[Vendor],[Product],[NDC],[Ref],[Claimed Contract]," & _
    " [Claimed Contract Cost],[Contract Price Start Date],[Contract Price End Date],[Catalog Number],[Invoice Number],[Invoice Date]," & _
    " [Chargeback ID],[Contract Indicator],[Unit Cost],[WAC],[Potential Credit Due],[Qty],[Spend],[IP-DSH indicator Y/N]," & _
    " [DSH and/or HRSA Number],[Unique GPO Code],[Comment],[ResCode],[Correct Cost],[CRRB CM],[CRRB Rebill],[CRRB Date])" & _
    " VALUES ('" & sAudit & "', '" & sAuditType & "', '" & sClaimeReceivedDate & "', '" & sDateAssigned & "', '" & sDateCompleted & "', '" & sAnalyst & "', '" & sCustomer & "', '" & sID & "', '" & sAffiliate & "', '" & sFacility & "', '" & sDEA & "', '" & sAcctNumber & "', '" & sWholesaler & "', '" & sVendor & "', '" & sProduct & "', '" & sNDC & "', '" & sRef & "', '" & sClaimedContract & "', '" & sClaimedContractCost & "', '" & sContractPriceStartDate & "', '" & sContractPriceEndDate & "', '" & sCatalogNumber & "', '" & sInvoiceNumber & "', '" & sInvoiceDate & "', '" & sChargebackID & "', '" & sContractIndicator & "', '" & sUnitCost & "', '" & sWAC & "', '" & sPotentialCreditDue & "', '" & sQTY & "', '" & sSpend & "', '" & sIpDshIndicator & "', '" & sDSHorHRSANumber & "', '" & sUniqueGPOCode & "', '" & sComment & "', '" & sResCode & "', '" & sCorrectCost & "', '" & sCRRBCM & "', '" & sCRRBRebill & "', '" & sCRRBDate & "')"


    Debug.Print strSQL

'   SET TO CONNECTION VARIABLES
    Set DBCONT = CreateObject("ADODB.Connection")
    Set rs = CreateObject("ADODB.Recordset")

'   LOOP THROUGH AND APPEND TO TABLE
    ThisWorkbook.Worksheets("Audit Data").Select
    LastRowAudit = Cells(Cells.Rows.Count, "A").End(xlUp).Row

    With ActiveSheet

    DBCONT.Open "Driver={SQL Server};Server=" & Server_Name & ";Database=" & Database_Name & _
    ";Uid=" & User_ID & ";Pwd=" & Password & ";"



        For i = 2 To LastRowAudit
            sAudit = Cells(i, 1)
            sAuditType = Cells(i, 2)
            sClaimeReceivedDate = Cells(i, 3)
            sDateAssigned = Cells(i, 4)
            sDateCompleted = Cells(i, 5)
            sAnalyst = Cells(i, 6)
            sCustomer = Cells(i, 7)
            sID = Cells(i, 8)
            sAffiliate = Cells(i, 9)
            sFacility = Cells(i, 10)
            sDEA = Cells(i, 11)
            sAcctNumber = Cells(i, 12)
            sWholesaler = Cells(i, 13)
            sVendor = Cells(i, 14)
            sProduct = Cells(i, 15)
            sNDC = Cells(i, 16)
            sRef = Cells(i, 17)
            sClaimedContract = Cells(i, 18)
            sClaimedContractCost = Cells(i, 19)
            sContractPriceStartDate = Cells(i, 20)
            sContractPriceEndDate = Cells(i, 21)
            sCatalogNumber = Cells(i, 22)
            sInvoiceNumber = Cells(i, 23)
            sInvoiceDate = Cells(i, 24)
            sChargebackID = Cells(i, 25)
            sContractIndicator = Cells(i, 26)
            sUnitCost = Cells(i, 27)
            sWAC = Cells(i, 28)
            sPotentialCreditDue = Cells(i, 29)
            sQTY = Cells(i, 30)
            sSpend = Cells(i, 31)
            sIpDshIndicator = Cells(i, 32)
            sDSHorHRSANumber = Cells(i, 33)
            sUniqueGPOCode = Cells(i, 34)
            sComment = Cells(i, 35)
            sResCode = Cells(i, 36)
            sCorrectCost = Cells(i, 37)
            sCRRBCM = Cells(i, 38)
            sCRRBRebill = Cells(i, 39)
            sCRRBDate = Cells(i, 40)



            DBCONT.Execute strSQL

         Next i
    End With

    Call CloseDB

    MsgBox i & " Lines Imported."

End Sub

Sub CloseDB()
    On Error Resume Next
    rs.Close
    Set rs = Nothing
    DBCONT.Close
    Set DBCONT = Nothing
End Sub

Ответы [ 2 ]

0 голосов
/ 19 октября 2018

Пересмотрите свою сложную миграцию Excel на SQL Server для нескольких решений:

  1. SQL Server : сохранение данных Excel в текстовом формате (.txt, .tab,.csv) и использовать любое количество операций массовой обработки SQL Server: утилита bcp , OPENROWSET , OPENDATASOURCE , мастер импорта и БОЛЬШАЯ ВСТАВКА .Поместите этот процесс в хранимую процедуру, которая будет выполняться внутри базы данных.

    Ниже приведены два эквивалентных OPENROWSET примера в книгах Excel, в которых не обрабатываются отдельные значения, но выполняются операции всей таблицы:

    -- OLEDB PROVIDER
    INSERT INTO mySQLServerTable (Col1, Col2, Col3, ...) 
    SELECT COl1, Col2, Col3, ... 
    FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0',
        'Excel 12.0; Database=C:\Path\To\Excel\Workbook.xlsx; HDR=YES; IMEX=1', [Sheet$]);
    
    -- ODBC DRIVER
    INSERT INTO mySQLServerTable (Col1, Col2, Col3, ...) 
    SELECT COl1, Col2, Col3, ...
    FROM OPENROWSET('MSDASQL',
         'Driver={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};
          DBQ=C:\Path\To\Excel\Workbook.xlsx', 'SELECT * FROM [Sheet$]');
    
  2. MS Access : использовать одноуровневую базу данных Excel, Access, как посредник между источником и источником назначения.В частности, лист Excel и таблица SQL Server должны быть связанными таблицами , где можно выполнить простой запрос на добавление:

    INSERT mySQLServerTable (Col1, Col2, Col3, ...) 
    SELECT Col1, COl2, Col3 ... 
    FROM myExcelTable
    
  3. MS Excel : Если вам нужно работать в Excel, используйте параметризацию с объектом команды ADO и избегайте необходимости объединять значения VBA в код SQL с многочисленными вложенными кавычками.

    ... same as above...
    
    ' PREPARED STATEMENT
    strSQL = "INSERT INTO " & Database_Name & ".[dbo]." & Table_Name & _
             "    ([Audit], [Audit Type], [Claim Received Date], [Date Assigned], [Date Completed]," & _
             "     [Analyst], [Customer], [ID], [Affiliate], [Facility], [DEA], [Acct Number], [Wholesaler]," & _
             "     [Vendor], [Product], [NDC], [Ref], [Claimed Contract], [Claimed Contract Cost]," & _
             "     [Contract Price Start Date], [Contract Price End Date], [Catalog Number], [Invoice Number], [Invoice Date]," & _
             "     [Chargeback ID], [Contract Indicator], [Unit Cost],[WAC], [Potential Credit Due]," & _
             "     [Qty], [Spend],[IP-DSH indicator Y/N], [DSH and/or HRSA Number], [Unique GPO Code]," & _ 
             "     [Comment],[ResCode],[Correct Cost],[CRRB CM],[CRRB Rebill],[CRRB Date])" & _
             " VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?," _
             "         ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"
    
    DBCONT.Open ...
    
    Set sh = ActiveSheet
    
    For i = 2 To LastRowAudit
        Set cmd = CreateObject("ADODB.Command")
    
        With cmd
          .ActiveConnection = DBCONT   ' CONNECTION OBJECT
          .CommandText = strSQL        ' SQL STRING     
          .CommandType = adCmdText
    
          ' BINDING PARAMETERS
          .Parameters.Append .CreateParameter("sAuditParam", adVarChar, adParamInput, 255, sh.Cells(i, 1))
          .Parameters.Append .CreateParameter("sAuditTypeParam", adVarChar, adParamInput, 255, sh.Cells(i, 2))
          .Parameters.Append .CreateParameter("sClaimeReceivedDateParam", adVarChar, adParamInput, 255, sh.Cells(i, 3))
    
           '... rest of parameters
    
          .Execute                     ' RUN ACTION
        End With
    
        Set cmd = Nothing
    Next i
    
0 голосов
/ 19 октября 2018

Вы уже построили strSQL, используя пустые переменные, и никогда не обновляете его после этого, поэтому он остается таким.

Вам необходимо вставлять значения полей каждый раз в цикле.

Переместить это:

strSQL = "INSERT INTO " & Database_Name & ".[dbo]." & Table_Name & _
'etc etc

до

DBCONT.Execute strSQL
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...