Dapper .net与Sybase 12或16丢失连接字符串

时间:2013-03-07 21:17:20

标签: .net dapper sqlanywhere

我使用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 - 一切正常!

2 个答案:

答案 0 :(得分:1)

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

  public static int binarySearch(int[] a, int n, int x) {
        int start = 0;
        int end = n - 1;

        while (start <= end) {
            int mid = (start + end) / 2;
            if (a[mid] == x) {
                return mid;
            } else if (a[mid] < x) {
                start = mid + 1;
            } else {
                end = mid - 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 { ///... } } 这将允许代码进入第3个;Persist Security Info=True语句,而不是导致空引用的4。

答案 1 :(得分: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登录的东西。