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

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

ただいまの
回答率

90.49%

  • C#

    7414questions

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

  • Visual Studio

    1903questions

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

  • Oracle

    612questions

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

  • .NET Framework

    478questions

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

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

解決済

回答 1

投稿 ・編集

  • 評価
  • クリップ 1
  • VIEW 2,527

KentaYanagida

score 40

お世話になります。

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

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

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

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

以下ソースです。
using System;
using System.Data;
using System.Windows.Forms;
using Oracle.DataAccess.Client;
using Dapper;

namespace WindowsFormsApplication
{
    public partial class Form1 : Form
    {
        private IDbConnection con;
        private IDbTransaction trn;
        
        public Form1()
        {
            InitializeComponent();

            con = new OracleConnection("User Id=xxxx;Password=xxxx;Data Source=XE;");
        }

//中略

        private void ProcessStart_Click(object sender, EventArgs e)
        {
            foreach (String selected in SampleList.Items)
            {
                System.IO.FileInfo fi = new System.IO.FileInfo(@"C:\test\sample.tif");
                string folder = selected.Substring(selected.Length - 3, 3);

                try
                {
                    System.IO.FileInfo copyFile =
                    fi.CopyTo(@"D:\{0}\{1}.tif".Replace("{0}", folder).Replace("{1}", selected));

                    var update = @"UPDATE T1
                                      SET C1 = 4
                                        , C2 = 1
                                        , C3 = 0
                                    WHERE C0 IN (SELECT MAX(C0) FROM T1 GROUP BY C1)
                                      AND C1 IN ({0})"
                                 .Replace("{0}", selected);
                    con.Open();
                    trn = con.BeginTransaction();

                    con.Execute(update);
                    trn.Commit();
                    con.Close();
                }
                catch (System.IO.IOException)
                {
                    if (MessageBox.Show
                   ("C1:{0}\r\n画像が既に存在しています。\r\n上書きしますか?"
                    .Replace("{0}",selected), ""
                    ,MessageBoxButtons.YesNo, MessageBoxIcon.Question) 
                      == DialogResult.Yes)
                    {
                        System.IO.FileInfo copyFile =
                        fi.CopyTo(@"D:\{0}\{1}.tif"
                        .Replace("{0}", folder)
                        .Replace("{1}", selected),true);

                        var update = @"UPDATE T1
                                          SET C1 = 4
                                            , C2 = 1
                                            , C3 = 0
                                        WHERE C0 IN (SELECT MAX(C0) FROM T1 GROUP BY C1)
                                          AND C1 IN ({0})"
                                     .Replace("{0}", selected);
                        con.Open();
                        trn = con.BeginTransaction();

                        con.Execute(update);
                        trn.Commit();
                        con.Close();
                    }
                    else
                    {
                    }
                }
            }
            SampleList.Items.Clear();
        }
    }
}
以下停止箇所の画像です。
NativeFrame
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

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


直接関係ありませんがコードで気になった点があったので少し書きなおしてみました。
private void ProcessStart_Click(object sender, EventArgs e)
{
    foreach (String selected in SampleList.Items)
    {
        // using System.IO;追加して記述を整理
        try
        {
            var fi = new FileInfo(@"C:\test\sample.tif");
            string folder = selected.Substring(selected.Length - 3, 3);

            // ファイルの存在有無は例外ではなくFile.Existsを使用
            // ファイル操作とDB操作は分離して記述
            // 文字列の置換はstring.Formatを利用
            if (File.Exists(string.Format(@"D:\{0}\{1}.tif",folder, selected)))
            {
                if (MessageBox.Show
               (this, string.Format(
               "C1:{0}\r\n画像が既に存在しています。\r\n上書きしますか?"
                , selected), ""
                , MessageBoxButtons.YesNo, MessageBoxIcon.Question)
                  == DialogResult.Yes)
                {
                    FileInfo copyFile =
                    fi.CopyTo(string.Format(@"D:\{0}\{1}.tif", folder, selected)
                    , true);
                }
                else
                {
                    // 上書きしないなら次のselectedに
                    continue;
                }
            }
            else
            {
                FileInfo copyFile =
                fi.CopyTo(string.Format(@"D:\{0}\{1}.tif", folder, selected));
            }
        }
        catch (IOException e)
        {
            MessageBox.Show(this, e.ToString());
        }

        try
        {
            // 名前付きパラメータを利用
            var update = @"UPDATE T1
                                  SET C1 = 4
                                    , C2 = 1
                                    , C3 = 0
                                WHERE C0 IN (SELECT MAX(C0) FROM T1 GROUP BY C1)
                                  AND C1 IN (:Selected)";
            con.Open();
            trn = con.BeginTransaction();

            con.Execute(update, new {Selected=selected });
            trn.Commit();
            con.Close();
        }
        catch (OracleException oe)
        {
            MessageBox.Show(this, oe.ToString());
        }
        finally
        {
            if (con != null)
                con.Close();
        }

    }
    SampleList.Items.Clear();
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2014/12/21 19:49

    sho_cs様、いつもありがとうございます。
    コードレビューまで頂き感激です。とても勉強になります。
    参考に修正させて頂きました。

    停止時にはダイアログは出ず、放っておけば処理も実行されるようです。
    「アンマネージコードデバッグを有効にする」のチェックも入っておりませんでした。

    ODAC側の例外であったり、sho_cs様の環境で再現しないようであれば、私の環境を疑ったほうが良さそうですね…。

    キャンセル

  • 2014/12/22 10:22

    使用するOracleDBと、UPDATE文の簡略化を行った所、正常に処理が完了しました。
    Oracle側の問題のようですので、DBAと相談致します。

    この度も誠にありがとうございました。
    よろしければ今後ともよろしくお願い致します。

    キャンセル

関連した質問

同じタグがついた質問を見る

  • C#

    7414questions

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

  • Visual Studio

    1903questions

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

  • Oracle

    612questions

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

  • .NET Framework

    478questions

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