INSERT INTO文 への返答

投稿で使用できる特殊コードの説明。(別タブで開きます。)
本名は入力しないようにしましょう。
投稿した後で削除するときに使うパスワードです。返答があった後は削除できません。
返答する人が目安にします。相手が小学生か社会人かで返答の仕方も変わります。
最初の投稿が質問の場合、質問者が解決時にチェックしてください。(以降も追加書き込み・返信は可能です。)
※「過去ログ」について書くときはその過去ログのURLも書いてください。

以下の返答は逆順(新しい順)に並んでいます。

投稿者 魔界の仮面弁士  (社会人) 投稿日時 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 という変数のために
    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) )"

……最後の閉じ括弧が全角になっていますよ?

まず、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 やトランザクション処理などは、
 実際の処理に併せて、適宜修正してください。
投稿者 (削除されました)  () 投稿日時 2018/5/31 10:14:26
(削除されました)
投稿者 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文を使うことで対応できます。
投稿者 MM  (社会人) 投稿日時 2018/5/30 15:45:00

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とやってみたのですが駄目でした。
どこがおかしいでしょうか?