繁体   English   中英

Oracle.DataAccess.Client.OracleConnection.Open()引发NullReferenceException

[英]Oracle.DataAccess.Client.OracleConnection.Open() throws NullReferenceException

我在解决方案中有两个单独的项目。 它们都需要创建到同一数据库的连接。 但是,由于某种原因,连接会在一个项目中正确打开,但在另一个项目中无法打开。 代码非常相似,并且连接字符串相同。 这个问题令人难以置信,对于我的一生,我无法弄清楚。

这一项工作...配置为:

<add name="Database.1" connectionString="Data Source=SPFLKD1;User ID=svc_acct;Password=hidden" providerName="Oracle.DataAccess.Client"/>

编码:

    public UnitOfWork(String connectionName)
    {
        Verify.NotNullOrWhiteSpace(connectionName, "connectionName");

        connection = CreateConnection(connectionName);

        try
        {
            connection.Open(); // Successfully opens a connection
            transaction = connection.BeginTransaction();
        }
        catch (Exception)
        {
            connection.Dispose();
            throw;
        }
    }

    private static IDbConnection CreateConnection(String connectionName)
    {
        var configuration = ConfigurationManager.ConnectionStrings[connectionName];
        var providerFactory = DbProviderFactories.GetFactory(configuration == null ? String.Empty : configuration.ProviderName);
        var connection = providerFactory.CreateConnection() ?? new OdbcConnection();

        connection.ConnectionString = configuration == null ? String.Empty : configuration.ConnectionString;

        return connection;
    }

以上返回正确的Oracle连接。 现在下面的内容在单独的项目中不起作用。 它引用相同的连接字符串(来自不同的app.config文件)。

    private static string SPFConnection(int id)
    {
        var systemId = id + 1;
        return "SpfDatabase." + systemId;
    }

    private IDbConnection CreateConnection(String connectionName)
    {
        var configuration = ConfigurationManager.ConnectionStrings[connectionName];
        var providerFactory = DbProviderFactories.GetFactory(configuration == null ? String.Empty : configuration.ProviderName);
        var connection = providerFactory.CreateConnection() ?? new OdbcConnection();

        connection.ConnectionString = configuration == null ? String.Empty : configuration.ConnectionString;

        return connection;
    }

    public IList<string> GetUserRoles(string username, int facilityId)
    {
        var retVal = new List<string>();
        var connection = CreateConnection(SPFConnection(facilityId));

        try
        {
            connection.Open(); // Open method throws exception

            ... other code

        catch (Exception e)
        {
            throw new Exception("Unable to get SPF User Roles for '" + username + "'", e);
        }
    } 

异常是NullReferenceException ,并且堆栈跟踪是:

at Oracle.DataAccess.Client.OracleConnection.Open()
at TDNR.Data.SPF.SPFData.GetUserRoles(String username, Int32 facilityId) in c:\DefaultCollection\LLK - TDNR\TDNR-Support-Release 3.x\TDNR.Data\SPF\SPFData.cs:line 57

请注意,连接对象不为空。 而是,异常来自OracleConnection.Open()方法。

我意识到上面的代码本身可能不是错误的原因。 我已经完成调试,在调用connection.Open()方法之前,所有东西(连接对象,配置和连接字符串)似乎都是完全相同的。 第一个成功,第二个失败。

我不确切知道要寻​​找什么,所以我真的不知道要张贴什么。 如果有人可以帮助,将不胜感激。

我设法通过将提供程序更改为托管版本来解决此问题。

<add name="Database.1" connectionString="Data Source=SPFLKD1;User ID=svc_acct;Password=hidden" providerName="Oracle.ManagedDataAccess.Client"/>

目前,我尚不清楚此方法为何有效。 或更确切地说,为什么非托管版本没有。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM