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

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

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

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

SQL Server

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

Visual Studio

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

Q&A

解決済

2回答

1316閲覧

SQL serverデータベースの特定の行の値を更新したい(C#、Visual Studio)

nabesi

総合スコア13

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

SQL Server

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

Visual Studio

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

0グッド

0クリップ

投稿2018/12/20 17:05

英単語帳を作成していて、現在SQL serverデータベースへ値の登録までできたのですが、Update文での値の更新がうまくいかないので質問します。

やりたいことは、データベースよりランダムで行を取得したものを
その行を編集したい時に、UIから編集できるようにしたいです。

一応調べてエラーがで出ないように書けたのですが、データベースが更新されていません。
おかしいところがあれば教えてください。

PlayLabel.cs

1 //接続文字列の初期化はしています。 2 //データベースの更新 新しい4つの値を引数へ入れて更新させる。 3 public void EditRow(string jp, string en, string addi, string audi) 4 { 5 SqlCommand Updcom = new System.Data.SqlClient.SqlCommand(); 6 7 connection.Open(); 8 try 9 { 10 Updcom.Connection = connection; 11 Updcom.CommandType = CommandType.Text; 12 13 //現在の主キーId番号の各列の値を変更する 14 Updcom.CommandText = "UPDATE [Sentence] " + 15 "SET [JpSentence] = @JpSentence, " + 16 "[EnSentence] = @EnSentence, " + 17 "[Addition] = @Addition," + 18 "[AudioLink] = @AudioLink " + 19 "WHERE [Id] = SCOPE_IDENTITY()"; 20 21 Updcom.Parameters.AddWithValue("@jpSentence", en); 22 Updcom.Parameters.AddWithValue("@EnSentence", en); 23 Updcom.Parameters.AddWithValue("@Addition", addi); 24 Updcom.Parameters.AddWithValue("@AudioLink", audi); 25 26 Updcom.ExecuteNonQuery(); 27 } 28 catch (Exception exception) 29 { 30 Console.WriteLine(exception.Message); 31 throw; 32 } 33 finally 34 { 35 connection.Close(); 36 } 37 38 }

データの取り出しは以下のようにしています。

PlayLabel.cs

1 //ランダムで1行のデータを取り出す 2 public void GetRow() 3 { 4 connection.Open(); 5 try 6 {  //ランダムでひとつ取り出す 7 string sqlstr = "select top(1) * from Sentence order by NEWID()"; 8 9 SqlCommand com = new SqlCommand(sqlstr, connection); 10 11 //SQLクエリの結果を読み出すSqlDataReader オブジェクトを取得 12 SqlDataReader sdr = com.ExecuteReader(); 13 while (sdr.Read() == true) 14 { 15 //インデクサーに列名を与え値を取得する 16 ID = (int)(DBNull.Value.Equals(sdr["Id"]) ? null : sdr["Id"]); 17 JpSentence = (string)(DBNull.Value.Equals(sdr["JpSentence"]) ? null : sdr["JpSentence"]); 18 EnSentence = (string)(DBNull.Value.Equals(sdr["EnSentence"]) ? null : sdr["EnSentence"]); 19 Addition = (string)(DBNull.Value.Equals(sdr["Addition"]) ? null : sdr["Addition"]); 20 AudioLink = (string)(DBNull.Value.Equals(sdr["AudioLink"]) ? null : sdr["AudioLink"]); 21 } 22 } 23 catch (Exception exception) 24 { 25 Console.WriteLine(exception.Message); 26 throw; 27 } 28 finally 29 { 30 connection.Close(); 31 } 32 }

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

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

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

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

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

guest

回答2

0

ざっと見ただけで他にも何かあるかもしれませんが、気になったのは update 文で主キー id に設定している scope_identity() です。編集したレコードの元々の(表題で言う「特定の行」の)主キー値を設定するはずですが?

投稿2018/12/20 22:51

編集2018/12/20 23:35
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

nabesi

2018/12/21 03:11

回答ありがとうございました。Where部分でご指摘のあった部分に取り出したIDを入れると、目的通りのデータ更新ができました。感謝します。 where部分を右に変えて       "WHERE [Id] = @Id"; この1行を加えるとできました!   Updcom.Parameters.AddWithValue("@Id", ID);
guest

0

ベストアンサー

SCOPE_IDENTITYはスコープ内で、最後に挿入されたIDENTITY列の値を取得するものです。

読み込んだデータに対しての更新ですから、読み込んだIDをwhere条件にする必要があります。

投稿2018/12/21 00:48

sazi

総合スコア25195

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

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

nabesi

2018/12/21 03:10

回答ありがとうございました。Where部分でご指摘のあった部分に取り出したIDを入れると、目的通りのデータ更新ができました。感謝します。 where部分を右に変えて       "WHERE [Id] = @Id"; この1行を加えるとできました!   Updcom.Parameters.AddWithValue("@Id", ID);
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問