C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[3]: 【C#】Oracleから取得したデータが、MDBに書かれない


(過去ログ 100 を表示中)

[トピック内 7 記事 (1 - 7 表示)]  << 0 >>

■59196 / inTopicNo.1)  【C#】Oracleから取得したデータが、MDBに書かれない
  
□投稿者/ talman (3回)-(2011/05/18(Wed) 20:35:07)

分類:[C#] 

お疲れ様です。
質問をお願い致します。

OS:WindowsXP
DB:Oracle10g,Access2003
IDE:VisualStudio2008

以下のようなメソッドで、MDBファイルを作成し、Oracle10gDBより、取得したデータをMDBファイルのテーブルに書き込んでおります。
MDBファイル、TBL、データ作成は、想定通り行われるのですが、何故か1レコード目だけが作成されません。
デバックで確認すると、DBよりデータは取得できていて、ループも5回実行されています。
分からないことに、Oracle用のSQLを宣言している箇所から、コネクションのクローズメソッドまでの間にブレークポイントを張り、デバックを開始します。
一度、ブレークポイントでストップしてから「デバック開始」を実行すると、想定通り、全てのレコードが出力されます。
このような現象を、ご存知の方がいらっしゃいましたら、アドバイスをお願い致します。

・予想結果
TEST_TBL.TEST_CD
01
02
03
04
05

・実際の結果
02
03
04
05

public void createItemTypeTbl(OracleCommand cmd, Context context)
{
try
{
//MDBコネクション作成
/*@"Provider=Microsoft.Jet.OLEDB.4.0;"+ "Data Source=C:\\DB\\DB.MDB;"に設定しています*/
OleDbConnection mdbConnect = new OleDbConnection(Constant.MDB_CONNECTION);

//MDB登録SQLの設定
String insertSql = @"INSERT
INTO
TEST_TBL
VALUES(
:pTEST_CD
)";

//DBコマンドの設定
OleDbCommand mdbCommand = new OleDbCommand(insertSql, mdbConnect);

//カタログの宣言
ADOX.CatalogClass catalog = (ADOX.CatalogClass)context[Constant.CATALOG];

// テーブルを作成する(T_HD_M_ITEM_TYPE)
ADOX.TableClass table = new ADOX.TableClass();
//テーブルをカタログに登録する前に、固有の設定を行う
table.ParentCatalog = catalog;
//テーブル名の設定
table.Name = "TEST_TBL";

// 品目種コード列の作成(ITEM_TYPE_CD)
ADOX.ColumnClass columnTestCd = new ADOX.ColumnClass();
columnTestCd.ParentCatalog = catalog;
//列名を設定
columnTestCd.Name = "TEST_CD";
//桁数を設定
columnTestCd.DefinedSize = 8;
//列に設定した内容を登録
table.Columns.Append(columnTestCd, ADOX.DataTypeEnum.adVarWChar, columnTestCd.DefinedSize);

//プライマリーキーの設定
table.Keys.Append("PrimaryKey", ADOX.KeyTypeEnum.adKeyPrimary, "TEST_CD", "", "");

//カタログにテーブル定義を設定
catalog.Tables.Append(table);

/*ブレークポイントを張って一度ストップし、「デバック開始」実行で、全てのレコードが出力される*/
/*↓ここから↓*/
String sql = @" SELECT
A.TEST_CD
FROM
TEST_TBL A";

//Oracleパラメータ用のリストを宣言
List<OracleParameter> opArray = new List<OracleParameter>();
//SQLの実行、データセットへ格納
DataSet Ds = doSelect(cmd, sql, opArray);

//コネクションを開く
mdbConnect.Open();

//Oracleより取得したDataSet分ループして、MDBに書き込みを行う
for (int i = 0; i < Ds.Tables[0].Rows.Count; i++)
{

//SQLパラメータに、TEST_CDを設定
mdbCommand.Parameters.Add(":pTEST_CD", OleDbType.VarWChar, 8);
mdbCommand.Parameters[":pTEST_CD"].Value = Ds.Tables[0].Rows[i]["TEST_CD"];

//SQLの実行
mdbCommand.ExecuteNonQuery();


/*↑ここまで↑*/
}
/*ここでブレークポイントを張っても1レコード目は書き込みされない*/
//コネクションを閉じる
mdbConnect.Close();

}
catch (Exception ex)
{

}
}

大変申し訳ないのですが、どうぞ、宜しくお願い致します。

引用返信 編集キー/
■59198 / inTopicNo.2)  Re[1]: 【C#】Oracleから取得したデータが、MDBに書かれない
□投稿者/ shu (695回)-(2011/05/18(Wed) 22:35:44)
No59196 (talman さん) に返信

まずはADOXの処理とOleDBの処理を分けて実行してみてはどうでしょう?

引用返信 編集キー/
■59199 / inTopicNo.3)  Re[2]: 【C#】Oracleから取得したデータが、MDBに書かれない
□投稿者/ talman (4回)-(2011/05/18(Wed) 22:45:42)
No59198 (shu さん) に返信
> ■No59196 (talman さん) に返信
>
> まずはADOXの処理とOleDBの処理を分けて実行してみてはどうでしょう?
>

shuさん、お疲れ様です。
早速のご回答ありがとうございます。

ADOXの処理とOleDBの処理を別々のメソッドで呼出すようにしたのですが、駄目でした。
ですが、原因がなんとなく分かりましたので、報告させて頂きます。

>//プライマリーキーの設定
>table.Keys.Append("PrimaryKey", ADOX.KeyTypeEnum.adKeyPrimary, "TEST_CD", "", "");
上記のように、PKを設定している箇所をコメントアウトしたら、コンソールの画面が若干早くなりました。
そうすると、なんと1レコード目が出力されていました。
処理速度の問題なのかもしれませんが、このような現象が起こりえるのですね。。。(ブレークポイントを張ると、ワンテンポ置けますし???)
まだ試していませんが、暫定的に、データの登録が完了したら、PKを設定しようかと思っております。

処理速度を速める方法等、いい案が御座いましたら、アドバイスを頂けないでしょうか?
宜しくお願い致します。






引用返信 編集キー/
■59209 / inTopicNo.4)  Re[3]: 【C#】Oracleから取得したデータが、MDBに書かれない
□投稿者/ talman (6回)-(2011/05/19(Thu) 10:35:14)
No59199 (talman さん) に返信
> ■No59198 (shu さん) に返信
>>■No59196 (talman さん) に返信
>>
>>まずはADOXの処理とOleDBの処理を分けて実行してみてはどうでしょう?
>>
>
> shuさん、お疲れ様です。
> 早速のご回答ありがとうございます。
>
> ADOXの処理とOleDBの処理を別々のメソッドで呼出すようにしたのですが、駄目でした。
> ですが、原因がなんとなく分かりましたので、報告させて頂きます。
>
> >//プライマリーキーの設定
> >table.Keys.Append("PrimaryKey", ADOX.KeyTypeEnum.adKeyPrimary, "TEST_CD", "", "");
> 上記のように、PKを設定している箇所をコメントアウトしたら、コンソールの画面が若干早くなりました。
> そうすると、なんと1レコード目が出力されていました。
> 処理速度の問題なのかもしれませんが、このような現象が起こりえるのですね。。。(ブレークポイントを張ると、ワンテンポ置けますし???)
> まだ試していませんが、暫定的に、データの登録が完了したら、PKを設定しようかと思っております。
>
> 処理速度を速める方法等、いい案が御座いましたら、アドバイスを頂けないでしょうか?
> 宜しくお願い致します。
>
>

お疲れ様です。
原因がわかり、暫定的に解決方法が見つかりましたので、クローズさせて頂きます。
shuさん、ご回答ありがとう御座いました。



解決済み
引用返信 編集キー/
■59229 / inTopicNo.5)  Re[1]: 【C#】Oracleから取得したデータが、MDBに書かれない
□投稿者/ 魔界の仮面弁士 (2173回)-(2011/05/19(Thu) 16:01:37)
2011/05/19(Thu) 16:09:07 編集(投稿者)

No59196 (talman さん) に返信
> 一度、ブレークポイントでストップしてから「デバック開始」を実行すると、想定通り、全てのレコードが出力されます。
> このような現象を、ご存知の方がいらっしゃいましたら、アドバイスをお願い致します。

mdb への書き込みを行う際には、トランザクションを明示的に発行してください。
複数のコネクションがある場合、明示的な Commit を行わないと、うまく書き込まれなかったり
遅延書き込みされてしまうなどの現象が起きることがあるようです。

今回のケースがそれに当てはまるかどうかまでは分かりませんが、
いずれにせよ、OleDbTransaction を併用しておいた方が良いでしょう。
http://msdn.microsoft.com/ja-jp/library/93ehy0z8.aspx


詳細は下記をご覧ください。.NET 以前の古い記事ですけれども。
http://goo.gl/pHfbE

(↑ URL中の単語がスパムワードとして扱われているため、投稿拒否されないよう、短縮URLにしています)



> 質問をお願い致します。
# 「回答をお願いします」という場合と「質問をお願いします」という場合を見ますけど、
# これらは同じ意味なのかな…。ニュアンス的には異なるかも知れませんけど。


> デバックで確認すると、DBよりデータは取得できていて、ループも5回実行されています。
デバッ「グ」が一般的かと思います。スペルも DEBUG なわけですし。
解決済み
引用返信 編集キー/
■59240 / inTopicNo.6)  Re[2]: 【C#】Oracleから取得したデータが、MDBに書かれない
□投稿者/ talman (7回)-(2011/05/19(Thu) 19:41:08)
No59229 (魔界の仮面弁士 さん) に返信
> 2011/05/19(Thu) 16:09:07 編集(投稿者)
>
> ■No59196 (talman さん) に返信
>>一度、ブレークポイントでストップしてから「デバック開始」を実行すると、想定通り、全てのレコードが出力されます。
>>このような現象を、ご存知の方がいらっしゃいましたら、アドバイスをお願い致します。
>
> mdb への書き込みを行う際には、トランザクションを明示的に発行してください。
> 複数のコネクションがある場合、明示的な Commit を行わないと、うまく書き込まれなかったり
> 遅延書き込みされてしまうなどの現象が起きることがあるようです。
>
> 今回のケースがそれに当てはまるかどうかまでは分かりませんが、
> いずれにせよ、OleDbTransaction を併用しておいた方が良いでしょう。
> http://msdn.microsoft.com/ja-jp/library/93ehy0z8.aspx
>
>
> 詳細は下記をご覧ください。.NET 以前の古い記事ですけれども。
> http://goo.gl/pHfbE
>
> (↑ URL中の単語がスパムワードとして扱われているため、投稿拒否されないよう、短縮URLにしています)
>
>
>
>>質問をお願い致します。
> # 「回答をお願いします」という場合と「質問をお願いします」という場合を見ますけど、
> # これらは同じ意味なのかな…。ニュアンス的には異なるかも知れませんけど。
>
>
>>デバックで確認すると、DBよりデータは取得できていて、ループも5回実行されています。
> デバッ「グ」が一般的かと思います。スペルも DEBUG なわけですし。

魔界の仮面弁士さん、お疲れ様です。
ご回答ありがとうございます。

OleDbTransactionの実装を行ってみたいと思います。
トランザクション実装で問題が解決したら、報告させて頂きます。
また、文言のご指摘、ありがとう御座います。

以上、宜しくお願い致します。



引用返信 編集キー/
■59524 / inTopicNo.7)  Re[3]: 【C#】Oracleから取得したデータが、MDBに書かれない
□投稿者/ talman (8回)-(2011/05/30(Mon) 15:50:10)
No59240 (talman さん) に返信
> ■No59229 (魔界の仮面弁士 さん) に返信
>>2011/05/19(Thu) 16:09:07 編集(投稿者)
>>
>>■No59196 (talman さん) に返信
> >>一度、ブレークポイントでストップしてから「デバック開始」を実行すると、想定通り、全てのレコードが出力されます。
> >>このような現象を、ご存知の方がいらっしゃいましたら、アドバイスをお願い致します。
>>
>>mdb への書き込みを行う際には、トランザクションを明示的に発行してください。
>>複数のコネクションがある場合、明示的な Commit を行わないと、うまく書き込まれなかったり
>>遅延書き込みされてしまうなどの現象が起きることがあるようです。
>>
>>今回のケースがそれに当てはまるかどうかまでは分かりませんが、
>>いずれにせよ、OleDbTransaction を併用しておいた方が良いでしょう。
>>http://msdn.microsoft.com/ja-jp/library/93ehy0z8.aspx
>>
>>
>>詳細は下記をご覧ください。.NET 以前の古い記事ですけれども。
>>http://goo.gl/pHfbE
>>
>>(↑ URL中の単語がスパムワードとして扱われているため、投稿拒否されないよう、短縮URLにしています)
>>
>>
>>
> >>質問をお願い致します。
>># 「回答をお願いします」という場合と「質問をお願いします」という場合を見ますけど、
>># これらは同じ意味なのかな…。ニュアンス的には異なるかも知れませんけど。
>>
>>
> >>デバックで確認すると、DBよりデータは取得できていて、ループも5回実行されています。
>>デバッ「グ」が一般的かと思います。スペルも DEBUG なわけですし。
>
> 魔界の仮面弁士さん、お疲れ様です。
> ご回答ありがとうございます。
>
> OleDbTransactionの実装を行ってみたいと思います。
> トランザクション実装で問題が解決したら、報告させて頂きます。
> また、文言のご指摘、ありがとう御座います。
>
> 以上、宜しくお願い致します。
>
>
お疲れ様です。
暫定的ですが、解決しましたので、報告させて頂きます。

ADOXの処理とOleDBの処理を、別々のクラスに定義し、
書き込みの単位でトランザクションを発行したところ、正常にデータが書き込まれるようになりました。
処理の速度が上がった理由はわからないのですが、現状はこの方法にて対応を行いました。

皆様、お忙しいところ、ありがとうございました。







解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -