VBA Excel SQL Server插入查询

VBA Excel SQL Server插入查询,sql,sql-server,vba,excel,Sql,Sql Server,Vba,Excel,我在SQL Server插入查询中遇到问题 首先,以下是我努力实现的目标: 我想将excel工作表中的产品列表导出到MS SQL Server中 以下是我尝试的代码: 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 //Works

我在SQL Server插入查询中遇到问题

首先,以下是我努力实现的目标:

我想将excel工作表中的产品列表导出到MS SQL Server中

以下是我尝试的代码:

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注释没有用“/”完成,但是“'”使代码在这里不那么容易阅读,所以我把它们换掉了

我认为命名参数不起作用。尝试使用:

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

并确保以后附加的参数顺序正确。;)

我有点不知所措。您确定代码中的任何地方都没有引用P1Date吗?很可能,但Date通常是一个保留字-尝试使用其他词,或将其作为参数名括在[]中。@AnthonyHorne是的,我猜是“@P1”的“?in”?Date”get开关witch将是参数1,它将与reste一起挤压,因此结果为“@P1Date”,但我不知道如何纠正这一点,也不知道它为什么要这样做this@Rory我不认为这是问题所在“?Date”是我查询中的参数名,它应该通过这行
cmd.Parameters.Append cmd.CreateParameter(“日期”)输出,adVarChar,adParamInput,8,工作表(“导出器”).Cells(1,“E”).Value)