verwendetes Datenbanksystem: <IBM DB2>
Hallo zusammen,
ich habe mal ein paar Fragen zu den verschiedenen Datenbank-Zugriffsmethoden, bzw. möchte ich mir Klarheit verschaffen, weil ich das Gefühl habe immer etwas falsch zu machen.
Ich hole meine Daten immer, wie im folgenden Code aus der jeweiligen Datenquelle und speichere sie zur Weiterverarbeitung in einer DataTable (hier speziell das Beispiel IBM AS/400):
using IBM.Data.DB2.iSeries;
public static DataTable GetSQLData(string qry)
{
// MessageBox.Show(conStr, "ConnectionString:");
try
{
DataTable dt = new DataTable();
using (iDB2Connection conn = new iDB2Connection(conStr))
{
conn.Open();
iDB2Command cmd = new iDB2Command(qry, conn);
iDB2DataReader reader;
reader = cmd.ExecuteReader();
dt.Load(reader);
conn.Close();
return dt;
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "AS/400: Fehler bei SELECT");
return null;
}
}
Dieses DataTable kann ich mir dann über ein DataGridView anzeigen lassen oder die einzelnen DataRows auswerten.
Bisher konnte/kann ich damit gut arbeiten.
Schreibzugriffe auf die DB gingen auf ähnliche Weise bisher problemlos:
public static bool UpdateSQLData(string qry)
{
try
{
using (iDB2Connection conn = new iDB2Connection(conStr))
{
conn.Open();
iDB2Command cmd = new iDB2Command(qry, conn);
cmd.ExecuteNonQuery();
cmd.Dispose();
return true;
}
}
catch (Exception exp)
{
MessageBox.Show(exp.Message, "AS/400: Fehler bei UPDATE");
return false;
}
}
Im EntityFramework als Gegensatz wird ja die ORM-Technik verwendet, wo die entsprechenden DB-Tabellenstrukturen in eigenen Model-Klassen abgebildet (gemappt) werden.
Jeder Datensatz ist ja dann ein Objekt dieser Klasse. Ein sogenannter Kontext für die Model-Klasse liefert mir dann eine Collection (List, Dictionary...) aus den Objekten.
Mit diesem Dictionary wird dann per LINQ weitergearbeitet.
Für MS-Sql und MySql gibt es da ja freie Zugriffsmöglichkeiten aber für IBM AS/400 finde ich keinen freien AS400 .NET data provider und wir haben auch keinen lizenziert.
Ich bin also gezwungen über ODBC zu gehen. Dafür gibt es aber keine Unterstützung für das EntityFramework, wo es mir die Model-Klassen aus der DB erstellt.
Jetzt könnte ich mir die Model-Klassen ja per Hand tippen und die Kontexte dafür erstellen, was aber sehr aufwendig ist. Die Tabellen auf der AS/400 haben meist mehr als 50 Spalten.
Jetzt meine Fragen:
Gruß, NEUMee
Unabhängig von Deinen Punkten:
Soweit ich weiß gibt es für IBM AS einen ADO.NET Provider.
Da Entity Framework auf ADO.NET aufbaut, sollte das auch klappen.
Persönlich rate ich aber von Entity Framework ab und empfehle stets die Kombination von Dapper, Dapper.FastCrud und FluentMigrator.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Das Entity Framework für AS400 ist teuer : https://stackoverflow.com/questions/4546120/is-it-possible-to-use-entity-framework-with-a-db2-iseries-as-400
Hier ist die IBM Lizenz mit 12.000 Dollar angegeben.
Abhilfe : Einen Datenbank Provider für das Entity Framework selber schreiben !
ADO.NET wird natürlich heute noch genutzt, aber der untypisierte Umgang mit DataTable und Rows ist umständlich und fehlerbehaftet.
Ein Micro ORM wie Dapper kann ich auch empfehlen.
ODBC ist die langsamste und umständlichste Methode um auf eine Datenbank zuzugreifen. '
Grüße Bernd
Workshop : Datenbanken mit ADO.NET
Xamarin Mobile App : Finderwille Einsatz App
Unternehmenssoftware : Quasar-3
@Abt
und 2. mache ich, habe nur noch Probleme, dies zu implementieren. Das ist doch der Weg über ORM?
OK, using macht try/catch/con.Close() überflüssig - werde ich.
Ich gebe doch auch den Wortlaut der Exception zurück, wenn auch per Direktzugriff auf das UI.
Wie händle ich aber die Exception, wenn ich try/catch (siehe Punkt 3) weglasse?
@BerndFfm
OK, ich schaue mir Dapper mal an.
Danke euch!
- und 2. mache ich, habe nur noch Probleme, dies zu implementieren.
Naja dem Code zufolge machst Du es nicht.
- Ich gebe doch auch den Wortlaut der Exception zurück, wenn auch per Direktzugriff auf das UI.
Das ist in keinster Weise ein gutes Exception Handling.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Hallo NEUMee,
kannst du in Zukunft bitte darauf achten immer nur eine Frage in einem Thread zu stellen? Der Thread wird für uns unmoderierbar, weil solche Antworten:
und 2. ...
...
...
einfach nicht übersichtlich und nicht nachzuvollziehen sind. Weiter kann dem Thread kein eindeutiger Titel zugesprochen werden, dein Problem wird einfach nicht klar, wenn man den Thread nicht komplett durchliest. Bitte denk ein wenig daran.
Steht auch in [Hinweis] Wie poste ich richtig?
Gruss
Coffeebean
Microsoft MVP // Me // Blog // GitHub // @Egghead // All my talks // Speakerdeck