Ich habe nach einer intelligenten Konvertierung zwischen .Net System.Type und SqlDbType gesucht. Was ich fand, war folgende Idee:
%Vor%Der Code oben ist nicht wirklich nett und ist ein Code-Geruch, weshalb ich die folgende, naive, nicht intelligente, aber nützliche Funktion schrieb, basierend auf Ссылка :
%Vor%Hat jemand eine Vorstellung davon, wie man das gleiche Ergebnis auf eine sauberere, bessere und schönere Weise erzielt?
Ihr Ansatz ist ein guter Anfang, aber das Wörterbuch sollte nur einmal ausgefüllt werden, wie Ian in einem Kommentar sagt.
Es gibt hier einen GIST, der auf der gleichen Idee basiert, obwohl er nicht zwischen den gleichen Arten von Typen konvertiert: Ссылка
Vorbehalt
Ich habe ein funktionierendes Beispiel unten, aber Sie müssen sich bewusst sein, dass dieser Ansatz eine hat wenige Probleme. Zum Beispiel:
string
, wie wählen Sie das richtige zwischen Char
, NChar
, VarChar
, NVarChar
, Text
oder NText
(oder sogar Xml
, vielleicht) ? byte[]
, sollten Sie Binary
, VarBinary
oder Image
verwenden? decimal
, float
und double
, sollten Sie sich für Decimal
, Float
, Money
, SmallMoney
oder Real
? DateTime
benötigen Sie DateTime2
, DateTimeOffset
, DateTime
oder SmallDateTime
? Nullable
-Typen, wie int?
? Diese sollten höchstwahrscheinlich die gleiche SqlDbType
wie der zugrunde liegende Typ geben. Auch wenn Sie nur Type
angeben, werden Sie von anderen Einschränkungen, wie Feldgröße und Genauigkeit, nichts wissen. Bei der richtigen Entscheidung geht es auch darum, wie die Daten in Ihrer Anwendung verwendet werden und wie sie in der Datenbank gespeichert werden.
Am besten ist es, wenn Sie ORM dies für Sie erledigen lassen.
Code
%Vor%Und so würdest du es benutzen:
%Vor%Bearbeiten: Ich habe darüber nachgedacht und dies funktioniert für System.Data.SqlTypes-Typen. Ich werde es hier lassen, für den Fall, dass es jemandem in der Zukunft hilft.
Ich mache so etwas:
%Vor% Da jeder SqlDbType eine .Value -Eigenschaft hat, die der eigentliche CLR-Typ ist, verwende ich Reflection, um ihn zu bekommen. Es ist schade, dass SqlDbType nicht über eine Schnittstelle verfügt, die diese Eigenschaft enthält. Die Eigenschaft und Reflektion von "Value" wird nicht benötigt.
Es ist nicht perfekt, aber Sie müssen ein Wörterbuch nicht manuell anlegen, pflegen oder auffüllen. Sie können einfach einen Typ in einem vorhandenen dict nachschlagen, und wenn es nicht existiert, verwenden Sie die obere Methode, um das Mapping automatisch hinzuzufügen.
Ziemlich viel automatisch generiert.
Kümmert sich auch um neue Typen, die SQL Server in Zukunft möglicherweise erhält.
Es scheint, dass diese Art von Nachschlagetabelle bereits verfügbar ist, allerdings nicht in System.Data
(oder .Object
oder .Type
), sondern in System.Web.
Projekt - & gt; Referenz hinzufügen - & gt; System.Web - & gt; OK
Dann Ссылка sagt auch,
Beim Festlegen von Befehlsparametern werden SqlDbType und DbType verknüpft. Wenn Sie den DbType-Wert festlegen, ändert sich der SqlDbType daher in eine Unterstützung SqlDbType.
Also, das sollte theoretisch funktionieren;)
%Vor%Tags und Links c# ado.net system.data