将数据从VB6插入表:多步OLE DB操作生成错误

问题描述 投票:0回答:2

我正在尝试将数据从VB6插入SQL Server。我正在尝试使用ADODB.Command,但是在执行该功能时,它会向我发送此错误。

多步OLE DB操作生成错误。检查每个OLE DB状态值(如果有)。未完成任何工作。

我已经用相同类型的数据制作了表格,但仍然显示此错误

这是我的代码

Dim strSQL As String
   strSQL = "INSERT INTO FacturasPendientes (IdFactura,FechaFactura,CodigoProveedor,NombreProveedor," & _
                           "TotalFactura,FechaVencimiento,DiasDescuento,DescProntoPago,Pagado) VALUES (?,?,?,?,?,?,?,?)"
   Dim CmdCont As ADODB.Command
     Set CmdCont = New ADODB.Command
        With CmdCont
            Set .ActiveConnection = Cnn
            .CommandType = adCmdText
            .CommandText = strSQL
            .Prepared = True
        End With
            'Creamos los Parametros
            CmdCont.Parameters.Append CmdCont.CreateParameter("IdFactura", adVarChar, adParamInput, 50, TxtFactura.Text)
            CmdCont.Parameters.Append CmdCont.CreateParameter("FechaFactura", adDate, adParamInput, 50, dtpFactura.Value)
            CmdCont.Parameters.Append CmdCont.CreateParameter("CodigoProveedor", adVarChar, adParamInput, 50, TxtCodigoProveedor.Text)
            CmdCont.Parameters.Append CmdCont.CreateParameter("NombreProveedor", adVarChar, adParamInput, 50, txtProveedor.Text)
            CmdCont.Parameters.Append CmdCont.CreateParameter("TotalFactura", adVarChar, adParamInput, 50, m_importe3)
            CmdCont.Parameters.Append CmdCont.CreateParameter("FechaVencimiento", adDate, adParamInput, FechaFinal)
            CmdCont.Parameters.Append CmdCont.CreateParameter("DiasDescuento", adVarChar, adParamInput, 50, txtDias.Text)
            CmdCont.Parameters.Append CmdCont.CreateParameter("DescProntoPago", adVarChar, adParamInput, 50, txtDescuento.Text)
            CmdCont.Parameters.Append CmdCont.CreateParameter("Pagado", adInteger, adParamInput, 2, 0)

     CmdCont.Execute

更新

我已经更改了插入数据的方式,但是现在尝试插入数据会向我发送错误消息

[12附近的语法不正确]

query = "INSERT INTO FacturasPendientes (IdFactura,FechaFactura,CodigoProveedor,NombreProveedor,TotalFactura,FechaVencimiento,DiasDescuento,DescProntoPago,Pagado) " & _
"Values(" & TxtFactura.Text & ",CONVERT (DATETIME, " & Format(dtpFactura.Value, "yyyy-mm-dd hh:mm:ss") & "',102), " & _
"" & TxtCodigoProveedor.Text & " ," & txtProveedor.Text & "," & m_importe3 & "," & _
"CONVERT (DATETIME, '" & Format(FechaFinal, "yyyy-mm-dd hh:mm:ss") & "',102),'" & txtDias.Text & "','" & txtDescuento.Text & "','" & chkPago.Value & "')"

Cnn.Execute query
sql-server
2个回答
0
投票

我建议您根据示例编辑代码

Dim Conn1 As ADODB.Connection
Dim Cmd1 As ADODB.Command
Dim Param0 As ADODB.Parameter
Dim Param1 As ADODB.Parameter
Dim Rs1 As ADODB.Recordset

' Create and Open Connection Object.
Set Conn1 = New ADODB.Connection
Conn1.ConnectionString = "DSN=Biblio;UID=admin;PWD=;"
Conn1.Open

' Create Command Object.
Set Cmd1 = New ADODB.Command
Cmd1.ActiveConnection = Conn1
Cmd1.CommandText = "INSERT INTO Authors (name, refcode) VALUES (?,?)"

' Create Parameter Objects.
Set Param0 = Cmd1.CreateParameter(, advarchar, adParamInput, 50)
Set Param1 = Cmd1.CreateParameter(, adInteger, adParamInput, 5)
Param0.Value = "Twain, Mark"
Param1.Value = 5
Cmd1.Parameters.Append Param0
Cmd1.Parameters.Append Param1
Set Param0 = Nothing
Set Param1 = Nothing

' Open Recordset Object.
Set Rs1 = Cmd1.Execute()

0
投票

如果您以这种方式编写查询,则问题显而易见:

INSERT INTO FacturasPendientes 
(
  IdFactura,
  FechaFactura,
  CodigoProveedor,
  NombreProveedor,
  "& _
  "TotalFactura,FechaVencimiento,DiasDescuento,DescProntoPago,Pagado
) VALUES (?,?,?,?,?,?,?,?)

"& _是您的第一个问题。您的双引号似乎没有正确关闭。

[导致comment出现在@eagle275之后,here之后,在我看来,您应该做类似(伪代码)的事情:

SQL_String := " INSERT INTO FacturasPendientes (IdFactura, FechaFactura, ";
SQL_String := SQL_String + "CodigoProveedor, NombreProveedor, ";
SQL_String := SQL_String + "TotalFactura, FechaVencimiento, DiasDescuento, ";
SQL_String := SQL_String + "DescProntoPago, Pagado) "
SQL_String := SQL_String + "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?);";

这就是您似乎尝试使用& _片段的方法,但是我只是认为您的SQL字符串构造不正确。

不确定VB6-这样的VB6查询中是否需要;

[当我做这种事情时,我将运行类似的内容(再次是伪代码:]:

Print_line("\n\n" = SQL_String + "\n\n");

然后,我将Print_line函数的输出复制并粘贴到数据库服务器CLI(命令行界面-或可能是GUI工具),以确保查询在继续进行之前确实产生了有意义的结果。

在编写SQL时随便进行某种格式设置时很重要-随着SQL行数的增加,这变得更重要[[指数级-很容易感到困惑(虽然我从未发生过!:-) ,Ahem ...)和所有括号&c。上面是我的方法-每个嵌套级别2个空格(<< never tabs!)。找到自己的风格并坚持下去!

根据OP的编辑进行编辑(列表中第3个编辑):同样,我不是VB6专家,但是我注意到了几件事。

query = "INSERT INTO FacturasPendientes (IdFactura,FechaFactura,CodigoProveedor,NombreProveedor,TotalFactura,FechaVencimiento,DiasDescuento,DescProntoPago,Pagado) " & _ "Values(" & TxtFactura.Text & ", CONVERT (DATETIME, " & Format(dtpFactura.Value, <<== Missing an & here? "yyyy-mm-dd hh:mm:ss") & "',102), " & _ "" & TxtCodigoProveedor.Text & " ," & txtProveedor.Text & "," & m_importe3 & "," & _ "CONVERT (DATETIME, '" & Format(FechaFinal, "yyyy-mm-dd hh:mm:ss") & "',102),'" & <<== why "', 102'" - single quotes? txtDias.Text & "','" & txtDescuento.Text & "','" & chkPago.Value & "')" <<== you're treating numeric (INT?) as text

查询文本中没有12,但是有102。也许与此<<== why "', 102'"有关-为什么将102(应该是INTEGER或至少某种数字)视为字符串?

[您是否尝试了我的建议并使用Print_Line()函数(与VB6等价的是什么?)打印出SQL字符串并直接在CLI客户端(mysql,MySQL Workbench)上运行它?如果您发现我的回答有用,则可以将其标记为此类。
© www.soinside.com 2019 - 2024. All rights reserved.