- PR -

VB.NET2003 ACCESS パラメータクエリで"INSERT INTO ステートメントの構文エラーです。"

投稿者投稿内容
K5
常連さん
会議室デビュー日: 2006/04/22
投稿数: 25
投稿日時: 2006-04-23 00:06
はじめまして。
VB.NET初心者です。

パラメータクエリでACCESSにデータを挿入したいのですが、うまく行きません。
是非、皆様のお力を貸して下さい。

現象:
?を使ってパラメータクエリを作成しているが、複数のパラメータを設定して実行するとエラーとなってしまいます。
パラメータが1つの時は、エラーにならずにデータがINSERTされます。
(パターン1のSQL文)
また、"INSERT INTO ステートメントの構文エラーです。"というエラーですが、
ACCESSでクエリにSQL文を貼り付けると、パラメータの入力ウィンドウが出てきて、パラメータを入力するとデータがINSERTされます。
(パターン2のSQL文)

パターン1."INSERT INTO テーブル名(フィールド1) VALUES(?)"
パターン2."INSERT INTO テーブル名(フィールド1,フィールド2) VALUES(?,?)"

以下がソースになります。

'SQL文の組み立て
Private Function makeInsertSql(ByVal strItem() As String, _
ByVal strTblName As String) As String

Dim strSql 'SQL文作成用

'SQL文の組み立て
strSql = "INSERT INTO " & strTblName & "("
strSql = strSql & strItem(0) & "," & strItem(1) & ")"
strSql = strSql & " VALUES(?,?)"

Return strSql

End Function

Public Function setNewRegist(ByVal strItem() As String, _
ByVal strVal() As String, _
ByVal strTblName As String) As Boolean

Dim oleCon As OleDb.OleDbConnection
Dim oleCmd As OleDb.OleDbCommand
Dim strSql As String

setNewRegist = False

Try
'コネクションOpen
oleCon = New OleDb.OleDbConnection
oleCon.ConnectionString = _
"Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & PClsAppInfo.MdbPath & ";" & _
"Persist Security Info=False"
oleCon.Open()

'SQL作成
strSql = makeInsertSql(strItem, strVal, strTblName)

oleCmd = New OleDb.OleDbCommand(strSql, oleCon)

'パラメータセット
oleCmd.Parameters.Clear()
oleCmd.Parameters.Add("param1", strVal(0))
oleCmd.Parameters.Add("param2", strVal(1))

'SQL発行
oleCmd.ExecuteNonQuery()
setNewRegist = True
Catch ex As Exception
Throw ex
Finally
'DB接続を閉じる
If Not oleCon Is Nothing Then
oleCon.Close()
End If
End Try

End Function

初歩的な質問で申し訳ないのですが、よろしくお願い致します。
かるあ
ぬし
会議室デビュー日: 2003/11/16
投稿数: 1190
お住まい・勤務地: センガワ→ムサシノ
投稿日時: 2006-04-23 00:13
引用:

oleCmd.Parameters.Add("param1", strVal(0))
oleCmd.Parameters.Add("param2", strVal(1))


として定義しているなら。

コード:
'strSql = strSql & " VALUES(?,?)"
strSql = strSql & " VALUES(@param1,@param2)"


としたらどうなりますか?
K5
常連さん
会議室デビュー日: 2006/04/22
投稿数: 25
投稿日時: 2006-04-23 00:20
かるあ様返信ありがとうございます。

引用:

'strSql = strSql & " VALUES(?,?)"
strSql = strSql & " VALUES(@param1,@param2)"



としてみましたが、結果はまったく同じでした。。。

囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2006-04-23 00:38
makeInsertSql の引数の数が、定義と使っている箇所で違いますが、どちらが正しいですか?
_________________
囚人のジレンマな日々
K5
常連さん
会議室デビュー日: 2006/04/22
投稿数: 25
投稿日時: 2006-04-23 00:44
囚人様

すいません。
色々と試している最中で書き込みしてしまったので、不整合がありました。
コード:
strSql = makeInsertSql(strItem, strTblName)



となります。
makeInsertSqlの定義の方が正しいです。


かるあ
ぬし
会議室デビュー日: 2003/11/16
投稿数: 1190
お住まい・勤務地: センガワ→ムサシノ
投稿日時: 2006-04-23 01:03
引用:

K5さんの書き込み (2006-04-23 00:06) より:

ACCESSでクエリにSQL文を貼り付けると、パラメータの入力ウィンドウが出てきて、パラメータを入力するとデータがINSERTされます。


は makeInsertSql の返却値を貼り付けているんですよね
makeInsertSql を使わないで(静的にSQLを記述して)試してみませんか?
K5
常連さん
会議室デビュー日: 2006/04/22
投稿数: 25
投稿日時: 2006-04-23 01:11
かるあ様

引用:

は makeInsertSql の返却値を貼り付けているんですよね
makeInsertSql を使わないで(静的にSQLを記述して)試してみませんか?



ご返信ありがとうございます。
はい。
makeInsertSqlの返却値を貼り付けています。
原因がわからなかった場合には、最終的にはSQLをパラメータを使わず組み立てるしかないので、一旦その方向で進めてみます。
Access
ぬし
会議室デビュー日: 2002/04/08
投稿数: 829
投稿日時: 2006-04-23 08:28
引用:

'パラメータセット
oleCmd.Parameters.Clear()
oleCmd.Parameters.Add("param1", strVal(0))
oleCmd.Parameters.Add("param2", strVal(1))



Accessは位置指定(Positional Parameter)のパラメータしかサポートして
いないのでパラメータに値を代入するときアドホッククエリのパラメータ(?)と
同じ順番で値を代入する必要があります。以下の点を確認してみてください。

1)INSERTのパラメータ順とAddメソッドで値を代入する順番が対応するか。

2)Addパラメータで代入する値のデータ型が一致するか
  (データ型を指定して値を代入してみては)

_________________
ASP.NET+Ajaxサンプル集 | JavaScript+Ajaxサンプル集

スキルアップ/キャリアアップ(JOB@IT)