0

Ich weiß, dass eine sehr ähnliche Frage wurde here gestellt, aber die Antwort hat mir nicht geholfen.Die Länge des Werts für den Schlüssel 'Datenquelle' überschreitet seine Grenze von '128'

Ich verwende Entity Framework 6 mit dem Oracle.ManagerDataAccess.Client.

Wenn ich die Verbindungszeichenfolge in app.config definieren, funktioniert die Verbindung. Wenn ich die gleiche Verbindungszeichenfolge im Code angeben, dann erhalte ich die Fehler

The value's length for key 'data source' exceeds it's limit of '128'. 

was richtig ist.

Dies ist meine Verbindungszeichenfolge (mit einigen entfernt Namen):

"User Id=xxxxxxxxxxx;Password=xxxx;Data Source=(DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = VS-ORACLE.xxxxxxx.de)(PORT = 1521))) (CONNECT_DATA = (SERVER = DEDICATED)(SERVICE_NAME = orcl.xxxxxxxx.de)))" 

Ich weiß, dass es eine Reihe von Räumen ist, die entfernt werden können, aber ich werde immer noch nicht die Zeichenfolge unten 128 erhalten Figuren.

Wie funktioniert es, wenn die Verbindungszeichenfolge in app.config ist, aber nicht, wenn es in Code ist?

Gibt es einen Trick, den ich verwenden kann, indem ich einige der Parameter auf einen anderen String verlagern?

Ich verwende bereits ein DBConfiguration-Objekt. Gibt es eine Möglichkeit, einige der Parameter in diesem Objekt zu setzen?

Wenn ich den vollständigen Oracle-Client verwende, denke ich, dass ich eine Konfiguration in der Datei tnsnames.ora referenzieren könnte, aber es wäre ein großer Bonus, wenn wir mit einer Oracle-Datenbank ohne den vollständigen Client sprechen könnten.

aktualisieren

Dies ist, was die Verbindungszeichenfolge wie app.config in aussieht

<connectionStrings> 
    <add name="OracleDbContext" providerName="Oracle.ManagedDataAccess.Client" connectionString="User Id=xxxxxxxxxxx;Password=xxxx;Data Source=(DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = VS-ORACLE.xxxxxxxx.de)(PORT = 1521))) (CONNECT_DATA = (SERVER = DEDICATED)(SERVICE_NAME = orcl.xxxxxxxx.de)))" /> 
</connectionStrings> 

In Code, den ich die Kontextklasse definiert sich wie folgt:

[DbConfigurationType(typeof(OracleDBConfiguration))] 
public class GlobalAttributeContext : DbContext 
{ 
    public DbSet<GlobalAttribute> GlobalAttributes { get; set; } 

    static GlobalAttributeContext() 
    { 
    Database.SetInitializer<GlobalAttributeContext>(null); 
    } 

    public GlobalAttributeContext(string nameOrConnectionString) : base(nameOrConnectionString) 
    { 
    } 

    public GlobalAttributeContext() : this ("Name=OracleDbContext") 
    { 
    } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
    // We have to pass the schema name into the configuration. (Is there a better way?) 
    modelBuilder.Configurations.Add(new GlobalAttribute_Config_Oracle("SchemaName")) ; 
    } 
} 

Ich habe definiert eine DbConfiguration-Klasse wie folgt:

class OracleDBConfiguration : DbConfiguration 
{ 
    public OracleDBConfiguration() 
    { 
    this.SetDefaultConnectionFactory (new System.Data.Entity.Infrastructure.LocalDbConnectionFactory("v12.0")) ; 
    this.SetProviderServices ("Oracle.ManagedDataAccess.Client", Oracle.ManagedDataAccess.EntityFramework.EFOracleProviderServices.Instance) ; 
    this.SetProviderFactory ("Oracle.ManagedDataAccess.Client", Oracle.ManagedDataAccess.Client.OracleClientFactory.Instance) ; 
    } 
} 

Schließlich schaffe ich den Kontext ähnliche

string ConnectionString = "User Id=xxxxxxxxxxx;Password=xxxx;Data Source=(DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = VS-ORACLE.xxxxxxxx.de)(PORT = 1521))) (CONNECT_DATA = (SERVER = DEDICATED)(SERVICE_NAME = orcl.xxxxxxx.de)))" ; 

using (var ctx = new GlobalAttributeContext(ConnectionString)) 
{ 
    var globalAttributes = ctx.GlobalAttributes.ToList() ; 
    foreach (GlobalAttribute ga in globalAttributes) 
    { 
    Console.WriteLine ("Name: {0}, Value: {1}", ga.Attribute, ga.Value) ; 
    } 
} 

die Verbindungszeichenfolgen in den beiden Verfahren verwendet werden, sind identisch.

+0

Wie stellen Sie die Verbindungszeichenfolge im Code ein? Ich habe diesen Fehler nie zuvor bei Verbindungszeichenfolgen gesehen. – bhmahler

+0

Ich habe weitere Informationen hinzugefügt. –

Antwort

1

Mein Kollege sehen ist, eine Antwort auf dieses Problem gefunden, wie folgt:

In anderer Konstruktor der Klasse Kontext eine bestehende Sammlung zu verwenden.

public GlobalAttributeContext(DbConnection existingConnection, bool contextOwnsConnection) 
     : base(existingConnection, true) 
{ 
} 

Dies ist die komplette Kontextklasse

namespace OracleTestExeConfigAndConnStr 
{ 
    [DbConfigurationType(typeof(OracleDBConfiguration))] 
    public class GlobalAttributeContext : DbContext 
    { 
    public DbSet<GlobalAttribute> GlobalAttributes { get; set; } 

    static GlobalAttributeContext() 
    { 
     Database.SetInitializer<GlobalAttributeContext>(null); 
    } 

    public GlobalAttributeContext() : base("OracleDbContext") 
    { 
    } 

    public GlobalAttributeContext(string nameOrConnectionString) 
      : base(nameOrConnectionString) 
    { 
    } 

    public GlobalAttributeContext(DbConnection existingConnection, bool contextOwnsConnection) 
      : base(existingConnection, true) 
    { 
    } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     // We have to pass the schema name into the configuration. (Is there a better way?) 
     modelBuilder.Configurations.Add(new GlobalAttribute_Config_Oracle("SchemaName")) ; 
    } 
    } 
} 

die Datenbankverbindung als separater Schritt erstellen und die Verbindung in das Kontext-Objekt übergeben.

string connStr = @"User Id=xxxxxxxxxxx;Password=xxxx;Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=VS-ORACLE.xxxxxxxx.de)(PORT=1521))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=orcl.xxxxxxxx.de)))"; 

using (var connection = new OracleConnection() { ConnectionString = connStr }) 
{ 
    connection.Open(); 
    using (var ctx = new GlobalAttributeContext(connection, true)) 
    { 
    var globalAttributes = ctx.GlobalAttributes.ToList(); 
    foreach (GlobalAttribute ga in globalAttributes) 
    { 
     Console.WriteLine("Name: {0}, Value: {1}", ga.Attribute, ga.Value); 
    } 
    } 
} 

Der Vollständigkeit halber ist dies die DBConfiguration-Klasse, die als Attribut für die Kontextklasse angegeben wird.

Diese Methode funktioniert von einer DLL, ohne dass Werte in app.config erforderlich sind.

0

Sie benötigen keinen Oracle-Client, um die Datei tnsnames.ora zu verwenden.

Siehe nur this answer (letzter Absatz) in welchem ​​Ordner ODP.NET Managed Driver erwartet die tnsnames.ora, resp. sqlnet.ora Datei.

Sie können den Alias ​​auch in .config Datei definieren, Configuring Oracle Data Provider for .NET

+0

Ich möchte vermeiden, die Datei app.config zu verwenden, weil ich den Datenzugriff in der Klassenbibliothek kapseln möchte, die von mehreren Anwendungen verwendet wird. Die Datenbankverbindung wird unabhängig konfiguriert und gespeichert. –

+0

Sie müssen nicht die app.config-Datei verwenden, es ist nur eine Option. Geben Sie den Speicherort der Datei tnsnames.ora mit einer der angegebenen Möglichkeiten an und Sie sind fertig. –

+0

Danke, ich habe es kurz versucht und ist gescheitert. Ich werde es nochmal versuchen. –

Verwandte Themen