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

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

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

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

Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

Visual Studio

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

.NET Framework

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

Q&A

解決済

1回答

6330閲覧

【VC#】【Dapper】Execute(UPDATE)時に停止

KentaYanagida

総合スコア55

C#

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

Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

Visual Studio

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

.NET Framework

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

0グッド

1クリップ

投稿2014/12/20 04:54

お世話になります。

Dapperを使ってOracleDBへUPDATEを行う際について質問させてください。

下記ソースを実行すると、添付画像の箇所で止まってしまいます(例外にはならない)。
FileInfoやtry-catchは不必要かもしれませんが念のため残してあります、、。

何が原因でしょうか。
また、「ネイティブフレームが呼び出し履歴の最初にあるため、式を評価できません」というメッセージがひたすら並んでいますが、これは何を意味しているのでしょうか。

恐れ入りますがよろしくお願い致します。

以下ソースです。

lang

1using System; 2using System.Data; 3using System.Windows.Forms; 4using Oracle.DataAccess.Client; 5using Dapper; 6 7namespace WindowsFormsApplication 8{ 9 public partial class Form1 : Form 10 { 11 private IDbConnection con; 12 private IDbTransaction trn; 13 14 public Form1() 15 { 16 InitializeComponent(); 17 18 con = new OracleConnection("User Id=xxxx;Password=xxxx;Data Source=XE;"); 19 } 20 21//中略 22 23 private void ProcessStart_Click(object sender, EventArgs e) 24 { 25 foreach (String selected in SampleList.Items) 26 { 27 System.IO.FileInfo fi = new System.IO.FileInfo(@"C:\test\sample.tif"); 28 string folder = selected.Substring(selected.Length - 3, 3); 29 30 try 31 { 32 System.IO.FileInfo copyFile = 33 fi.CopyTo(@"D:\{0}\{1}.tif".Replace("{0}", folder).Replace("{1}", selected)); 34 35 var update = @"UPDATE T1 36 SET C1 = 4 37 , C2 = 1 38 , C3 = 0 39 WHERE C0 IN (SELECT MAX(C0) FROM T1 GROUP BY C1) 40 AND C1 IN ({0})" 41 .Replace("{0}", selected); 42 con.Open(); 43 trn = con.BeginTransaction(); 44 45 con.Execute(update); 46 trn.Commit(); 47 con.Close(); 48 } 49 catch (System.IO.IOException) 50 { 51 if (MessageBox.Show 52 ("C1:{0}\r\n画像が既に存在しています。\r\n上書きしますか?" 53 .Replace("{0}",selected), "" 54 ,MessageBoxButtons.YesNo, MessageBoxIcon.Question) 55 == DialogResult.Yes) 56 { 57 System.IO.FileInfo copyFile = 58 fi.CopyTo(@"D:\{0}\{1}.tif" 59 .Replace("{0}", folder) 60 .Replace("{1}", selected),true); 61 62 var update = @"UPDATE T1 63 SET C1 = 4 64 , C2 = 1 65 , C3 = 0 66 WHERE C0 IN (SELECT MAX(C0) FROM T1 GROUP BY C1) 67 AND C1 IN ({0})" 68 .Replace("{0}", selected); 69 con.Open(); 70 trn = con.BeginTransaction(); 71 72 con.Execute(update); 73 trn.Commit(); 74 con.Close(); 75 } 76 else 77 { 78 } 79 } 80 } 81 SampleList.Items.Clear(); 82 } 83 } 84}

以下停止箇所の画像です。
![NativeFrame]WIDTH:600

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

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

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

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

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

guest

回答1

0

ベストアンサー

int result = cmd.ExecuteNonQuery();の部分で止まるのであればODAC側で例外が発生していると思われます。
停止時にダイアログ等表示されていませんか?
また、プロジェクトのデバッグの設定で「アンマネージコードデバッグを有効にする」にチェックが入っていませんか?
「ネイティブフレームが呼び出し履歴の最初にあるため、式を評価できません」に関しては私の環境では再現できませんでした。

直接関係ありませんがコードで気になった点があったので少し書きなおしてみました。

lang

1private void ProcessStart_Click(object sender, EventArgs e) 2{ 3 foreach (String selected in SampleList.Items) 4 { 5 // using System.IO;追加して記述を整理 6 try 7 { 8 var fi = new FileInfo(@"C:\test\sample.tif"); 9 string folder = selected.Substring(selected.Length - 3, 3); 10 11 // ファイルの存在有無は例外ではなくFile.Existsを使用 12 // ファイル操作とDB操作は分離して記述 13 // 文字列の置換はstring.Formatを利用 14 if (File.Exists(string.Format(@"D:\{0}\{1}.tif",folder, selected))) 15 { 16 if (MessageBox.Show 17 (this, string.Format( 18 "C1:{0}\r\n画像が既に存在しています。\r\n上書きしますか?" 19 , selected), "" 20 , MessageBoxButtons.YesNo, MessageBoxIcon.Question) 21 == DialogResult.Yes) 22 { 23 FileInfo copyFile = 24 fi.CopyTo(string.Format(@"D:\{0}\{1}.tif", folder, selected) 25 , true); 26 } 27 else 28 { 29 // 上書きしないなら次のselectedに 30 continue; 31 } 32 } 33 else 34 { 35 FileInfo copyFile = 36 fi.CopyTo(string.Format(@"D:\{0}\{1}.tif", folder, selected)); 37 } 38 } 39 catch (IOException e) 40 { 41 MessageBox.Show(this, e.ToString()); 42 } 43 44 try 45 { 46 // 名前付きパラメータを利用 47 var update = @"UPDATE T1 48 SET C1 = 4 49 , C2 = 1 50 , C3 = 0 51 WHERE C0 IN (SELECT MAX(C0) FROM T1 GROUP BY C1) 52 AND C1 IN (:Selected)"; 53 con.Open(); 54 trn = con.BeginTransaction(); 55 56 con.Execute(update, new {Selected=selected }); 57 trn.Commit(); 58 con.Close(); 59 } 60 catch (OracleException oe) 61 { 62 MessageBox.Show(this, oe.ToString()); 63 } 64 finally 65 { 66 if (con != null) 67 con.Close(); 68 } 69 70 } 71 SampleList.Items.Clear(); 72}

投稿2014/12/21 04:44

sho_cs

総合スコア3541

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

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

KentaYanagida

2014/12/21 10:49

sho_cs様、いつもありがとうございます。 コードレビューまで頂き感激です。とても勉強になります。 参考に修正させて頂きました。 停止時にはダイアログは出ず、放っておけば処理も実行されるようです。 「アンマネージコードデバッグを有効にする」のチェックも入っておりませんでした。 ODAC側の例外であったり、sho_cs様の環境で再現しないようであれば、私の環境を疑ったほうが良さそうですね…。
KentaYanagida

2014/12/22 01:22

使用するOracleDBと、UPDATE文の簡略化を行った所、正常に処理が完了しました。 Oracle側の問題のようですので、DBAと相談致します。 この度も誠にありがとうございました。 よろしければ今後ともよろしくお願い致します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問