ラベル C# の投稿を表示しています。 すべての投稿を表示
ラベル C# の投稿を表示しています。 すべての投稿を表示

2009年4月24日金曜日

C# oracle 連想配列 配列 CLOB

C#でoracleのTableにCLOBのデータを格納したい。
一レコードではなく、複数レコードあるのでまとめて格納したい。

知っている知識として、連想配列を使用する方法を試してみたがエラーが出る。
マニアックなプログラミング備忘録
「内部エラー・コード、引数: [15419],[severe error during PL/SQL execution],[],[],[],[],[],[]」

CommandTypeはTextを指定していたのでそれがいけないのかと思い、ストアドにしてみた。
結果同じエラーが発生。

CLOB以外はうまく行くのでどうやらCLOBでは連想配列を使用出来ないみたい。
10gを使っているので、もしかしたら11gならうまく行くかもしれないけどね。

以下通常版
using(OracleCommand cmd = new (sql, con))
{
cmd.BindName=true;
cmd.CommandType = CommandType.Text;
OracleParameter parm = new OracleParameter("iINPUT", value);
cmd.Parameters.Add(parm);
cmd.ExecuteNonQuery();
}

以下連想配列版
OracleParameter parm = new OracleParameters("iINPUT", OracleDbType.Varchar2, valueList.Count);
parm.CollectionType = OracleCollectionType.PLSQLAssociativeArray;
parm.Direction = ParameterDirection.Input;
parm.Value = valueList.ToArray();
cmd.Parameters.Add(parm);

以下配列
cmd.ArrayBindCount = valueList.Count;
OracleParameter parm = new OracleParameters("iINPUT", OracleDbType.Clob, valueList.Count);
parm.Direction = ParameterDirection.Input;
parm.Value = valueList.ToArray();
cmd.Parameters.Add(parm);

配列バージョンだとCLOBで格納できた。
配列のままをストアドに渡すのか、渡した配列数分繰り返しストアドを実行するのか。
どっちが良いかわからんけど、CLOBでは配列しか出来ないので悩む必要はないかな。
一回一回クライアント側から引数渡して実行するよりは圧倒的に早いだろう。
たぶん。

2009年2月18日水曜日

Visual Studio 2005 C# エディタ内でタブの表示が・となる。

変なショートカットキーを押したらしく、タブ入力している部分が・で表示されるようになった。

Ctrl+R後、Ctrl+Wで治った。

以前もこんなことやったようなのでメモ。

2008年10月9日木曜日

文字列は有効な DateTime として認識されませんでした

文字列は有効な DateTime として認識されませんでした。
インデックス 0 から始まる位置に不明な単語があります。
意味わからん。

が、DBNULLを設定するとそうなるらしい。

2008年10月1日水曜日

DLLからのメソッド呼び出しとかフォーム表示とか

Assembly asm = Assembly.LoadFrom("AAA.dll");
Type t = asm.GetType("NameSpace.NameSpace");
MethodInfo method = t.GetMethod("ABCMethod");
using (Form frm = (Form)asm.CreateInstance("NameSpace.NameSpace"))
{
method.Invoke(frm, parameters.ToArray());
frm.ShowDialog();
}

2008年9月27日土曜日

クラスに定義してあるプロパティの呼び出し

System.ReflectionのGetPropertyを使うとプロパティを呼び出せる。
DLLにあるプロパティを呼ぶのに使用出来る。
メモ。

追記
読み返してみたら結局調べなおさないといけない。
めんどーなので追記する。

例)あるクラスのプロパティをあるクラスにコピーする
object obj = null;
object[] obj2 = null;
Type type = typeof(ClassA);
PropertyInfo[] properties = type.GetProperties();
foreach (PropertyInfo property in properties)
{
obj = type.InvokeMember(property.Name, BindingFlags.GetProperty, null, copyMotoClass, null);
obj2 = new object[1] { obj };
type.InvokeMember(property.Name, BindingFlags.SetProperty, null, copySakiClass, obj2);
}
ClassAはクラスの名前。
copyMotoClassはインスタンス化したクラスの変数名。コピー元。
copySakiClassはインスタンス化したクラスの変数名。コピー先。

MemberwiseClone()を使用しても良いけど、必要な場合もあるので。

2008年7月26日土曜日

その月の日数

DateTime date = new DateTime(2008, 7, 1);
date.AddMonths(1).AddDays(-1);

これで2008年7月の日数を求めていた。
さっき、もしかしたら使えるのでは?と思ったメソッド。

CalendarクラスのGetDayOfMonthメソッド。
これを使えばいちいち足したり引いたりしなくてすむかも。

試してはいない。

2008年7月25日金曜日

オートコンプリート コンボボックス

コンボボックスにオートコンプリートを適用する方法。

// オートコンプリートに使用するSource
comboBox.AutoCompleteSource = AutoCompleteSource.ListItems;
// オートコンプリート時の動作
comboBox.AutoCompleteMode = AutoCompleteMode.SuggestAppend;

AutoCompleteSourceは他にAllSystemSources、AllUrl、FileSystem、HistoryList、RecentlyUsedList、CustomSource、None がある。

AutoCompleteModeは他にAutoAppend、AutoSuggest、AutoSuggestAppend、None がある。

細かいことはネット上に転がっているのでそちらを参照。

これだけでは問題はないが諸事情により、オートコンプリート状態をクリアすることになった。
例えば
0001:AAAA
0002:BBBB

というデータがコンボボックス上にあり、0001入力後、0002と入力した場合BBBBを表示したい。
そこでオートコンプリートをクリアしようと思ったがそれらしいメソッドが見つからず。
SendKeys.Send()メソッドにてESCを送信するようにした。
とりえあずはこれでうまくいった模様。

2008年7月23日水曜日

System.ComponentModel.Design.Serialization.CodeDomSerializerBase.Error

SourceGridを使用。
ユーザーコントロール1に貼り付け。
ユーザーコントロール2にユーザーコントロール1を貼り付け。
ユーザーコントロール2をデザイナで開くとエラーとなる。

エラーはすっごい長いエラーが出て最後に
System.ComponentModel.Design.Serialization.CodeDomSerializerBase.Error
こんなのが出てた。

意味不明。

色々とネットで探し回る。
コード開いてShift+F7で大丈夫だとか。
Spliterの最小値に変な設定するとおかしくなるとか。
プロジェクトの入っているフォルダの検索インデックスを無効にすると大丈夫だとか。

一体何がいけないのか。
SouceGridをユーザーコントロールに貼り付けるのがいけないのか。
はたまた、Serialize化に関する記述が抜けているのか。

だんだんとVS2005が重くなってきたので一旦落とした。
開きなおしてみるとデザイナで開けた。

なんだったんだこの三時間は!

こんなこともあるんだな。

追加
Excel.Application が定義されていません。
と出たりするのもVS2005再起動すると直る。