2016-09-30 8 views
-3

私は学校プロジェクト用のアプリケーションを作成しています。 常に、ストアドプロシージャを実行しようとすると、無効な構文のエラーメッセージが表示されます。SQL構文エラー、見つからない

これは私のVBAのコードおよび保存proceduer

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 

で私のコードで私は誰が助けることができる、それが仕事を得るように見えるカント?

+0

完全なエラーメッセージを表示 – Jens

+0

'35'(TxTPrijsに入力された入力)の構文が正しくありません –

+1

[VBAで動的SQLをデバッグする方法](http://stackoverflow.com/questions/418960/managing- and-debugging-sql-queries-in-ms-access/1099570#1099570)。単純な 'Debug.Print <実行するEXEC文字列>'はあなたにエラーを示していました。 – Andre

答えて

0
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 

私はちょうどdeclareステートメントを追加しました。多分それはあなたがこの行では、無効なエラーメッセージ

0

を得ている理由です。

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

あなたは、単一引用符内TxTArtikelNrTxTPrijsに渡しています。あなたのストアドプロシージャは(私もあなたの最後の二つのパラメータの間に行方不明にカンマを追加しました)これらのパラメータのintegerを期待し、そのラインからの単一引用符を失い、このようにそれを渡します

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

あなたのストアドプロシージャが期待します3パラメータ。したがって、TxTWijzigingsDatumの後にコンマがありません。

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

整数値を引用する必要はありません。日付または文字列のみ。

この種のコーディングは避けてください。 このコードを使用して一重引用符( ')を含む文字列を挿入すると、クエリが中断されます。あなたはそれらをエスケープするか、代わりにパラメータ化されたクエリを使う必要があります。