INSERT INTO文
投稿者 YuO  (社会人)
投稿日時
2018/5/30 17:35:35
実行時例外は「SqlException型」ですから,VBの文法エラーではなくSQLの文法エラーであることを示しています。
なので、ソースコードの表現方法を変えたところで意味がありません。
で,提示されているSQLは,(Transact-)SQLとして正しくありません。
/ を列名に含む事は(そのままでは)できません。同じく,(Tel)も不正な表記になります。
本当に列名がcode/Addressや(Tel)であるならば,角括弧で括ることで対応可能です。
ただし,@code/Addressや@(Tel)はどうしようもないので,名前を変更する必要があります。
このあたりは、Management Studioで実際に動作するSQLを作成し、それをコードに移植するようにするとよいでしょう。
@IDなどはDECLARE文を使うことで対応できます。
なので、ソースコードの表現方法を変えたところで意味がありません。
で,提示されているSQLは,(Transact-)SQLとして正しくありません。
/ を列名に含む事は(そのままでは)できません。同じく,(Tel)も不正な表記になります。
本当に列名がcode/Addressや(Tel)であるならば,角括弧で括ることで対応可能です。
ただし,@code/Addressや@(Tel)はどうしようもないので,名前を変更する必要があります。
このあたりは、Management Studioで実際に動作するSQLを作成し、それをコードに移植するようにするとよいでしょう。
@IDなどはDECLARE文を使うことで対応できます。
投稿者 (削除されました)  ()
投稿日時
2018/5/31 10:14:26
(削除されました)
投稿者 魔界の仮面弁士  (社会人)
投稿日時
2018/5/31 10:21:09
> cmd.Parameters.Add("@code/Address", SqlDbType.NVarChar, 50).Value = TextBox3.Text
> cmd.Parameters.Add("@(Tel)", SqlDbType.NVarChar, 50).Value = TextBox4.Text
SQL Server の変数名に、「/」「(」「)」「 」などを含めることはできません。
記号を使う場合、使用できる文字は
「_」アンダースコア
「@」アットマーク
「#」ナンバーサイン
「$」ドル記号
の 4 種に限られています。通常は「_」程度に留めましょう。
また、SQL Server に対しては、@ID という変数のために
このような事情もあるため、変数名の先頭に記号を使うことも避けてください。(@@ID などを避ける)
……最後の閉じ括弧が全角になっていますよ?
まず、TABLE は予約語なので、本当にテーブル名が「Table」なら、
上記のように「[Table]」表記にするのが正しいですね。ここまでは OK 。
あるいは「"Table"」表記も使えますが、文字列中に " を含めると
分かりにくくなるので、やはり「[Table]」表記の方が良いでしょう。
列名の code/Address や (Tel) が NG なのは、既に述べられている通り。
フィールド名に記号や空白を含めることは、あまり望ましくないのですが、
本当にフィールド名が「code/Address」や「(Tel)」なのであれば、
SQL 文中で指定する場合には「[code/Address]」や「[(Tel)]」と記さねばなりません。
なお、ID や Name は予約語ではありませんので、「ID」のままでも構わないのですが、
今回の場合は統一感を出すために、「[ID]」表記にそろえた方が良いでしょう。
(なお、ID という列名はセーフですが、IDENTITY や IDENTITYCOL は予約語です)
そして特に問題となっているのは、VALUES 句以降です。
YuO さんが書かれている通り、@code/Address な変数名は NG です。
ということで…もしも本当に、SQL Server 上の「Table」という名前のテーブルに、
nvarchar(50) 型のフィールドが 4 つ、「ID」「Name」「code/Address」「(Tel)」という名前で
用意されているのだとしたら、今回の処理を、たとえば下記のように書けます。
※cn As SqlConnection に対する Open / Close やトランザクション処理などは、
実際の処理に併せて、適宜修正してください。
> cmd.Parameters.Add("@(Tel)", SqlDbType.NVarChar, 50).Value = TextBox4.Text
SQL Server の変数名に、「/」「(」「)」「 」などを含めることはできません。
記号を使う場合、使用できる文字は
「_」アンダースコア
「@」アットマーク
「#」ナンバーサイン
「$」ドル記号
の 4 種に限られています。通常は「_」程度に留めましょう。
また、SQL Server に対しては、@ID という変数のために
cmd.Parameters.Add("ID", SqlDbType.NVarChar, 50).Value = TextBox1.Text
cmd.Parameters.Add("@ID", SqlDbType.NVarChar, 50).Value = TextBox1.Text
のどちらの構文を使っても構わないことになっています。このような事情もあるため、変数名の先頭に記号を使うことも避けてください。(@@ID などを避ける)
> Dim sqlQuery As String = "INSERT INTO [Table](ID ,Name ,code/Address ,(Tel) )" & _
> "VALUES(@ID ,@Name ,@code/Address ,@(Tel) )"
> "VALUES(@ID ,@Name ,@code/Address ,@(Tel) )"
……最後の閉じ括弧が全角になっていますよ?
まず、TABLE は予約語なので、本当にテーブル名が「Table」なら、
上記のように「[Table]」表記にするのが正しいですね。ここまでは OK 。
あるいは「"Table"」表記も使えますが、文字列中に " を含めると
分かりにくくなるので、やはり「[Table]」表記の方が良いでしょう。
列名の code/Address や (Tel) が NG なのは、既に述べられている通り。
フィールド名に記号や空白を含めることは、あまり望ましくないのですが、
本当にフィールド名が「code/Address」や「(Tel)」なのであれば、
SQL 文中で指定する場合には「[code/Address]」や「[(Tel)]」と記さねばなりません。
なお、ID や Name は予約語ではありませんので、「ID」のままでも構わないのですが、
今回の場合は統一感を出すために、「[ID]」表記にそろえた方が良いでしょう。
(なお、ID という列名はセーフですが、IDENTITY や IDENTITYCOL は予約語です)
そして特に問題となっているのは、VALUES 句以降です。
YuO さんが書かれている通り、@code/Address な変数名は NG です。
ということで…もしも本当に、SQL Server 上の「Table」という名前のテーブルに、
nvarchar(50) 型のフィールドが 4 つ、「ID」「Name」「code/Address」「(Tel)」という名前で
用意されているのだとしたら、今回の処理を、たとえば下記のように書けます。
cn.Open()
Dim sqlQuery As String = "INSERT INTO [Table] ( [ID], [Name], [code/address], [(Tel)] ) " & _
"VALUES ( @ID, @Name, @code_name, @Tel )"
Using cmd As New SqlCommand(sqlQuery, cn)
cmd.Parameters.Add("ID", SqlDbType.NVarChar, 50).Value = TextBox1.Text
cmd.Parameters.Add("Name", SqlDbType.NVarChar, 50).Value = TextBox2.Text
cmd.Parameters.Add("code_name", SqlDbType.NVarChar, 50).Value = TextBox3.Text
cmd.Parameters.Add("Tel", SqlDbType.NVarChar, 50).Value = TextBox4.Text
cmd.ExecuteNonQuery()
End Using
cn.Close()
cn.Dispose()
※cn As SqlConnection に対する Open / Close やトランザクション処理などは、
実際の処理に併せて、適宜修正してください。
Dim sqlQuery As String = "INSERT INTO [Table](ID ,Name ,code/Address ,(Tel) )" & _
"VALUES(@ID ,@Name ,@code/Address ,@(Tel) )"
Dim cmd As New SqlCommand(sqlQuery, cn)
cmd.Parameters.Add("@ID", SqlDbType.NVarChar, 50).Value = TextBox1.Text
cmd.Parameters.Add("@Name", SqlDbType.NVarChar, 50).Value = TextBox2.Text
cmd.Parameters.Add("@code/Address", SqlDbType.NVarChar, 50).Value = TextBox3.Text
cmd.Parameters.Add("@(Tel)", SqlDbType.NVarChar, 50).Value = TextBox4.Text
これを実行すると以下のようなエラーがでます
型 'System.Data.SqlClient.SqlException' のハンドルされていない例外が System.Data.dll で発生しました
追加情報:Incorrect syntax near '/'.
「/」を演算子認識?しているのかなとcode" & "/" & "Addressとやってみたのですが駄目でした。
どこがおかしいでしょうか?