Dapper .net perd la chaîne de connexion avec Sybase 12 ou 16

.net dapper sqlanywhere

Question

Je travaille avec Sybase 12 et dapper.net. Tout s'est bien passé, jusqu'à ce que je fasse la mise à jour de Sybase 3817. Après cette mise à jour, j'ai commencé à obtenir une telle exception: "System.NullReferenceException:"

trace:

   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

Lorsque j'ai examiné la connexion que j'ai vue, cette chaîne de connexion a une exception:

'MDbConnection.ConnectionString' a généré une exception de type 'System.NullReferenceException'.

Je ne peux pas comprendre ce qui se passe dans cette mise à jour de sybase. Toutes les prochaines mises à jour de la version 12 et des plus récentes versions 16 ont le même problème avec dapper! Mais si j'utilise ADO.Net - tout fonctionne bien!

Réponse d'expert

C'est intéressant; il semble que cela concerne:

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

C'est donc le simple fait d'interroger le .ConnectionString qui échoue. Vous dites:

Mais si j'utilise ADO.Net - tout fonctionne bien!

J'imagine que c'est parce que lorsque vous utilisez ADO.NET, vous n'avez aucune raison de regarder le .ConnectionString une fois qu'une connexion est ouverte. Probablement la première chose à faire (vous pouvez le vérifier?) Est de voir si .ConnectionString ne jette une erreur, à savoir

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

Bien sûr, si quelque chose d'autre dans le code peut en quelque sorte faire croire à tort qu'il est lié à Entity Framework, selon:

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

Toutefois! En fin de compte, il semble que le "problème" soit: un bogue dans l'implémentation de SAConnection . Franchement, je pense que c'est quelque chose dont vous avez besoin pour vous connecter avec sybase.


Réponse populaire

J'ai décompilé l'assemblage en affichant le code suivant:


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

J'ai donc ajouté les éléments suivants à notre chaîne de connexion ;Persist Security Info=True Cela permettra au code d'entrer dans la troisième instruction if , au lieu des quatre qui provoquent la référence null.




Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi