Dapper .net pierde cadena de conexión con Sybase 12 o 16

.net dapper sqlanywhere

Pregunta

Yo trabajo con Sybase 12 y dapper.net. Todo estaba bien, hasta que hice la actualización de Sybase 3817. Después de esta actualización, comencé a recibir una excepción: "System.NullReferenceException:"

rastro:

   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

Cuando miré en la conexión mi variablу vi, esa cadena de conexión tiene una excepción:

'MDbConnection.ConnectionString' lanzó una excepción de tipo 'System.NullReferenceException'.

No puedo entender lo que sucede en esta actualización de sybase. Todas las próximas actualizaciones de la versión 12 y las más recientes - 16 tienen el mismo problema con apuesto! Pero si uso ADO.Net, ¡todo funciona bien!

Respuesta experta

Eso es interesante; parece que se relaciona con:

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

Por lo tanto, es el simple acto de consultar el .ConnectionString que está fallando. Tu dices:

Pero si uso ADO.Net, ¡todo funciona bien!

Imagino que eso se debe a que cuando usa ADO.NET no tiene ningún motivo para mirar .ConnectionString una vez que se abre una conexión. Probablemente lo primero que hay que hacer (se puede comprobar esto?) Para ver si se .ConnectionString no emite un error, es decir,

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

por supuesto, si podría haber algo más en el código que de alguna manera lo hace pensar incorrectamente que se relaciona con Entity Framework, de acuerdo con:

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

¡Sin embargo! En última instancia, parece que el "problema" aquí es: un error en la implementación de SAConnection . Francamente, creo que esto es algo que necesitas para iniciar sesión con sybase.


Respuesta popular

Descompilé el ensamblado, mostrando el siguiente código:


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
    {
        ///...
    }
}

Así que agregué lo siguiente a nuestra cadena de conexión: ;Persist Security Info=True Esto permitirá que el código vaya en la 3ª instrucción if , en lugar de la 4 que está causando la referencia nula.



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué