Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
SQL-Datentyp <--> .Net-Datentyp
pollito
myCSharp.de - Member

Avatar #avatar-3521.gif


Dabei seit:
Beiträge: 192

Themenstarter:

SQL-Datentyp <--> .Net-Datentyp

beantworten | zitieren | melden

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!

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von pollito am .
René
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 15708
Herkunft: BW

beantworten | zitieren | melden

Warum nimmst Dir nicht 10 Sekunden Zeit und schaust einfach in die Doku?
SQL Server-Datentypzuordnungen - ADO.NET
private Nachricht | Beiträge des Benutzers
pollito
myCSharp.de - Member

Avatar #avatar-3521.gif


Dabei seit:
Beiträge: 192

Themenstarter:

beantworten | zitieren | melden

Zitat von Abt
Warum nimmst Dir nicht 10 Sekunden Zeit und schaust einfach in die Doku?
SQL Server-Datentypzuordnungen - ADO.NET
Danke, aber ich habe bereits mehr als 10 Minuten damit verbracht und die Doku kenne ich. Ich schrieb:
Zitat
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é
private Nachricht | Beiträge des Benutzers
T-Virus
myCSharp.de - Member



Dabei seit:
Beiträge: 1821
Herkunft: Nordhausen, Nörten-Hardenberg

beantworten | zitieren | melden

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
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von T-Virus am .
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.
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 15708
Herkunft: BW

beantworten | zitieren | melden

Zitat
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.
Zitat
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
Zitat
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.

private Nachricht | Beiträge des Benutzers
pollito
myCSharp.de - Member

Avatar #avatar-3521.gif


Dabei seit:
Beiträge: 192

Themenstarter:

beantworten | zitieren | melden

Zitat von T-Virus
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.
Zitat von T-Virus
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.
Zitat von T-Virus
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.
Zitat von T-Virus
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!
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von pollito am .
René
private Nachricht | Beiträge des Benutzers
BerndFfm
myCSharp.de - Team

Avatar #gvp27cjXxMEZQuCpk4WQ.jpg


Dabei seit:
Beiträge: 3737
Herkunft: Frankfurt a.M.

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 15708
Herkunft: BW

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
BerndFfm
myCSharp.de - Team

Avatar #gvp27cjXxMEZQuCpk4WQ.jpg


Dabei seit:
Beiträge: 3737
Herkunft: Frankfurt a.M.

beantworten | zitieren | melden


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
private Nachricht | Beiträge des Benutzers
pollito
myCSharp.de - Member

Avatar #avatar-3521.gif


Dabei seit:
Beiträge: 192

Themenstarter:

[Gelöst] SQL-Datentyp <--> .Net-Datentyp

beantworten | zitieren | melden

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é
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 15708
Herkunft: BW

beantworten | zitieren | melden

Zitat von pollito
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.

private Nachricht | Beiträge des Benutzers
pollito
myCSharp.de - Member

Avatar #avatar-3521.gif


Dabei seit:
Beiträge: 192

Themenstarter:

beantworten | zitieren | melden

Zitat von Abt
Zitat von pollito
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é
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 15708
Herkunft: BW

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
pollito
myCSharp.de - Member

Avatar #avatar-3521.gif


Dabei seit:
Beiträge: 192

Themenstarter:

beantworten | zitieren | melden

Können wir das Thema als beendet erachten? Ich habe bereits dargelegt, dass ich die Infos aus dem Schema ermittle wie z. B. hier:
Zitat
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.
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é
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 15708
Herkunft: BW

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
pollito
myCSharp.de - Member

Avatar #avatar-3521.gif


Dabei seit:
Beiträge: 192

Themenstarter:

beantworten | zitieren | melden

Zitat von Abt
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é
private Nachricht | Beiträge des Benutzers