2013-11-21 5 views
7

Laut der Microsoft-Dokumentation zu Configuring Parameters "behandeln die .NET Framework-Datenanbieter die Benennung und geben Parameter und Parameterplatzhalter anders an".Wie erstelle ich generische SQL-Parameter in .NET?

  • System.Data.SqlClient verwendet benannte Parameter im Format @parametername
  • System.Data.OleDb und System.Data.Odbc Verwendung Positions durch ein Fragezeichen angezeigt Parametermarken (?)
  • System.Data.OracleClient verwendet benannte Parameter im Format :parmname (oder parmname)

Ich schreibe Methoden, um SQL zurückzugeben, die für parametrisierte Anweisungen verwendet werden. Wenn ich Standard-SQL verwende, sollten diese Anweisungen für eine Vielzahl von Datenbanken übertragbar sein. Wie kann ich allgemeingültige Parameter erstellen, ohne dass die Bedenken des Datenanbieters gegenüber den SQL-Komponenten bestehen?

+0

Ich denke nicht, sie sind sehr unterschiedlich. OleDb kann '@ field' identifizieren. Seine Art von universell. Oracle sollte damit auch klar kommen. Wenn Sie nun den Parameter zum Befehlsobjekt hinzufügen, können Sie das Präfix "@ field" vollständig vermeiden und einfach "field" hinzufügen. – nawfal

+0

PostGre ist auch mit @field in Ordnung. –

Antwort

1

einfach die @ vermeiden und System.Data.SqlClient /System.Data.OracleClient

Btw verwenden, wenn Sie es tragbar möchten, verwenden Sie entweder System.Data.IDbCommand oder System.Data.Common.DbCommand

Ob Sie die Schnittstelle oder die abstrakte Klasse verwenden, ist Geschmackssache.
Die Schnittstelle ist richtiger, die abstrakte Klasse hat jedoch ein paar zusätzliche Methoden, die nicht in der Schnittstelle verfügbar sind (z. B. DataReader.HasRows). Ich habe die Schnittstelle benutzt, aber nachträglich, das war ein Fehler. Ich hätte stattdessen die abstrakte Klasse (System.Data.Common.DbAnything anstelle von System.Data.IAnything) verwenden sollen.

Sie können diesen entweder eine Erweiterungsmethode "AddParameter" hinzufügen, oder Sie können Ihre DAL in eine abstrakte Klasse umwandeln und eine Methode AddParameter hinzufügen, mit der Sie den Variablennamen für die jeweilige Instanz überschreiben können.

public abstract class cDAL 
{ 


    // From Type to DBType 
    protected virtual System.Data.DbType GetDbType(Type type) 
    { 
     // http://social.msdn.microsoft.com/Forums/en/winforms/thread/c6f3ab91-2198-402a-9a18-66ce442333a6 
     string strTypeName = type.Name; 
     System.Data.DbType DBtype = System.Data.DbType.String; // default value 

     try 
     { 
      if (object.ReferenceEquals(type, typeof(System.DBNull))) 
      { 
       return DBtype; 
      } 

      if (object.ReferenceEquals(type, typeof(System.Byte[]))) 
      { 
       return System.Data.DbType.Binary; 
      } 

      DBtype = (System.Data.DbType)Enum.Parse(typeof(System.Data.DbType), strTypeName, true); 

      // Es ist keine Zuordnung von DbType UInt64 zu einem bekannten SqlDbType vorhanden. 
      // http://msdn.microsoft.com/en-us/library/bbw6zyha(v=vs.71).aspx 
      if (DBtype == System.Data.DbType.UInt64) 
       DBtype = System.Data.DbType.Int64; 
     } 
     catch (Exception) 
     { 
      // add error handling to suit your taste 
     } 

     return DBtype; 
    } // End Function GetDbType 


    public virtual System.Data.IDbDataParameter AddParameter(System.Data.IDbCommand command, string strParameterName, object objValue) 
    { 
     return AddParameter(command, strParameterName, objValue, System.Data.ParameterDirection.Input); 
    } // End Function AddParameter 


    public virtual System.Data.IDbDataParameter AddParameter(System.Data.IDbCommand command, string strParameterName, object objValue, System.Data.ParameterDirection pad) 
    { 
     if (objValue == null) 
     { 
      //throw new ArgumentNullException("objValue"); 
      objValue = System.DBNull.Value; 
     } // End if (objValue == null) 

     System.Type tDataType = objValue.GetType(); 
     System.Data.DbType dbType = GetDbType(tDataType); 

     return AddParameter(command, strParameterName, objValue, pad, dbType); 
    } // End Function AddParameter 


    public virtual System.Data.IDbDataParameter AddParameter(System.Data.IDbCommand command, string strParameterName, object objValue, System.Data.ParameterDirection pad, System.Data.DbType dbType) 
    { 
     System.Data.IDbDataParameter parameter = command.CreateParameter(); 

     if (!strParameterName.StartsWith("@")) 
     { 
      strParameterName = "@" + strParameterName; 
     } // End if (!strParameterName.StartsWith("@")) 

     parameter.ParameterName = strParameterName; 
     parameter.DbType = dbType; 
     parameter.Direction = pad; 

     // Es ist keine Zuordnung von DbType UInt64 zu einem bekannten SqlDbType vorhanden. 
     // No association DbType UInt64 to a known SqlDbType 

     if (objValue == null) 
      parameter.Value = System.DBNull.Value; 
     else 
      parameter.Value = objValue; 

     command.Parameters.Add(parameter); 
     return parameter; 
    } // End Function AddParameter 


    public virtual T GetParameterValue<T>(System.Data.IDbCommand idbc, string strParameterName) 
    { 
     if (!strParameterName.StartsWith("@")) 
     { 
      strParameterName = "@" + strParameterName; 
     } 

     return InlineTypeAssignHelper<T>(((System.Data.IDbDataParameter)idbc.Parameters[strParameterName]).Value); 
    } // End Function GetParameterValue<T> 


} 

und dann in dem jeweiligen Anbieter überschreiben:

public class cOleDb : cDAL 
{ 




    public overrideSystem.Data.IDbDataParameter AddParameter(System.Data.IDbCommand command, string strParameterName, object objValue) 
    { 
     strParameterName = "?"; 
     return AddParameter(command, strParameterName, objValue, System.Data.ParameterDirection.Input); 
    } // End Function AddParameter 


    // Etc. 

} 

Und Sie können durch das Lese provider in der Verbindungszeichenfolge web.config Eintrag eine entsprechende Klasseninstanz erstellen.

PS: System.Data.OracleClient ist veraltet, verwenden ODP.NET (Sie müssen noch die einheimischen OracleClient DLL von Oracle [kostenloser Download] installiert ist)