リフレクションを使用して、いくつかの厳密に型指定されたデータテーブルを .NET アプリケーションにロードする方法を以下に記述しました。以下のように実行すると、スローされた例外を含め、すべてが機能します。しかし、代わりにコメント部分を使用すると (他のすべてを同じに保持)、Failed to enable Constraintsエラーが表示されます here: enter link description here。
エラー配列の内容を見ると、常に次のようになります。
"Column 'AEDelegateName' does not allow DBNull.Value."
エラーの ItemArray は次のようになります。
[0] = {}
[1] = "Some Value"
上記のように 2 列ではなく、1 列を選択するスクリプトでは 1 列しか期待できないので、これには驚かされます。また、そのうちの1つがnullのように見えるため、これは問題に近いと思います。
私のスクリプトは null を返さず、使用するクエリでNOT NULLのようなことを言うだけでなく、すばやく視覚的に確認することもできます。
private void GetData(string query, Component tableAdapter)
{
OracleCommand command = new OracleCommand();
command.Connection = conn;
command.CommandText = query;
command.CommandType = CommandType.Text;
command.CommandTimeout = 3000;
OracleDataReader reader = command.ExecuteReader(CommandBehavior.SingleResult);
MethodInfo[] methods = tableAdapter.GetType().GetMethods();
MethodInfo getDataMethod = tableAdapter.GetType().GetMethod("GetData");
DataTable table = (DataTable)getDataMethod.Invoke(tableAdapter, null);
Type[] paramTypes = new Type[] { table.GetType() };
MethodInfo updateMethod = tableAdapter.GetType().GetMethod("Update", paramTypes);
foreach (DataRow row in table.Rows)
{
row.Delete();
}
//try
//{
// if (reader.HasRows)
// {
// table.Load(reader, LoadOption.OverwriteChanges, FillErrorHandler);
// }
//}
//catch (Exception e)
//{
// DataRow[] errors = table.GetErrors();
//}
while (reader.Read())
{
try
{
List<object> newRow = new List<object>();
for (int i = 0; i < reader.FieldCount; ++i)
{
object currentValue = reader.GetValue(i);
Debug.WriteLine("Value: "+currentValue);
newRow.Add(currentValue);
}
table.Rows.Add(newRow.ToArray());
}
catch (ConstraintException e)
{
DataRow[] errors = table.GetErrors();
}
}
updateMethod.Invoke(tableAdapter, new object[]{table});
reader.Close();
}