键 'data source' 的值长度超过了“128”的限制
The value's length for key 'data source' exceeds it's limit of '128'
我知道有人问过一个非常相似的问题 here,但答案对我没有帮助。
我正在使用 Entity Framework 6 和 Oracle.ManagerDataAccess.Client。
如果我在 app.config 中定义连接字符串,则连接有效。
如果我在代码中指定相同的连接字符串,则会收到错误
The value's length for key 'data source' exceeds it's limit of '128'.
正确。
这是我的连接字符串(删除了一些名称):
"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) ) )"
我知道有很多空格可以删除,但我仍然不会将字符串缩减到 128 个字符以下。
为什么当连接字符串在 app.config 中时有效,但在代码中时却无效?
通过将一些参数卸载到另一个字符串,我可以使用任何技巧吗?
我已经在使用 DBConfiguration 对象。有什么方法可以设置该对象中的一些参数吗?
如果我使用完整的 oracle 客户端,我想我可以参考文件 tnsnames.ora 中的配置,但如果我们可以在没有完整客户端的情况下与 oracle 数据库通信,那将是一个很大的好处。
更新
这是 app.config
中的连接字符串
<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>
在代码中我定义了上下文 class 如下:
[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")) ;
}
}
我定义了一个 DbConfiguration class 如下:
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 ) ;
}
}
最后,我创建了这样的上下文
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 ) ;
}
}
两种方法中使用的连接字符串是相同的。
您不需要任何 Oracle 客户端即可使用 tnsnames.ora 文件。
只需查看 (最后一段)文件夹 ODP.NET Managed Driver 需要 tnsnames.ora
,resp。 sqlnet.ora
文件。
您也可以在 .config
文件中定义别名,请参阅 Configuring Oracle Data Provider for .NET
我的同事找到了这个问题的答案如下:
将另一个构造函数添加到上下文 class 以使用现有连接。
public GlobalAttributeContext(DbConnection existingConnection, bool contextOwnsConnection)
: base(existingConnection, true)
{
}
这是完整的上下文class
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")) ;
}
}
}
创建数据库连接作为一个单独的步骤并将连接传递到上下文对象中。
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);
}
}
}
为了完整起见,这是 DBConfiguration class,它被指定为上下文 class 的属性。
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 ) ;
}
}
此方法适用于 DLL,不需要 app.config.
中的任何值
一旦我没有足够的声誉来评论任何问题或答案,我就会在这里发布我的发现。
就我而言,Phill Jollans 的回答几乎已经解决了。以下细节必须另外完成
- 我不需要那么多构造函数;在上下文 class.
中,只有构造函数接收连接字符串并将其传递给基础 class 就足够了
- 我必须手动删除 app.config 文件中的 SqlServer 连接字符串提供程序。
上下文很可能试图实例化与 SqlServer 而不是 Oracle 的连接,导致验证抛出此异常。
oracle data source key好像没有这个限制
几天前我遇到了同样的问题,上下文试图实例化与 SqlServer 而不是 Oracle 的连接。
我必须对以下代码进行更改:
services.AddDbContext<ManagerContext>(options => options.UseSqlServer(configuration.GetConnectionString("cnnFinacle")),
ServiceLifetime.Transient);
我通过将 UseSqlServer 更改为 UseOracle 来修复它
请注意,此上下文位于 dotnet 核心 WorkerService 上
我知道有人问过一个非常相似的问题 here,但答案对我没有帮助。
我正在使用 Entity Framework 6 和 Oracle.ManagerDataAccess.Client。
如果我在 app.config 中定义连接字符串,则连接有效。 如果我在代码中指定相同的连接字符串,则会收到错误
The value's length for key 'data source' exceeds it's limit of '128'.
正确。
这是我的连接字符串(删除了一些名称):
"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) ) )"
我知道有很多空格可以删除,但我仍然不会将字符串缩减到 128 个字符以下。
为什么当连接字符串在 app.config 中时有效,但在代码中时却无效?
通过将一些参数卸载到另一个字符串,我可以使用任何技巧吗?
我已经在使用 DBConfiguration 对象。有什么方法可以设置该对象中的一些参数吗?
如果我使用完整的 oracle 客户端,我想我可以参考文件 tnsnames.ora 中的配置,但如果我们可以在没有完整客户端的情况下与 oracle 数据库通信,那将是一个很大的好处。
更新
这是 app.config
中的连接字符串<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>
在代码中我定义了上下文 class 如下:
[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")) ;
}
}
我定义了一个 DbConfiguration class 如下:
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 ) ;
}
}
最后,我创建了这样的上下文
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 ) ;
}
}
两种方法中使用的连接字符串是相同的。
您不需要任何 Oracle 客户端即可使用 tnsnames.ora 文件。
只需查看 tnsnames.ora
,resp。 sqlnet.ora
文件。
您也可以在 .config
文件中定义别名,请参阅 Configuring Oracle Data Provider for .NET
我的同事找到了这个问题的答案如下:
将另一个构造函数添加到上下文 class 以使用现有连接。
public GlobalAttributeContext(DbConnection existingConnection, bool contextOwnsConnection)
: base(existingConnection, true)
{
}
这是完整的上下文class
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")) ;
}
}
}
创建数据库连接作为一个单独的步骤并将连接传递到上下文对象中。
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);
}
}
}
为了完整起见,这是 DBConfiguration class,它被指定为上下文 class 的属性。
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 ) ;
}
}
此方法适用于 DLL,不需要 app.config.
中的任何值一旦我没有足够的声誉来评论任何问题或答案,我就会在这里发布我的发现。
就我而言,Phill Jollans 的回答几乎已经解决了。以下细节必须另外完成
- 我不需要那么多构造函数;在上下文 class. 中,只有构造函数接收连接字符串并将其传递给基础 class 就足够了
- 我必须手动删除 app.config 文件中的 SqlServer 连接字符串提供程序。
上下文很可能试图实例化与 SqlServer 而不是 Oracle 的连接,导致验证抛出此异常。 oracle data source key好像没有这个限制
几天前我遇到了同样的问题,上下文试图实例化与 SqlServer 而不是 Oracle 的连接。
我必须对以下代码进行更改:
services.AddDbContext<ManagerContext>(options => options.UseSqlServer(configuration.GetConnectionString("cnnFinacle")),
ServiceLifetime.Transient);
我通过将 UseSqlServer 更改为 UseOracle 来修复它
请注意,此上下文位于 dotnet 核心 WorkerService 上