2013-03-07 4 views
1

Я работаю с Sybase 12 и dapper.net. Все было нормально, пока я не сделал Sybase обновления 3817. После этого обновления, я начал получать такое исключение: "System.NullReferenceException:"Dapper .net теряет строку подключения с Sybase 12 или 16

след:

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 

Когда я заглянул в связи с моим variablу I видел, что строка соединения имеет исключение:

«MDbConnection.ConnectionString» выбрасывает исключение типа «Исключение System.NullReferenceException».

Я не могу понять, что происходит в этом обновлении sybase. Все последующие обновления версии 12 и новейшие - 16 имеют такую ​​же проблему с dapper! Но если я использую ADO.Net - все работает отлично!

ответ

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

, конечно, если бы что-то еще в коде, который каким-то образом делает его неправильно думать он относится к Структуре Entity Framework, согласно:

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

Однако, однако! В конечном счете, похоже, что «проблема» здесь: ошибка в реализации SAConnection. Честно говоря, я думаю, что вам нужно войти в систему с sybase.

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 Это позволит код идти в 3-ем if заявление, вместо 4 который вызывает нулевую ссылку.

 Смежные вопросы

  • Нет связанных вопросов^_^