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

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

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

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

.NET Framework

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

ADO.NET

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

Q&A

解決済

2回答

2071閲覧

ADO.NETでSQLServerをつかったINSERT文について

kswdfr

総合スコア21

SQL Server

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

.NET Framework

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

ADO.NET

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

0グッド

0クリップ

投稿2019/11/12 03:49

編集2019/11/12 10:50

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テーブルのPhotonameにデータは格納できましたがGenreにデータが格納できません。
エラーコードが表示されないのでどこが間違っているかわからないので教えてください。

制作物

Windows Form

検索

どこが間違っているのか分からなかったので検索はしていません。

開発環境

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

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

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

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

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

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

Orlofsky

2019/11/12 04:44

テーブル設計で同じ列名でデータ型や桁数が違う作りは止めた方が良いです。自分の首を締めます。
kswdfr

2019/11/12 05:09

GENREテーブルのGenreのデータ型を変えたらinsert出来ますか?
YAmaGNZ

2019/11/12 06:29

実行しようとしているSQLをSQL Management Studioなど作成しているプログラムと別の方法で実行して確かめないんですか?
kswdfr

2019/11/12 08:44

「テーブル設計で同じ列名でデータ型や桁数が違う作りは止めた方が良いです。」 とありますがどこをとめたほうがよいかわからないので教えてほしいです。
YAmaGNZ

2019/11/12 08:59

IMAGEテーブルのGenreはint、GENREテーブルのGenreはNVARCHARと同じ名前なのに明らかに入れるデータが異なる設計です。 このような状態だと勘違いしてバグの原因になりますので、識別できるように別の名前にしましょうということです。
Orlofsky

2019/11/12 09:00

提示されているテーブルは2つしかないないに気が付かないのは残念です。 列名、データ型、列名、テーブル名 の順でSELECTしてみては? SQL Server データディクショナリ情報を取得する方法 http://note.mokuzine.net/sqlserver-dictionary/
kswdfr

2019/11/12 09:06

コメントが間違っていたので //GenreをIMAGEテーブルに格納を //GenreIDをIMAGEテーブルに格納に修正しました。
Orlofsky

2019/11/12 09:17 編集

コメントのことはとりあえず置いておくとして、SELECT文を実行する方法がわからないの?
kswdfr

2019/11/12 09:34 編集

Select文を使ったInsert文がわからないです。
kswdfr

2019/11/12 10:52 編集

https://www.projectgroup.info/tips/SQLServer/SQL/SQL000004.html を参考に ("INSERT INTO[dbo].[IMAGE](Genre)" + "SELECT GenreID FROM[dbo].[GENRE] " + "WHERE Genre = N'% "+ textBox1.Text + "%'")を ("INSERT INTO[dbo].[IMAGE](Genre)" + "SELECT GenreID FROM[dbo].[GENRE] " + "WHERE [dbo].[GENRE].Genre Like N'% "+ textBox1.Text + "%'") に変えて実行しましたがINSERTされていなくて表示されません。 エラー文は表示されずどこが間違っているかわからないので教えてください。
Orlofsky

2019/11/13 01:50

>cmd.CommandText = "INSERT INTO ... cmd.CommandTextの内容を質問に追加しては? デバッガを使えれば。コードを修正しなくても簡単に内容を確認できます。
guest

回答2

0

以下SQLは必ず失敗します。
INSERT INTO [dbo].[IMAGE] (Genre) SELECT GenreID FROM[dbo].[GENRE] WHERE Genre = N'% "+ textBox2.Text + "%'
なぜならば、テーブルの主キーであるImageIDの値が無いレコードを追加しようとしているからです。

あなたが行いたいことはImageID, Genre項目の値を指定したレコードの追加だという気がしますが、そうであればSQLの書き方が誤っています。INSERT文の文法を再確認してください。

投稿2019/11/12 05:32

ku__ra__ge

総合スコア4524

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

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

kswdfr

2019/11/13 00:52 編集

IMAGEテーブルのPhotonameとGENREテーブルのGrnreにINSERTした後GenreにGENREテーブルのGenreIDをSELECTで取得したのをINSERTしたいです。 >>以下SQLは必ず失敗します。 INSERT INTO [dbo].[IMAGE] (Genre) SELECT GenreID FROM[dbo].[GENRE] WHERE Genre = N'% "+ textBox2.Text + "%' なぜならば、テーブルの主キーであるImageIDの値が無いレコードを追加しようとしているからです。 >"INSERT INTO [dbo].[GENRE] (Genre) VALUES (" + "N'" + textBox1.Text + "')でINSERTするときに数字を自動的に追加し追加した後すぐINSERT INTO [dbo].[IMAGE] (Genre) SELECT GenreID FROM[dbo].[GENRE] WHERE Genre = N'% "+ textBox2.Text + "%'をしたいです。
guest

0

自己解決

"INSERT INTO[dbo].IMAGE " +
"SELECT GenreID FROM[dbo].[GENRE] " +
"WHERE Genre Like N'%" + textBox1.Text + "%'";
にしたらできました。

投稿2019/11/13 02:07

kswdfr

総合スコア21

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問