2014-05-20 95 views
0

我在使用SQL Server INSERT查詢時遇到問題。VBA Excel SQL Server INSERT查詢

首先,這裏就是我想實現:

我有產品的Excel工作表,我想導出到MS SQL服務器的列表。

這裏是我試過的代碼:

Dim cn As ADODB.Connection 
Dim rs As ADODB.Recordset 
Dim cmd As ADODB.Command 
Dim Client As String 

Set cn = New ADODB.Connection 
Set cmd = New ADODB.Command 

//Worksheets("Config").cells(1, "B").Value contains the connection string 
cn.Open Worksheets("Config").Cells(1, "B").Value 

cmd.ActiveConnection = cn 
cmd.CommandType = adCmdText 

If Worksheets("Configuration").Cells(2, "B").Value = 1 Then 
    cmd.CommandText = "SELECT * FROM Cardex WHERE NbCardex = ?" 
ElseIf Worksheets("Configuration").Cells(2, "B").Value = 0 Then 
    cmd.CommandText = "SELECT * FROM Cardex WHERE Name = ?" 
End If 

cmd.Prepared = True 
cmd.Parameters.Append cmd.CreateParameter("Client", adVarChar, adParamInput, 250, 
           UCase(Worksheets("Exporter").Cells(2, "B").Value)) 

Set rs = cmd.Execute 

If Not rs.EOF Then 
    Client = rs.Fields("NoCardex").Value 
End If 

rs.Close 

//The code work until it reach this point, The next lines I am not sure what is wrong 
//Hell I'm not even sure what i am doing. 
//Problem is, nothing is added into the table 
Dim cell As Range 
For Each cell In Worksheets("Exporter").Range("Liste") 
    If cell.Row > 4 And Not cell.Value = vbNullString Then 
    Set cmd = New ADODB.Command 

    cmd.ActiveConnection = cn 
    cmd.CommandType = adCmdText 
    cmd.CommandText = "INSERT INTO NewTable(Dte, NbTr, NbClient, NbTr2, NbLine, NbProd, 
         Desc, Qty, Cost, Prc, FlImp, FLDone) 
         VALUES(?Date, ?Trans, ?Client, ?Projet, ?Ligne, ?Prod, ?Desc, 
         ?Qte, ?Cout, ?Vend, ?Imp, 0)" 
    cmd.Prepared = True 

    cmd.Parameters.Append cmd.CreateParameter("Date", adVarChar, adParamInput, 8, Worksheets("Exporter").Cells(1, "E").Value) 
    cmd.Parameters.Append cmd.CreateParameter("Trans", adVarChar, adParamInput, 15, Worksheets("Exporter").Cells(1, "B").Value) 
    cmd.Parameters.Append cmd.CreateParameter("Client", adVarChar, adParamInput, 15, Client) 
     cmd.Parameters.Append cmd.CreateParameter("Projet", adVarChar, adParamInput, 20, Worksheets("Exporter").Cells(2, "E").Value) 

    cmd.Parameters.Append cmd.CreateParameter("Ligne", adInteger, adParamInput, , (cell.Row - 4)) 
    cmd.Parameters.Append cmd.CreateParameter("Prod", adVarChar, adParamInput, 30, cell.Value) 
    cmd.Parameters.Append cmd.CreateParameter("Desc", adVarChar, adParamInput, 8000, Worksheets("Exporter").Cells(cell.Row, "B").Value) 
    cmd.Parameters.Append cmd.CreateParameter("Qte", adCurrency, adParamInput, , Worksheets("Exporter").Cells(cell.Row, "C").Value) 
    cmd.Parameters.Append cmd.CreateParameter("Cout", adCurrency, adParamInput, , Worksheets("Exporter").Cells(cell.Row, "D").Value) 
    cmd.Parameters.Append cmd.CreateParameter("Vend", adCurrency, adParamInput, , Worksheets("Exporter").Cells(cell.Row, "E").Value) 
    cmd.Parameters.Append cmd.CreateParameter("Imp", adSmallInt, adParamInput, , Worksheets("Exporter").Cells(cell.Row, "F").Value) 

    cmd.Execute() 
    End If 
Next 

cn.Close 

我得到一個錯誤,指出:

Execution error '-2147217900 (80040e14)': 
The Scalar variable "@P1Date" must be declare. 

誰能幫助我?

PS我知道VBA評論不以「//」完成,但「'」使代碼更容易少讀到這裏,所以我轉出來

+0

我有點難住。你確定在代碼中的任何地方都沒有提及P1Date? –

+0

長鏡頭,但日期通常是一個保留字 - 嘗試使用其他內容,或將其放在[]中,無論您將它用作參數名稱。 – Rory

+0

@AnthonyHorne是的,我的猜測是「?」在「?日期」得到開關爲「@ P1」女巫將參數編號1,它與南瓜,因此結果「@ P1Date」擠壓,但我不知道如何糾正這個或爲什麼它做到這一點 – Sebastien

回答

2

我不認爲命名的參數將工作。嘗試使用:

cmd.CommandText = "INSERT INTO NewTable(Dte, NbTr, NbClient, NbTr2, NbLine, NbProd, 
        Desc, Qty, Cost, Prc, FlImp, FLDone) 
        VALUES(?, ?, ?, ?, ?, ?, ?, 
        ?, ?, ?, ?, 0)" 

並確保稍後添加的參數按正確的順序排列。 ;)