■DataTableからList<Object>を作る
■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( トランザクション )
{
}
}
なんてことをしているのもないし、、、
意外なところで奥の深さを知りました。
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( トランザクション )
{
}
}
なんてことをしているのもないし、、、
意外なところで奥の深さを知りました。