Laden...

SQL-Datentyp <--> .Net-Datentyp

Erstellt von pollito vor 2 Jahren Letzter Beitrag vor 2 Jahren 419 Views
pollito Themenstarter:in
314 Beiträge seit 2010
vor 2 Jahren
SQL-Datentyp <--> .Net-Datentyp

Verwendetes Datenbanksystem: <MySQL, SQLBase>

Hallo!

Ich war lange nicht mehr hier. Die neue Forensoftware sieht hübsch aus. Respekt! Aber nun zu meiner Frage:

Welche sind die empfohlenen Vorgehensweisen, um ein Mapping zwichen SQL- und .Net-Datentypen zu bewerkstelligen? Der Zugriff auf die Datenbanken soll mit dem .Net-Dataprovider erfolgen.

Danke und gesunde Grüße!

René

16.806 Beiträge seit 2008
vor 2 Jahren

Warum nimmst Dir nicht 10 Sekunden Zeit und schaust einfach in die Doku?
SQL Server-Datentypzuordnungen - ADO.NET

pollito Themenstarter:in
314 Beiträge seit 2010
vor 2 Jahren

Warum nimmst Dir nicht 10 Sekunden Zeit und schaust einfach in die Doku?

>

Danke, aber ich habe bereits mehr als 10 Minuten damit verbracht und die Doku kenne ich. Ich schrieb:

Welche sind die empfohlenen Vorgehensweisen (...)

In erster Linie möchte ich wissen, ob es standarizierte Methoden gibt, die ich dafür verwenden kann, den CLR-Datentyp abzufragen.

Sicher, ich kann das Schema ermitteln und die Datenbank-Datentypen der Felder abfragen, um anhand von Tabellen (z. B. die von dier verlinkte Seite) selbst ein Mapping zu machen. Vielleicht geht es aber einfacher – darauf zielt meine Frage ab.

Im Übrigen, ich verwende den SQL-Server nicht, sondern SQLBase und MySQL.

Nochmals Danke!

René

T
2.219 Beiträge seit 2008
vor 2 Jahren

Wenn ich dich richtig verstehe, willst du wissen welchen .NET Datentyp du für den jeweiligen Datenbank Spaltentypen nehmen musst.
Dazu musst du schauen, wie der jeweilige ADO .NET Provider die Datentypen mappt.
Einen allgemeinen Ansatz kann man hier nur schwer umsetzen, wenn es über grundlegende Datentypen hinaus geht.

Nachtrag:
Das Mapping musst du so oder so über das Tabellen Schema machen.
Wenn du dies aber kennst, dann kannst du dies auch ohne Schema Abfrage machen.
Was genau ist den dein Ziel?
Wenn du Daten auslesen musst, kannst du dies auch über einen OR Mapper machen.
Der kennt dann seine Datentypen, dann musst du es nicht selbst mappen.

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

16.806 Beiträge seit 2008
vor 2 Jahren

In erster Linie möchte ich wissen, ob es standarizierte Methoden gibt, die ich dafür verwenden kann, den CLR-Datentyp abzufragen.

Dann wäre das schön gewesen, wenn Du das im Startbeitrag erwähnt hättest.

Im Übrigen, ich verwende den SQL-Server nicht, sondern SQLBase und MySQL.

Ich habe gesehen, dass Du "<MySQL, SQLBase>" geschrieben hast; aber Deine Frage war "Mapping zwichen SQL- und .Net-Datentypen" - und "SQL Typen" suggeriert aufgrund des Plain-Names "SQL" eben den MSSQL, weil common naming.
"Die einen" SQL Types gibt es nicht.

Im Eingangspost hast Du auch null erwähnt, was Du eigentlich tun willst.
Mit dem Satz

Sicher, ich kann das Schema ermitteln und die Datenbank-Datentypen der Felder abfragen, um anhand von Tabellen (z. B. die von dier verlinkte Seite) selbst ein Mapping zu machen. Vielleicht geht es aber einfacher – darauf zielt meine Frage ab.

kann ich mir nun aus den Finger ziehen, dass Du irgendein Schema hast und Du anhand von Column Types auf .NET Types schießen willst, oder was ist denn der Use Case?

Beschreib doch einfach mal, was Dein konkretes Ziel ist.

pollito Themenstarter:in
314 Beiträge seit 2010
vor 2 Jahren

Wenn ich dich richtig verstehe, willst du wissen welchen .NET Datentyp du für den jeweiligen Datenbank Spaltentypen nehmen musst.

Ja, genau so ist es.

Dazu musst du schauen, wie der jeweilige ADO .NET Provider die Datentypen mappt.
Einen allgemeinen Ansatz kann man hier nur schwer umsetzen, wenn es über grundlegende Datentypen hinaus geht.

Das dachte ich mir. Aber bevor ich es selbst mache, wollte ich erst die Experten fragen.

Nachtrag:
Das Mapping musst du so oder so über das Tabellen Schema machen.
Wenn du dies aber kennst, dann kannst du dies auch ohne Schema Abfrage machen.
Was genau ist den dein Ziel?

Die Datentypen der Datenbankspalten erfahre ich über das Tabellenschema. An dieser Stelle wollte ich ansetzen. Wie aber beschrieben: Ich wollte mich vergewissern, dass es doch nicht anders (einfacher bzw. einheitlicher) geht.

Wenn du Daten auslesen musst, kannst du dies auch über einen OR Mapper machen.
Der kennt dann seine Datentypen, dann musst du es nicht selbst mappen.

T-Virus

Mein Ziel ist, C#-Zugriffsklassen aus den Datenbankstrukturen automatisch zu machen. Diese sollen für eine spezielle Anwendung erstellt werden. EF o. ä. ist in diesem Fall nicht erwünscht bzw. mit älteren Versionen von SQLBase erst gar nicht möglich.

Danke und lG!

René

3.825 Beiträge seit 2006
vor 2 Jahren

Ich erzeuge meine C# Zugriffsklassen automatisch aus der Datenbank.

Das Mapping ist fest hinterlegt, sind ja nur wenige Datentypen die es gibt.


public int    nr { get { return ad_nr; } set { ad_nr = value; } }
public string    match { get { return ad_match; } set { ad_match = value; } }
public string    anrede { get { return ad_anrede; } set { ad_anrede = value; } }
public string    name1 { get { return ad_name1; } set { ad_name1 = value; } }
public string    name2 { get { return ad_name2; } set { ad_name2 = value; } }
public string    strasse { get { return ad_strasse; } set { ad_strasse = value; } }
public string    hausnr { get { return ad_hausnr; } set { ad_hausnr = value; } }
public bool      kunde { get { return ad_kunde; } set { ad_kunde = value; } }

Das logische Feld ad_kunde ist je nach Datenbanksystem entweder boolean oder sbyte (MySQL) oder decimal (Oracle) :


if (rw["ad_kunde"] is Boolean) kunde = (bool)rw["ad_kunde"]; else if (rw["ad_kunde"] is sbyte) kunde = ((sbyte)rw["ad_kunde"] == 1); else kunde = ((decimal)rw["ad_kunde"] == 1);

Grüße Bernd

Workshop : Datenbanken mit ADO.NET
Xamarin Mobile App : Finderwille Einsatz App
Unternehmenssoftware : Quasar-3

16.806 Beiträge seit 2008
vor 2 Jahren

Die Art und Weise ist halt vergleichsweise unperformant - und unstandardisiert.
In Oracle speichert man boolsche Werte eher als Number(1,0) nicht als decimal.
Is also ne spezifische Typ-Implementierung bei euch.

Hab auch schon char(1) gesehen mit nem Check Constraint auf 1/0 - aber decimal is ja sehr teuer für nen bool auf Oracle 🙂

Fazit: "einfach so" nen generischen Provider selbst bauen, is nich.

3.825 Beiträge seit 2006
vor 2 Jahren

Ist schon lange her dass ich das Oracle Typ Mapping gemacht habe, auf jeden Fall mehr als 12 Jahre.

Damals wurde mir von den Experten das "decimal" als Datentyp für ein logisches Feld genannt.

Der Vorteil des Mappings : Man kann den Typ ganz einfach ändern im Source und sofort auf die neuen Datentypen zugreifen.

Das kommt auch dann vor wenn ein Datenbank Update neue Datenbanktypen bringt die geeigneter sind (MS SQL Datumstyp Date oder Datetime2).

Performance ? Das Mapping oben war ca. 5% langsamer als typisierte DataSets. Ca. 10 Mal schneller als ein damaliges ORM.

Grüße Bernd

Workshop : Datenbanken mit ADO.NET
Xamarin Mobile App : Finderwille Einsatz App
Unternehmenssoftware : Quasar-3

pollito Themenstarter:in
314 Beiträge seit 2010
vor 2 Jahren
[Gelöst] SQL-Datentyp <--> .Net-Datentyp

Nochmals vielen Dank an alle! Ich hatte gehofft, dass der Hersteller des jeweiligen Dataproviders diese Infos irgendwo liefert, um keinen Mapper selbst machen zu müssen. Eigentlich wäre das nicht so schwer, denn der Hersteller beschreibt, wie die Daten zu interpretieren sind. Diese Info hätte man auch in den Dataprovider packen können.

Ich mappe dann selbst und erachte das Thema als beantwortet bzw. gelöst.

Lieben Dank und gesunde Grüße an alle!

René

16.806 Beiträge seit 2008
vor 2 Jahren

Diese Info hätte man auch in den Dataprovider packen können.

Dann schau Dir mal an, wie ADO.NET funktioniert und wie Kommunikationen mit Datenbankschnittstellen erfolgen, dann wirst Du sehen, dass sowas nicht möglich ist - by design.
TLDR: dafür gibt es Schemen, dass solche Informationen nicht zur Laufzeit übertragen werden müssen und damit einen sehr großen Overhead darstellen.

pollito Themenstarter:in
314 Beiträge seit 2010
vor 2 Jahren

Diese Info hätte man auch in den Dataprovider packen können.
(...) dafür gibt es Schemen, dass solche Informationen nicht zur Laufzeit übertragen werden müssen und damit einen sehr großen Overhead darstellen.

Genau da hatte ich diese Infos erwartet...

René

16.806 Beiträge seit 2008
vor 2 Jahren

Und wo ist dann das Problem?

Google Suche nach "ado.net read table schema"

Abrufen von Datenbankschemainformationen - ADO.NET, der übrigens auch schon im Link meines ersten Beitrags hier zu finden ist....wobei Du meintest, dass Du diese Doku bereits kennst.
Wenn Du wirklich erwartet hast, dass die DB solche Infos zur Laufzeit bei einem Query mitliefert; dann musst Du Dir wirklich anschauen, wie eine Datenbankkommunikation funktioniert.
Dann fehlen da sehr viele Basics 🙂 Haste das ein mal verstanden, dann hilft das sehr beim Umgang mit Datenbank-Kommunikationen aller Art - und Du merkst auch, dass das eine ganz ganz arg schlechte Idee wäre.

pollito Themenstarter:in
314 Beiträge seit 2010
vor 2 Jahren

Können wir das Thema als beendet erachten? Ich habe bereits dargelegt, dass ich die Infos aus dem Schema ermittle wie z. B. hier:

Die Datentypen der Datenbankspalten erfahre ich über das **++:::

Ich habe das hervorgehoben, damit das nicht nocheinmal untergeht.

Daraus fehlende Basics und sonstiges abzuleiten ist schon ein bisschen gewagt, insbesondere wenn gerade das vorgeworfen wird, was bereits erwähnt wurde und genutzt wird.

René

16.806 Beiträge seit 2008
vor 2 Jahren

Naja, offenbar hast Du halt ein paar Basic-Missverständnisse, wenn Du erwartest, dass sowas zur Laufzeit kommt oder kommen könnte.
Daher hättest Du das einfach als entsprechenden Hinweis nehmen können, da vielleicht 10 Minuten zu investieren, weil es das Verständnis für die Zukunft erleichtert. Schade.

pollito Themenstarter:in
314 Beiträge seit 2010
vor 2 Jahren

Naja, offenbar hast Du halt ein paar Basic-Missverständnisse, wenn Du erwartest, dass sowas zur Laufzeit kommt oder kommen könnte.

Sorry, aber wer redet von Laufzeit? Hier liegt deinerseits ein Missverständnis vor. Ich erstelle Zugriffsklassen... Aber das steht weiter oben.

René