goo blog サービス終了のお知らせ 

uso

雑記いろいろ
★書いてある内容に保証は一切ありません。
 ご自身で判断をしてください。

[C# .NET] 小ネタ1

2014-06-06 12:23:49 | work
■DataTableからList<Object>を作る

        private List<object> GetKeyColumnValue( DataTable targetTable , string columnName )
        {
            var result = new List<object>();
            var item = targetTable.AsEnumerable().ToList<DataRow>().Select( x => x[ columnName ] );

            foreach( var value in item )
            {
                result.Add( value );
            }

            return result;
        }


■Table.AsEnumerable()を使うときの注意

以下、二つの参照が必要。
System.Data
System.Data.DataSetExtensions

デフォルトであるが、
using System.Data;
も書く必要がある。


■OracleのRaw型を扱うとき

参考:http://sonic64.com/2005-08-04.html

// 文字をbyte[]に
byte[] aaa = System.Text.Encoding.Unicode.GetBytes( "1" );

// 逆
string strFromByte = Encoding.Unicode.GetString(byteArray);

で値を作ると、
  byte[] = new byte[2];
  byte[0] = 49
  byte[1] = 0
となり、ツールによっては文字変換したら「1」と出る。


■Linq?を使ってみた

var directionsFoundationRowData =
from directionsFoundationRow in directionsFondationDataTable.AsEnumerable()
where CompareObjects( directionsFoundationRow.Field<byte[]>( "DIRECTION_RECORD_CLASS_ID" ), physicalProcessRow[ "DIRECTION_RECORD_CLASS_ID" ] )
select directionsFoundationRow;

DataRow targetDirectionsFondationRow = directionsFoundationRowData.First();

DataTable⇒DataRowのコレクション?⇒DataRowと取っている。
First()は最初の行を取る。

■かっこいいテーブルのデータ移動

// aaのテーブルをbbに移動する
DataSet aa = new DataSet();
DataSet bb = new DataSet();

DataTable[] aaa = ( from DataTable x in aa.Tables select x ).ToArray();

bb.Tables.AddRange( aaa );

■OracleTransaction

usingとtry~catchの書き方で迷ったので調査した。

try

using ( オラクルコネクション生成 )

  // コネクションオープン
  
  // トランザクションBegin

  // 更新処理
  
  // ★更新処理でExceptionが起こった時、
  //  usingを抜けるので、コネクションが閉じて破棄されてしまう。
  // なので、キャッチのロールバックで落ちる。
 

catch

  // ロールバック
  // エラー処理など


コネクションが閉じたとき、トランザクションはどうなってしまうのか、
というのが気になり、調べたら、
SQLサーバー?のトランザクションと微妙に説明が違うので注意。
しかも、ODP.NETは現在のVerでおしまいらしいので、古い情報となるのだろうなぁ。

SqlTransaction.Rollback メソッド
http://msdn.microsoft.com/ja-jp/library/zayx5s0h.aspx

「トランザクションは、保留中の状態 (BeginTransaction の呼び出し後、Commit の呼び出し前) だけからロールバックできます。
 Commit または Rollback が呼び出される前に破棄された場合、トランザクションはロールバックされます。」


OracleTransaction.Rollback メソッド
http://msdn.microsoft.com/ja-jp/library/system.data.oracleclient.oracletransaction.rollback(v=vs.110).aspx
「トランザクションをロールバックできるのは、保留中の状態 (BeginTransaction の呼び出し後、Commit の呼び出し前) からだけです。」

SqlTransactionはロールバックするけど、OracleTransactionは何もしない。
つまり、コミットもロールバックもしないから、どうなるの?
って感じなんですが、わからないです。なんかメモリ上に残るのかな。

とりあえず、キャッチにロールバックはいらない。ということにした。
ただ、ロールバックがないと気持ち悪いのと、コードレビューで明示的にロールバックしていないと
いろいろ言われる(当然だが)ので、

try

using ( オラクルコネクション生成 )

  // コネクションオープン
  
  // トランザクションBegin

  try
  {
   // 更新処理
  }
  catch
  {
   //ロールバック
   throw
  }  


catch

  // エラー処理など


という、ダサい形にしてみた。
みんな、こういう時、とうしているのだろう?

そして、OracleTransaction.Disposeはしなくていいのかと思う。
MSDNを見ていると、Disposeはあるので、呼ばないとダメだが、Disposeのページの
例コードすらDisposeを呼んでいない。

適当にサイトを見ているが、よくわからんし、usingを使ってないことも多い。
(usingって使わない方がいいのかな?)

using( コネクション )

 using( トランザクション )
 {
  
 }


なんてことをしているのもないし、、、
意外なところで奥の深さを知りました。


最新の画像もっと見る

コメントを投稿

ブログ作成者から承認されるまでコメントは反映されません。