質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

Q&A

解決済

1回答

5102閲覧

VB.NetでSQL serverにレコード追加できない

bonzo_pna

総合スコア5

SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

0グッド

1クリップ

投稿2020/03/16 01:43

編集2020/03/17 02:37

前提・実現したいこと

VB.netでSQLServerのDataBaseを追加/取得して、データを参照するアプリを開発しています。13個もTextBoxのデータ(Text型が10個、data型が3個)を読み込んで、ExecuteNonQuery()でDataBaseにレコードを追加する際に、下記のエラーが発生します。SQL serverをはじめて使うので、初歩的なミスの可能性が高いと思いますが、行き詰まっているので、なにか対応方法をご教示願えませんでしょうか。

発生している問題・エラーメッセージ

System.Data.SqlClient.SqlException: '列名 'ID_906' が無効です。
列名 'project' が無効です。
列名 '名前' が無効です。
マルチパート識別子 "namae.pana" をバインドできませんでした。
列名 'TextBox5' が無効です。
列名 'TextBox6' が無効です。
列名 'TextBox7' が無効です。
列名 'TextBox8' が無効です。
列名 'TextBox9' が無効です。
列名 'TextBox10' が無効です。

該当のソースコード

VB.Net

Private Sub Go_Button_Click(sender As Object, e As RoutedEventArgs) Handles Go_Button.Click Dim cn As New SqlConnection Dim cd As New SqlCommand Dim SQL As String Dim St As String Dim impDate(3) As Date 'データベース接続 St = "Server=""PC-PA1709C0127R\SQLEXPRESS01"";" St &= "integrated security=SSPI;" St &= "initial catalog = theme" cn.ConnectionString = St cn.Open() 'TextBox のdateデータ取得 impDate(1) = CDate(TextBox11.Text) impDate(2) = CDate(TextBox12.Text) impDate(3) = CDate(TextBox13.Text) 'TextBoxのTextデータの変換 Dim l1 As Integer = TextBox1.Text.Length Dim impChar1 As Char() = TextBox1.Text.ToCharArray(0, l1) l1 = TextBox2.Text.Length Dim impChar2 As Char() = TextBox2.Text.ToCharArray(0, l1) l1 = TextBox3.Text.Length Dim impChar3 As Char() = TextBox3.Text.ToCharArray(0, l1) l1 = TextBox4.Text.Length Dim impChar4 As Char() = TextBox4.Text.ToCharArray(0, l1) l1 = TextBox5.Text.Length Dim impChar5 As Char() = TextBox5.Text.ToCharArray(0, l1) l1 = TextBox6.Text.Length Dim impChar6 As Char() = TextBox6.Text.ToCharArray(0, l1) l1 = TextBox7.Text.Length Dim impChar7 As Char() = TextBox7.Text.ToCharArray(0, l1) l1 = TextBox8.Text.Length Dim impChar8 As Char() = TextBox8.Text.ToCharArray(0, l1) l1 = TextBox9.Text.Length Dim impChar9 As Char() = TextBox9.Text.ToCharArray(0, l1) l1 = TextBox10.Text.Length Dim impChar10 As Char() = TextBox10.Text.ToCharArray(0, l1) 'SQL文生成 SQL = "" SQL &= "INSERT INTO dbo.テーマ情報" SQL &= "(" SQL &= " themeNo," SQL &= " themeName," SQL &= " Charge," SQL &= " address," SQL &= " boss1," SQL &= " address1," SQL &= " boss2," SQL &= " address2," SQL &= " folder," SQL &= " Examination documents," SQL &= " start," SQL &= " end," SQL &= " Review" SQL &= ")" SQL &= "VALUES" SQL &= "(" SQL &= impChar1 SQL &= "," SQL &= impChar2 SQL &= "," SQL &= impChar3 SQL &= "," SQL &= impChar4 SQL &= "," SQL &= impChar5 SQL &= "," SQL &= impChar6 SQL &= "," SQL &= impChar7 SQL &= "," SQL &= impChar8 SQL &= "," SQL &= impChar9 SQL &= "," SQL &= impChar10 SQL &= "," SQL &= impDate(1) SQL &= "," SQL &= impDate(2) SQL &= "," SQL &= impDate(3) SQL &= ")" MsgBox(SQL) 'SQLコマンド設定 cd.CommandText = SQL cd.Connection = cn cd.ExecuteNonQuery() 'クローズ解放 cd.Dispose() cn.Close() cn.Dispose() End Sub

試したこと

初期のテーブルをexlsからインポートしていて、Textのデータ型が「nvarchar(50)」になっているので上記構文ですが、データ型をMicrosoft SQL Server Management Studio 18でText型に変更して、Text Dataをそのまま使用しても同様のエラーが発生します。

補足情報(FW/ツールのバージョンなど)

Visual Studio 2019
.Net Framework 4.8

イメージ説明

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/03/16 02:39

コードは ``` と ``` で囲ってください。インデントされて見やすくなりますので。インデントされてないコードは質問者さん自身も読む気がしないのでは? SQL Server のバージョン・エディションを書いてください。「テーマ情報」テーブルのスキーマを書いてください。
退会済みユーザー

退会済みユーザー

2020/03/16 02:43

クエリは何が何でもパラメータ化しましょう。はっきり言ってパラメータ化してないクエリを使っている段階で議論の対象外と言っても過言ではないと思います。接続文字列や INSERT クエリを & でつなぐのは止めましょう。見難くなるだけで何の意味もないと思うのですが。書き直しできますか?
YAmaGNZ

2020/03/16 05:19

出来上がったSQLをManagementStudio等自身のプログラムではないもので実行したりしてみましたか?
seesaajira-

2020/03/16 05:42

dbo.テーマ情報のテーブル名は当たってますか? テーブル定義はどのようになってますか?
bonzo_pna

2020/03/16 05:52

SurferOnWwwさん 「SQL Server のバージョン・エディションを書いてください。「テーマ情報」テーブルのスキーマを書いてください。」   SQL Serverのバージョン:SQL Server 2019(64ビット) 「テーマ情報」テーブルのスキーマというのは確認できないのですが、  確認方法を教えてください
退会済みユーザー

退会済みユーザー

2020/03/16 06:27 編集

> SQL Serverのバージョン:SQL Server 2019(64ビット) エディションは何ですか?接続文字列を見ると EXPRESS 版のようですが、そうなんですか? >「テーマ情報」テーブルのスキーマというのは確認できないのですが、  確認方法を教えてください Visual Studio の SQL Server オブジェクトエクスプローラーで DB を開いて、当該テーブルを右クリックし、[デザイナーの表示(G)]をクリックして表示された画像のスクリーンショットを撮って質問欄に貼ってください。
退会済みユーザー

退会済みユーザー

2020/03/16 06:25

コードは ``` と ``` で囲ってくださいとお願いしましたが無視ですか?
bonzo_pna

2020/03/16 06:38

コメントをいただいた皆様 いろいろと記帳なコメントをいただいたなかで恐縮ですが、急に会議が設定されてしまいましたので、会議終了後対応させていただきます。 申し訳ありません
退会済みユーザー

退会済みユーザー

2020/03/16 06:50

質問者さんが属する組織の業務としてやっているならその組織の上司・先輩・同僚に聞いてみてはいかがですか? 教育は受けられないのですか?
bonzo_pna

2020/03/16 23:37

アドバイスいただいた各位 昨日は会議が長引いて対応できず誠に申し訳ございません。 昨日多々アドバイスをいただいており、順に対応いたしますので、アクションが遅くなることもあると思いますがその点ご了解いただきたくお願いいたします。 以上宜しくお願いします。
bonzo_pna

2020/03/16 23:46

SurferOnWwwさん 「エディションは何ですか?接続文字列を見ると EXPRESS 版のようですが、そうなんですか?」   そうです。その場合問題が発生する可能性がありますか? 「Visual Studio の SQL Server オブジェクトエクスプローラーで DB を開いて、当該テーブルを・・」   対象のDBが表示されていないのですが、サーバーの設定の問題でしょうか? 「コードは ``` と ``` で囲ってくださいとお願いしましたが無視ですか? 」   無視しているわけではありません。VBのプロシージャのどこに挿入しても構文エラーが発生するので問題解決を優先して保留しています。 「コードは ``` と ``` で囲ってくださいとお願いしましたが無視ですか? ・・・」   プロシージャの書き方として心得ておきます。
bonzo_pna

2020/03/16 23:50

YAmaGNZさん 「出来上がったSQLをManagementStudio等自身のプログラムではないもので実行したりしてみましたか?」   試してはいません。webの指南サイトに書かれているものを参考に作成しているので、使えるものと信じていました。今はその点を見直す必要性も感じています。
bonzo_pna

2020/03/16 23:56

seesaajiraさん 「dbo.テーマ情報のテーブル名は当たってますか?」   合っています 「テーブル定義はどのようになってますか? 」   「nvarchar(50)型」10個と「datetime型」が3つです。それ以外は設定していません。デフォルトです。
bonzo_pna

2020/03/17 01:23

SurferOnWwwさん 「画像のスクリーンショットを撮って質問欄に貼ってください」 ですが貼り付けできないのですか、普通にpasteではないのでしょうか
shinami

2020/03/17 02:14 編集

スクリーンショットは、質問内容を書く欄の上部に画像の挿入アイコンがあります ![ここは題名何でも良い](ここは選んだ画像のPathが入ります) コードは```と```で囲みましょう。これも、質問内容上部に<code>アイコンがありますので ``` Dim test As String ``` とバッククォート(shift + @キー)の中に描いてください。Visual Studioでの話ではありません。この質問文での話です。 そのテーブル定義の何の列名がnvarchar(50)で何の列がdatetime型なのかの情報が欲しいのだと思いますのでそれをテーブル定義のスクリーンショットかcreatetable文などのクエリーを書いておきましょう。 または、表のような感じで質問文に何が何と書いておきましょう。 また、列名は日本語(テーマNoなど)なのですか?あまり日本語は使わないほうが良いように思います。 これらも質問文の最後の方に編集ボタンがありますので編集しましょう。 Express Editionという情報も。
bonzo_pna

2020/03/17 02:40

shinamiさん ご教示ありがとうございます。 コードは```と```で囲む/スクリーンショットを張り付ける/列名を英語に変更 実施しました。 よろしくお願いします。
guest

回答1

0

ベストアンサー

ユーザー入力で SQL Server に投げるクエリを組み立てるのは SQL インジェクションの問題があるので絶対に避けるべき話で、質問のコメントに書いたように何が何でもパラメータ化クエリを使うべきです。

が、それを言っても始まらないようなので、パラメータ化クエリの話はちょっと置いといて、文字列を組み立てて INSERT クエリを作る場合をまず考えますと・・・

VALUES ( ... ) の ( ) 内に設定する文字列はどうすべきかを考えてください。

質問者さんのケースで、例えば、TextBox1.Text が 番号1、TextBox2.Text が テーマ名、TextBox3.Text が チャージ ・・・中略・・・ TextBox13.Text が 2020-03-17 とすると、組み立てるべき INSERT クエリの文字列(質問者さんのコードにある変数 SQL を連結した最終結果)は以下のようなるはずです。

INSERT INTO dbo.テーマ情報 (themeNo,themeName,Charge, ・・・中略・・・ Review) VALUES (N'番号1', N'テーマ名', N'チャージ', ・・・中略・・・ '2020-03-17')

詳しくは以下の記事を見てください。

Constants (Transact-SQL)
https://docs.microsoft.com/ja-jp/sql/t-sql/data-types/constants-transact-sql?view=sql-server-ver15

日時データの使用
https://docs.microsoft.com/ja-jp/previous-versions/sql/sql-server-2008-r2/ms180878(v=sql.105)

投稿2020/03/17 03:27

編集2020/03/17 03:56
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

bonzo_pna

2020/03/17 05:37

ありがとうございました。 文字列のまえにNをいれることで解決しました。 お手数をおかけしました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問