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

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

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

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

Oracle Database 10g

Oracle DatabaseはRDBMSの商品です。具体的な発売商品として知られているのが、 Oracle9i、Oracle10g、Oracle 11gとOracle 12cです。

Q&A

2回答

14476閲覧

C#でのDB(Oracle)のupdateがうまくいきません

YURU-POTATO

総合スコア6

C#

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

Oracle Database 10g

Oracle DatabaseはRDBMSの商品です。具体的な発売商品として知られているのが、 Oracle9i、Oracle10g、Oracle 11gとOracle 12cです。

0グッド

0クリップ

投稿2017/08/18 14:56

編集2017/08/19 04:40

###前提・実現したいこと
C#でOracleに接続し、データベースを操作するプログラムの書き方を勉強中の身です。

http://www.webcodeexpert.com/2014/01/how-to-create-3-tier-application-in.html?m=1

上記サイトを参考に行っているのですが、update文の箇所のみ上手くいかず、困っています。
(delete、insertなど他の操作はできています)

※上記サイトはSQLServer向けのため、接続コードなど、一部変更を加えました。

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

エラーなし。

SQLの実行が上手くいっていないようです。
(C#を介さず実行したところ、問題なくバインドも実行もできました)

デバッグで確認しましたが、「result = cmd.ExecuteNonQuery();」部分でSQLが実行され、変更するレコード数が「result」に格納されるはずが、値が0になり、変更も反映されていませんでした。

バインド変数のパラメーター部分には値が入っていることを確認済です。
DALファイルのUpdateBookRecordを呼び出している箇所を見ても何も気づけませんでした。

色々試しましたが、何分知識も経験も足らず、自己解決は難しそうなため、修正点を教えていただければ幸いです……。
(原因箇所が該当ソースと違う可能性が高い場合はそれだけでも教えていただければ助かります)

###該当のソースコード

C#

1//…DAL.csファイル 2 3public int UpdateBookRecord(BooksDetails_BEL objBEL) 4{ 5 6int result; 7 8try 9{ 10string sql=@" 11UPDATE YY_BOOKDETAILS 12SET BOOKNAME = :BOOKNAME 13,AUTHOR = :AUTHOR 14,PUBLISHER = :PUBLISHER 15,PRICE = :PRICE 16,WHERE BOOKID = :BOOKID 17"; 18 19OracleCommand Add = new OracleCommand (sql,con); 20 21cmd.Parameters.Add("BOOKID", objBEL. BookId); 22cmd.Parameters.Add("BOOKNAME", objBEL. BookName); 23cmd.Parameters.Add("AUTHOR", objBEL. Author); 24cmd.Parameters.Add("PUBLISHER, objBEL. Publisher); 25cmd.Parameters.Add("PRICE", objBEL Price) ; 26 27 28if (con.State == ConnectionState.Closed) 29 { 30con.Open() 31 } 32 33result = cmd.ExecuteNonQuery(); 34 35cmd.Dispose (); 36 37if (result> 0) 38 { 39return result; 40 } 41else 42 { 43return 0; 44 } 45 46} 47}

(インデントが消えて見にくくなってしまい、すいません)

###補足情報(言語/FW/ツール等のバージョンなど)
言語/C#
ツール/visual studio (2010)
DB/Oracle (10g)
oracle.dataaccess version=2.112.1.0

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

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

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

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

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

seastar3

2017/08/19 17:01

Oracleのテーブルの形式とサンプルデータを示してください。
guest

回答2

0

ExecuteNonQuery()の結果が0ということは、クエリは走行したが、そのクエリで影響を受けたレコードは0件ということです。
つまり、クエリは正常に動作していますが、パラメータの指定に誤りがあり、求めた条件でクエリが走行していないでしょうね。

何も指定しなかった場合、記されているSQLであれば、パラメータの指定順序は出現順でなければなりません。
つまり、名前でのバインドは行われません。

C#

1cmd.Parameters.Add("BOOKNAME", objBEL.BookName); 2cmd.Parameters.Add("AUTHOR", objBEL.Author); 3cmd.Parameters.Add("PUBLISHER", objBEL.Publisher); 4cmd.Parameters.Add("PRICE", objBEL.Price) ; 5cmd.Parameters.Add("BOOKID", objBEL.BookId);

OracleCommandを生成した直後に以下コードを記せば、名前でバインドしますので、パラメータの指定順序を気にする必要がなくなります。

C#

1cmd.BindByName = true;

投稿2017/08/21 00:39

編集2017/08/21 00:47
takiru

総合スコア130

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

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

0

単純に

Java

1cmd.Parameters.Add("BOOKID", objBEL. BookId); 2cmd.Parameters.Add("BOOKNAME", objBEL. BookName); 3cmd.Parameters.Add("AUTHOR", objBEL. Authir); 4cmd.Parameters.Add("PUBLISHER, objBEL. Publisher); 5cmd.Parameters.Add("PRICE", objBEL Price) ;

の箇所が

Java

1cmd.Parameters.Add("BOOKID", objBEL.BookId); 2cmd.Parameters.Add("BOOKNAME", objBEL.BookName); 3cmd.Parameters.Add("AUTHOR", objBEL.Authir); 4cmd.Parameters.Add("PUBLISHER, objBEL.Publisher); 5cmd.Parameters.Add("PRICE", objBEL.Price) ;

ではないかと思います。

投稿2017/08/18 17:19

seastar3

総合スコア2285

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

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

YURU-POTATO

2017/08/19 04:47

すいません、補足です。 こちらは会社で与えられ課題でして、USBの持ち込み等できないため、印刷・手書きしたものをスマホアプリで読み取りテキスト化し、修正を加えたものです。 実際のコードにスペルミスや余計な空白はなさそうです。(こちらのソースでご指摘いただいた箇所は後ほど修正します) 回答ありがとうございました。 >>C♯・Oracleが使用可能な方。 もし可能でしたら、サイトのプログラムをを試してみていただきたいです。 問題なく実行できるようでしたら、updateに関連する箇所のソースを見せていただけないでしょうか。 私自身が問題を把握できていないため回答しにくいとは思いますが非常に困っていますのでご協力お願いします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問