Dapper .net은 Sybase 12 또는 16과의 연결 문자열을 잃습니다.

.net dapper sqlanywhere

문제

Sybase 12 및 dapper.net에서 작업합니다. 이 업데이트 후에 나는 "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을 사용하면 모든 것이 잘됩니다!

전문가 답변

그것 참 흥미 롭네; 그것과 관련이있는 것처럼 보입니다.

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);
}

당연히 그것이 코드에서 어떻게 든 잘못되어서 Entity Framework와 관련이 있다고 생각하게 만드는 코드가있을 수 있습니다.

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

하나! 궁극적으로 "문제"는 SAConnection 구현의 버그입니다. 솔직히 이건 sybase로 로그하는 데 필요한 것 같아.


인기 답변

어셈블리를 디 컴파일하여 다음 코드를 보여줍니다.


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 이렇게하면 널 참조를 일으키는 4 대신에 3 번째 if 문에 코드를 넣을 if 있습니다.



아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow