.NET-Systemtyp zu SqlDbType

8

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?

    
Simone Salvo 02.03.2016, 10:57
quelle

3 Antworten

13

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:

  • Für ein string , wie wählen Sie das richtige zwischen Char , NChar , VarChar , NVarChar , Text oder NText (oder sogar Xml , vielleicht) ?
  • Und für Blobs wie byte[] , sollten Sie Binary , VarBinary oder Image verwenden?
  • Für decimal , float und double , sollten Sie sich für Decimal , Float , Money , SmallMoney oder Real ?
  • entscheiden
  • Für ein DateTime benötigen Sie DateTime2 , DateTimeOffset , DateTime oder SmallDateTime ?
  • Verwenden Sie 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%     
Anders Tornblad 02.03.2016 11:02
quelle
0

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.

    
Mladen Prajdic 02.03.2016 13:04
quelle
0

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%     
mpag 12.12.2017 18:54
quelle

Tags und Links