Ich habe eine Methode geschrieben, die Reflektion verwendet, um mehrere stark typisierte Datatables in einer .NET-Anwendung zu laden. Wenn ich wie unten laufen würde, funktioniert alles - auch keine geworfenen Ausnahmen. Aber wenn ich den kommentierten Teil stattdessen verwende (alles andere gleich haltend), dann bekomme ich Fehler beim Aktivieren der Einschränkungen Fehler hier beschrieben: enter link description here.DataTable load() Constraint-Fehler
Wenn ich mir anschaue, was in der Fehler-Array ist, ist es immer folgendes:
"Column 'AEDelegateName' does not allow DBNull.Value."
und die ItemArray für einen Fehler wird in etwa so aussehen:
[0] = {}
[1] = "Some Value"
Das hat mich überrascht, da Ich würde nur 1 Spalte in einem Skript erwarten, das 1 Spalte und nicht 2 wie oben angegeben auswählt. Ich stelle mir auch vor, dass dies dem Problem nahekommt, da einer von ihnen scheinbar null ist.
Mein Skript gibt nicht null zurück, und ich kann es schnell und visuell bestätigen, sowie sagen Dinge wie NOT NULL in der Abfrage, die ich verwende.
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();
}
Könnten Sie die Beziehung zwischen der 'DataTable-Tabelle' und der Abfrage, die OracleDataReader ausführt, beschreiben? Ich habe das Gefühl, dass das Schema für beide unterschiedlich ist und dass 'DataTable.Load()' die Definition überschreibt und somit die Beschränkung auslöst. – Caramiriel
welcher 'catch' Block macht den Fang? – radarbob
.... @Caramiriel könnte auf dem richtigen Weg sein, aber ich werde eine gebildete WAG nehmen und vorschlagen, 'AcceptChanges()' nach der Zeile zu löschen Schleife. – radarbob