Subsonic 3.0.0.4 Шаблон ActiveRecord для MySQL при вставке новой записи - PullRequest
1 голос
/ 07 ноября 2010
public void Add(IDataProvider provider){


    var key=KeyValue();
    if(key==null){
        var newKey=_repo.Add(this,provider);
        this.SetKeyValue(newKey);
    }else{
        _repo.Add(this,provider); //NullReferenceException was unhandled by user code
    }
    SetIsNew(false);
    OnSaved();
}

' это ' содержит

this
{Geocine}
    _age: null
    _birthday: null
    _church_id: null
    _db: {Seminary.Data.SeminaryDB}
    _dirtyColumns: Count = 0
    _finalgrade: null
    _finalgrade_equivalent: null
    _first_name: "Geocine"
    _gender: null
    _isLoaded: false
    _isNew: true
    _last_name: "Cruz"
    _level: null
    _middle_name: "Reilly"
    _repo: {SubSonic.Repository.SubSonicRepository<Seminary.Data.student>}
    _semester_enrolled: null
    _seminary_id: null
    _student_id: 0
    _year_enrolled: null
    age: null
    birthday: null
    church_id: null
    Columns: Count = 14
    finalgrade: null
    finalgrade_equivalent: null
    first_name: "Geocine"
    gender: null
    last_name: "Cruz"
    level: null
    middle_name: "Reilly"
    semester_enrolled: null
    seminary_id: null
    student_id: 0
    tbl: {student}
    TestMode: false
    year_enrolled: null

провайдера содержит

provider
{SubSonic.DataProviders.DbDataProvider}
    [SubSonic.DataProviders.DbDataProvider]: {SubSonic.DataProviders.DbDataProvider}
    Client: MySqlClient
    ConnectionString: "Data Source=localhost;Database=school;User Id=root;Password=123456;Port=3306;"
    CurrentSharedConnection: null
    DbDataProviderName: "MySql.Data.MySqlClient"
    Factory: {MySql.Data.MySqlClient.MySqlClientFactory}
    Log: null
    Name: "MySql.Data.MySqlClient"
    ParameterPrefix: "@"
    Schema: {SubSonic.Schema.DatabaseSchema}
    SchemaGenerator: {SubSonic.SqlGeneration.Schema.MySqlSchema}

Здесь находится трассировка стека

[NullReferenceException: Object reference not set to an instance of an object.]
   MySql.Data.MySqlClient.MySqlConnection.get_ServerThread() +6
   MySql.Data.MySqlClient.MySqlConnection.Abort() +54
   MySql.Data.MySqlClient.MySqlCommand.ExecuteReader(CommandBehavior behavior) +839
   MySql.Data.MySqlClient.MySqlCommand.ExecuteDbDataReader(CommandBehavior behavior) +4
   System.Data.Common.DbCommand.ExecuteReader(CommandBehavior behavior) +10
   SubSonic.DataProviders.DbDataProvider.ExecuteReader(QueryCommand qry) +175
   SubSonic.Repository.SubSonicRepository`1.Add(T item, IDataProvider provider) +165
   Seminary.Data.student.Add(IDataProvider provider) in C:\Users\SomeUser\Documents\Visual Studio 2008\Projects\Seminary\ActiveRecord\ActiveRecord.cs:2490
   Seminary.Data.student.Save(IDataProvider provider) in C:\Users\SomeUser\Documents\Visual Studio 2008\Projects\Seminary\ActiveRecord\ActiveRecord.cs:2505
   Seminary.Data.student.Save() in C:\Users\SomeUser\Documents\Visual Studio 2008\Projects\Seminary\ActiveRecord\ActiveRecord.cs:2499
   Seminary.Default.btnAdd_Click(Object sender, EventArgs e) in C:\Users\SomeUser\Documents\Visual Studio 2008\Projects\Seminary\Default.aspx.cs:34
   System.Web.UI.WebControls.Button.OnClick(EventArgs e) +111
   System.Web.UI.WebControls.Button.RaisePostBackEvent(String eventArgument) +110
   System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument) +10
   System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument) +13
   System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData) +36
   System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +1565

Вот код, вызвавший ошибку:

    student studentObject = new student();
    studentObject.first_name = txtFirstName.Text;
    studentObject.middle_name = txtMiddleName.Text;
    studentObject.last_name = txtLastName.Text;
    studentObject.Save();

1 Ответ

1 голос
/ 10 ноября 2010

Это немного сложно.Это исключение происходит с текущей версией mysql.connector.net.

Обычно на этом этапе генерируется исключение, но кажется, что сам соединитель имеет исключение NullReferenceException, прежде чем он может вызвать действительное исключение.

«Настоящим» исключением может быть что угодно, от «DUPLICATE KEY ...» до «Поле XYZ не имеет значения по умолчанию» или «У вас ошибка в синтаксисе SQL рядом с ...»

У меня еще не было времени выяснить, почему это происходит (отладить Connector.Net или попробовать более новую), но в то же время я бы посоветовал вам сделать следующее, как я:

Скачать unixинструменты для windows: http://unxutils.sourceforge.net/ и поместите их в путь (нам нужна команда tail). Настройте mysql для записи query.log в c: \ temp

[mysqld]
log=c:/temp/query.log

Запустите консоль и введите

tail -f c:\temp\query.log

Теперь вы видите каждый оператор, который выполняется для вашей локальной базы данных, и, если вы получаете исключение NullReferenceException, скопируйте последний оператор из окна консоли в броуз запроса mysql.или выполните его там.

Надеюсь, это поможет, я обновлю этот пост, если выясню, как решить эту проблему.

...