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

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

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

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

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

ADO.NET

ADO.NETは.NET Frameworkで各種データベースへの統一された接続機能を提供するソフトウェアコンポーネントの集合です。

Q&A

解決済

1回答

710閲覧

ADO.NETでINSERT文の結合の仕方

kswdfr

総合スコア21

SQL Server

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

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

ADO.NET

ADO.NETは.NET Frameworkで各種データベースへの統一された接続機能を提供するソフトウェアコンポーネントの集合です。

0グッド

0クリップ

投稿2019/11/13 02:24

Visual Sutaudio2017を使ってADO.NETによるデータベース(SQLServer)プログラミングでWindowsFormを作っています。

CREATE TABLE [dbo].[IMAGE] ( [ImageID] INT IDENTITY (1, 1) NOT NULL, [Photoname] NVARCHAR (50) NULL, [Genre] INT NULL, CONSTRAINT [NUM2] PRIMARY KEY CLUSTERED ([ImageID] ASC), CONSTRAINT [NUM3] FOREIGN KEY ([Genre]) REFERENCES [dbo].[GENRE] ([GenreID]) ); CREATE TABLE [dbo].[GENRE] ( [GenreID] INT IDENTITY (1, 1) NOT NULL, [Genre] NVARCHAR (50) NULL, CONSTRAINT [NUM1] PRIMARY KEY CLUSTERED ([GenreID] ASC) );

というテーブルを作りました。
IMAGEテーブルのPhotonameとGENREテーブルのGrnreにINSERTした後GenreにGENREテーブルのGenreIDをSELECTで取得したのをINSERTしたく

private void button2_Click(object sender, EventArgs e) { cn.ConnectionString= @"・・・"; cn.Open(); cmd.Connection = cn; cmd.CommandType = CommandType.Text; cmd.CommandText = "INSERT INTO [dbo].[IMAGE] (Photoname) VALUES("+ "N'" + textBox3.Text + "')" + //PhotonameをIMAGEテーブルに格納 "INSERT INTO [dbo].[GENRE] (Genre) VALUES (" + "N'" + textBox1.Text + "')" + //GenreをGENREテーブルに格納                  "INSERT INTO[dbo].[IMAGE](Genre) " + "SELECT GenreID FROM[dbo].[GENRE] " + "WHERE Genre Like N'%" + textBox1.Text + "%'";//GenreIDをIMAGEテーブルに格納 rd = cmd.ExecuteReader(); rd.Close(); cn.Close(); }

とし

private SqlConnection cn = new SqlConnection(); private SqlCommand cmd = new SqlCommand(); private SqlDataReader rd; private string cnstr = @"・・・"; private void button4_Click(object sender, EventArgs e) { cn.ConnectionString = cnstr; cn.Open(); cmd.Connection = cn; cmd.CommandType = CommandType.Text; cmd.CommandText = "SELECT * FROM [dbo].[IMAGE] "; rd = cmd.ExecuteReader(); while (rd.Read()) listBox1.Items.Add( String.Format("[ImageID]{0}[Photoname]{1,-10}[Genre]{2,-10}", rd["ImageID"],rd["Photoname"], rd["Genre"])); rd.Close(); cn.Close(); }

で表示させました。
すると
[IMAGE]テーブル
[ImageID]1[Photoname]a[Genre]
[ImageID]2[Photoname] [Genre]1
[GENRE]テーブル
[GenreID]1[Genre]q
と表示させることはできました。
しかし
[IMAGE]テーブル
[ImageID]1[Photoname]a[Genre]1
としたく
https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1160890346を参考に

private void button2_Click(object sender, EventArgs e) { cn.ConnectionString= @"・・・"; cn.Open(); cmd.Connection = cn; cmd.CommandType = CommandType.Text; cmd.CommandText = "INSERT INTO [dbo].[IMAGE] (Photoname,Genre) VALUES(" + "N'" + textBox3.Text + "',"+ "(SELECT GenreID FROM[dbo].[GENRE] " + "WHERE Genre Like N'%" + textBox1.Text + "%'))" + //PhotonameとGENREIDをIMAGEテーブルに格納 "INSERT INTO [dbo].[GENRE] (Genre) VALUES (" + "N'" + textBox1.Text + "')" ; //GenreをGENREテーブルに格納 rd = cmd.ExecuteReader(); rd.Close(); cn.Close(); }

としました。
しかし
[IMAGE]テーブル
[ImageID]1[Photoname]a[Genre]
としか表示されません。
なので

"INSERT INTO [dbo].[IMAGE] (Photoname) VALUES("+ "N'" + textBox3.Text + "')"+ "INSERT INTO[dbo].[IMAGE](Genre) " + "SELECT GenreID FROM[dbo].[GENRE] " + "WHERE Genre Like N'%" + textBox1.Text + "%'";

を1つのSELECT文にする方法を教えてください。

制作物

Windows Form

検索

https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1160890346を参考

開発環境

Visual Sutaudio2017,.NET Framework4.7,SQL Server Express2017,Windows10

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

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

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

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

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

Zuishin

2019/11/13 03:06

ずっと ADO.NET の質問でされていますが、結局 SQL の問題ですよね? SQL は得意だけど ADO.NET はわからないという人を取りこぼしていますよ。 加算や表示などのノイズを省いて SQL だけ質問してみてはどうですか? SQL さえ正しければ後は自力でできるはずです。
Zuishin

2019/11/13 03:11 編集

あと、そろそろパラメーターを使いましょう。テキストボックスの中身を直接 SQL に入れるのはセキュリティ上問題があります。
kswdfr

2019/11/13 03:25

パラメーターとは何かわからないので教えてください。
guest

回答1

0

ベストアンサー

現状のGenreIDを取得する方法ですが、正確なGenreIDが取得できるとは言えません。
Like N'%" + textBox1.Text + "%'"ということはtextBox1.Textが含まれるデータを取得することとなります。
ですので、すでにGENREテーブルにGenre = 'ABCD'というデータがあり
追加したデータがGenre = 'BCD'だった場合、追加したデータのGenreIDではなくGenre = 'ABCD'のGenreIDを取得することになるかもしれません。
identity列の現在の値を取得する方法を検索してみてください。

また現状は、1文で書くのではなく複数のSQLで実現したいことを記述しましょう。

1.GENREテーブルにデータを追加する
2.1で追加したGenreIDを取得する
3.IMAGEテーブルにデータを追加する(2で取得したIDを利用する)

これをSQLで書いてみてください。
プログラムから行うのではなくSQL Management Studio等の別のところで実行することにより、SQLの問題なのかプログラムの問題なのかを明確に切り分けられます。正常なSQLを構築してからプログラムに反映しましょう。

最後に、前の質問でも指摘されていましたが、IMAGEテーブルのGenreカラムは名称を変更すべきです。
データ型から推測するにGenreIDとすべきでしょう。

投稿2019/11/13 03:24

YAmaGNZ

総合スコア10258

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

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

kswdfr

2019/11/15 01:05

1.GENREテーブルにデータを追加する 2.1で追加したGenreIDを取得する 3.IMAGEテーブルにデータを追加する(2で取得したIDを利用する) これをSQLで書いたらできました。 教えてくださりありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問