【问题标题】:SQL Syntax error, Can't find itSQL语法错误,找不到
【发布时间】:2016-09-30 10:26:11
【问题描述】:

我正在申请一个学校项目。 当我尝试执行存储过程时,我经常收到一条错误消息,提示语法无效。

这是我的 Vba 代码和存储过程

CREATE PROCEDURE spVeranderPrijs
(
@ArtikelNr  integer,
@WijzigingsDatum Date,
@NieuwePrijs integer
)
AS 
BEGIN Transaction

Select * from artikelprijs
where artikelnr = @ArtikelNr
and einddatum = '2099-01-01'

  if @@ERROR <> 0

    update ArtikelPrijs set einddatum = @Wijzigingsdatum

    INSERT INTO Artikelprijs
    VALUES (@ArtikelNr, @NieuwePrijs, @WijzigingsDatum, '2099-01-01');

  BEGIN

    ROLLBACK
    RAISERROR ('Error tijdens het uitvoeren', 16 , 1)
    RETURN
  END 
Commit

GO

还有我在 Vba 中的代码

Private Sub Command6_Click()

Dim conn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim sConnString As String
sConnString = "Provider=SQLOLEDB;Data Source=.\SQLEXPRESS;" & _
  "Initial Catalog=KlantArtikelApp;" & _
  "Integrated Security=SSPI;"

Set conn = New ADODB.Connection
Set rs = New ADODB.Recordset

conn.Open sConnString
Set rs = conn.Execute("EXEC spVeranderprijs  '" & TxTArtikelNr & "', '" & TxTWijzigingsDatum & "' '" & TxTPrijs & "'")


End Sub

我似乎无法让它工作,有人可以帮忙吗?

【问题讨论】:

  • 显示完整的错误信息
  • '35' 附近的语法不正确(这是我输入 TxTPrijs 的输入)
  • How to debug dynamic SQL in VBA 。一个简单的Debug.Print &lt;the EXEC string you want to run&gt; 会显示错误。

标签: sql vba ms-access stored-procedures


【解决方案1】:
CREATE PROCEDURE spVeranderPrijs
(
DECLARE @ArtikelNr  integer,
@WijzigingsDatum Date,
@NieuwePrijs integer
)
AS 
BEGIN Transaction

Select * from artikelprijs
where artikelnr = @ArtikelNr
and einddatum = '2099-01-01'

  if @@ERROR <> 0

    update ArtikelPrijs set einddatum = @Wijzigingsdatum

    INSERT INTO Artikelprijs
    VALUES (@ArtikelNr, @NieuwePrijs, @WijzigingsDatum, '2099-01-01');

  BEGIN

    ROLLBACK
    RAISERROR ('Error tijdens het uitvoeren', 16 , 1)
    RETURN
  END 
Commit

GO

我刚刚添加了声明语句。也许这就是您收到无效错误消息的原因

【讨论】:

    【解决方案2】:

    在这一行:

    conn.Execute("EXEC spVeranderprijs  '" & TxTArtikelNr & "', '" & TxTWijzigingsDatum & "' '" & TxTPrijs & "'")
    

    您在单引号内传入TxTArtikelNrTxTPrijs。您的存储过程需要 integer 用于这些参数,因此请从该行中删除单引号并像这样传递它(我还在最后两个参数之间添加了一个缺少的逗号):

    conn.Execute("EXEC spVeranderprijs  " & TxTArtikelNr & ", '" & TxTWijzigingsDatum & "', " & TxTPrijs)
    

    【讨论】:

      【解决方案3】:

      您的存储过程需要 3 个参数。所以你在 TxTWijzigingsDatum 后面少了一个逗号。

      Set rs = conn.Execute("EXEC spVeranderprijs " & TxTArtikelNr & ", '" & TxTWijzigingsDatum & "' ," & TxTPrijs)
      

      不需要引用整数值。只有日期或字符串。

      但是应该避免这种类型的编码。 如果您使用此代码插入包含单引号 (') 的字符串,它们将破坏您的查询。您必须转义它们,或者更好地使用参数化查询。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-01-10
        • 2014-08-27
        • 2019-04-12
        • 1970-01-01
        • 1970-01-01
        • 2019-01-16
        • 1970-01-01
        相关资源
        最近更新 更多