2010-02-01 12 views
6

Da die System.Data.OracleClient-Bibliothek deprecated ist, migrieren wir gerade unsere Codebasis, um stattdessen Oracle Data Provider for .NET (ODP.NET) zu verwenden. Eines der Probleme, auf die wir gestoßen sind, ist, dass der System.Data.OracleClient die Bindung des Parameternamens anstelle der Bindung nach Position verwendet und der gesamte Code direkt auf System.Data.OracleClient.OracleCommand zugreift, anstatt eine zwischengeschaltete Datenschicht zu verwenden.Gibt es eine Möglichkeit, OracleCommand.BindByName für ODP.NET standardmäßig auf true zu setzen?

Da es ziemlich viel Code gibt, gibt es eine einfache Möglichkeit, ODP.NET OracleCommand.BindByName standardmäßig auf true zu setzen, oder müssen wir den Wert jedes Mal durchlaufen und setzen, wenn er verwendet wird? Ist es nicht möglich, diese Codezeile in Visual Studio 2008 einzufügen?

+2

Es gibt keine Möglichkeit 'OracleCommand.BindByName' auf true zu setzen, indem Standard. –

+0

@Vadim K. - Das ist etwas, vor dem ich Angst hatte, sieht aus, als ob wir einen Weg brauchen, um alle Stellen im Code zu finden, die es dann brauchen. – rjzii

+0

Sind die Befehle gespeicherte Prozeduraufrufe oder nur Textabfragen? Ich frage nur, denn wenn es sich um Stored Procedure Calls handelt, wird BindByName sowieso nicht funktionieren - Sie müssen die korrekte Parameterreihenfolge verwenden. –

Antwort

8

Ich weiß, dass dieser Thread alt ist, aber ich hatte das gleiche Problem heute und dachte, ich würde meine Lösung teilen, falls jemand anderes dieses Problem hatte. Da OracleCommand versiegelt ist (was saugt), habe ich eine neue Klasse erstellt, die OracleCommand kapselt und den BindByName bei der Instantiierung auf true setzt. Hier ist Teil der Umsetzung:

public class DatabaseCommand 
{ 
    private OracleCommand _command = null; 

    public DatabaseCommand(string sql, OracleConnection connection) 
    { 
     _command = new OracleCommand(sql, connection) 
     { 
      BindByName = true 
     }; 
    } 

    public int ExecuteNonQuery() 
    { 
     return _command.ExecuteNonQuery(); 
    } 

    // Rest of impl removed for brevity 
} 

Dann alles, was ich die Befehle zur Reinigung tun musste, war für OracleCommand eine Suche und mit DatabaseCommand und Test ersetzen.

+0

Nicht die Antwort, auf die ich gehofft habe, als ich die Frage geschrieben habe, aber es ist die beste Antwort auf die Frage, außer dass man den Wert jedes Mal selbst setzt, es ist die einzige Option, die man hat. – rjzii

+9

DatabaseCommand sollte IDisposable implementieren, da OracleCommand von DbCommand abgeleitet wird, das dies implementiert. – Sam

+0

Gibt es noch keine bessere Lösung als diese? Jede Oracle-Antwort scheint eine Art Shim zu erstellen, um Oracle-Client-Defizite auszugleichen. – EKW

0

hinzufügen Teilklasse für Ihre Table, und fügen Sie eine Methode oder eine Eigenschaft, wie Sie wollen, mit diesem Code:

 for (int i = 0; (i < this.CommandCollection.Length); i = (i + 1)) 
     { 
      if ((this.CommandCollection[i] != null)) 
      { 
       ((global::Oracle.DataAccess.Client.OracleCommand)(this.CommandCollection[i])).BindByName = value; 
      } 
     } 
12

Ich habe nicht versucht es aber,

ich so etwas gesehen haben

"cmd.GetType().GetProperty("BindByName").SetValue(cmd,true,null);" in PetaPoco.cs-Datei.

Vielleicht kann es helfen.

+0

Es hat sicherlich mein Problem gelöst. –

+1

Dies ermöglicht auch das Arbeiten mit Befehlen, ohne von den Oracle-spezifischen Datenobjekten abhängig zu sein. –

4

hatte ich das gleiche Problem mit SqlDataSource-Update-Befehle nach ASPX Code Oracle.DataAcees.Client Portierung und löste es durch OracleCommand.BindByName Eigenschaft in SqlDataSource OnUpdating Handler wie folgt zu ändern:

protected void SqlDataSource_Updating(object sender, SqlDataSourceCommandEventArgs e) 
{ 
    Oracle.DataAccess.Client.OracleCommand b_OracleCommand = 
        (Oracle.DataAccess.Client.OracleCommand)e.Command; 
    b_OracleCommand.BindByName = true; 
} 
+0

Dies ist der einzige vernünftige Weg, dies zu tun, ohne Code-Code umgestalten und ändern zu müssen. – Gaui

-4

Sie diese verwenden können

using (var connection = new OracleConnection(connectionString)) 
     { 
      connection.Open(); 
      var cmd = connection.CreateCommand(); 
      cmd.CommandText = cmdText; 
      cmd.CommandType = CommandType.StoredProcedure; 
      cmd.BindByName = true; 

      //Do something 

      cmd.ExecuteNonQuery(); 
     } 
+4

-1 Diese Antwort zeigt ein mangelndes Verständnis dafür, was die Frage eigentlich ist. – rjzii

-2

Um # Codezeilen

VB.NET

zu reduzieren
Dim command As OracleCommand = New OracleCommand(query, connection) With {.CommandType = CommandType.StoredProcedure, .BindByName = True} 

C#

OracleCommand command = new OracleCommand(query, connection) { CommandType = CommandType.StoredProcedure, BindByName = true }; 
0

Ich löste dieses Problem die BindByName Eigenschaft in der Prozedur des SqlDataSource Updating-Ereignis Einstellung:

protected void SqlDataSource1_Updating(object sender, SqlDataSourceCommandEventArgs e) 
{ 
    ((Oracle.ManagedDataAccess.Client.OracleCommand)e.Command).BindByName = true; 
    // ... 
} 
Verwandte Themen