アプリケーション全体に、厳密に型指定されたデータセットがいくつかあります。それぞれに複数のテーブルがあるため、データを更新するメソッドを記述するのは面倒です。すべてのテーブルを簡単に更新できる汎用関数を 1 つ作成したいと考えています。DataSet ごとにこれらのいずれかを作成する必要があるかどうかは気にしませんが、1 つの関数でそれらすべてを処理できるとしたら、それは素晴らしいことです!
新しいレコード、更新されたレコード、または削除されたレコードの数に制限はなく、各行に適切にフラグを立てる必要があります。この関数は、実際の保存のみを処理する必要があります。これが私がこれまでに持っているものです:
private bool SaveData(object oTableAdaptor, object ds)
{
try
{
Type oType = oTableAdaptor.GetType();
MethodInfo[] oMethodInfoArray = oType.GetMethods();
foreach (MethodInfo oMI in oMethodInfoArray)
{
if (oMI.Name == "Update")
{
ParameterInfo[] oParamaterInfoArray = oMI.GetParameters();
foreach (ParameterInfo oPI in oParamaterInfoArray)
{
Type DsType = null;
if (oPI.ParameterType.Name == "NameOfDataSet")
{
DsType = typeof(MyDataSet);
// get a list of the changed tables???
}
if (((DataSet)ds).HasChanges() == true)
{
if (oPI.ParameterType == DsType)
{
object[] values = { ds };
try
{
oMI.Invoke(oTableAdaptor, values);
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine(oTableAdaptor.GetType().Name + Environment.NewLine + ex.Message);
}
}
}
}
}
}
}
catch (Exception Exp)
{
System.Diagnostics.Debug.WriteLine(Exp.Message);
if (Exp.InnerException != null) System.Diagnostics.Debug.WriteLine(Exp.InnerException.Message);
return false;
}
return true;
これは、別の開発者が別のアプリケーションで使用している別のコードから採用したものです。これまでの主な違いは、データアダプターの配列 (オブジェクト型) を渡しており、(グローバルにインスタンス化された) 3 つの DataSet のそれぞれが foreach (oParamaterInfoArray の ParameterInfo oPI) ブロック内の個別の if ブロックとして設定されていることです (ここで、私の ' NameOfDataSet' はデータセットの 1 つになります)
この機能を完成させる方向で、誰か私を少し押してくれませんか? 私は自分がそこにいることを知っていますが、何かを見過ごしているように感じます. このコードはエラーなしでコンパイルされます。