2014-05-20 76 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)" 

并确保稍后添加的参数按正确的顺序排列。 ;)