1

我使用 Sybase 12 和 dapper.net。一切都很好,直到我进行了 Sybase 更新 3817。在此更新之后,我开始收到这样的异常:“System.NullReferenceException:”

痕迹:

   iAnywhere.Data.SQLAnywhere.SAConnection.CalledByEntityFramework() +263
   iAnywhere.Data.SQLAnywhere.SAConnection.get_ConnectionString() +538
   Dapper.Identity..ctor(String sql, Nullable`1 commandType, IDbConnection connection, Type type, Type parametersType, Type[] otherTypes) +73
   Dapper.<QueryInternal>d__13`1.MoveNext() +545
   System.Collections.Generic.List`1..ctor(IEnumerable`1 collection) +381
   System.Linq.Enumerable.ToList(IEnumerable`1 source) +58
   Dapper.SqlMapper.Query(IDbConnection cnn, String sql, Object param, IDbTransaction transaction, Boolean buffered, Nullable`1 commandTimeout, Nullable`1 commandType) +218
   Dapper.SqlMapper.Query(IDbConnection cnn, String sql, Object param, IDbTransaction transaction, Boolean buffered, Nullable`1 commandTimeout, Nullable`1 commandType) +88

当我查看我看到的连接时,该连接字符串有异常:

“MDbConnection.ConnectionString”引发了“System.NullReferenceException”类型的异常。

我无法理解这次 sybase 更新中发生了什么。版本 12 和最新版本的所有下一次更新 - 16 与 dapper 有同样的问题!但如果我使用 ADO.Net - 一切正常!

4

2 回答 2

1

我反编译了程序集,显示以下代码:


public override string ConnectionString
{
    get
    {
        SATrace.PropertyCall("", this._objectId);
        if (this._connStr == null)
        {
            return "";
        }
        if (SAConnectionOptions.GetAdoDotNetTesting(this._connOpts))
        {
           //.....
        }
        if (SAConnectionOptions.GetPersistSecurityInfo(this._connOpts) || base.DesignMode || SAConnection.s_isHostedByVisualStudio)
        {
            return this._connStr;
        }
        if (this.CalledByEntityFramework()) //It goes wrong here
        {
            return this._connStr;
        }
        string result;
        string text2;
        string text3;
        SAConnection.RemoveKeyValuesFromString(this._connStr, SAConnectionOptions.s_passwordKeys, false, out result, out text2, out text3);
        return result;
    }
    set
    {
        ///...
    }
}

所以我在我们的连接字符串中添加了以下内容:;Persist Security Info=True 这将允许代码进入第 3if条语句,而不是导致空引用的 4 条。

于 2016-09-27T07:49:41.590 回答
0

这太有趣了; 看起来它与:

internal Identity(string sql, CommandType? commandType, IDbConnection connection, Type type, Type parametersType, Type[] otherTypes)
    : this(sql, commandType, connection.ConnectionString, type, parametersType, otherTypes, 0)
{ }

所以这是查询.ConnectionString失败的简单行为。你说:

但如果我使用 ADO.Net - 一切正常!

这是因为在使用 ADO.NET 时,您没有任何理由查看.ConnectionString连接打开后的情况。可能要做的第一件事(你能检查一下吗?)是看看是否.ConnectionString 抛出错误,即

using(var conn = new WhateverConnection(connectionString)) {
    conn.Open();
    // maybe execute a command, just for fun
    Console.WriteLine(conn.ConnectionString);
}

当然,如果代码中的其他内容可能以某种方式使其错误地认为它与实体框架有关,则根据:

iAnywhere.Data.SQLAnywhere.SAConnection.CalledByEntityFramework() +263

然而!最终,看起来这里的“问题”是:SAConnection实现中的一个错误。坦率地说,我认为这是您需要使用 sybase 登录的内容。

于 2013-03-08T07:31:45.753 回答