2016-01-23 7 views
0

Я новичок в ORMLite в ServiceStack. Я пытаюсь запросить существующую базу данных MySQL. Я создал это ПОКА, чтобы соответствовать моей сервировке стола в MySQL:ServiceStack ORMLite не заполняет результаты MySQL

[Alias("checks")] 
public class Check 
{ 
    [AutoIncrement] 
    [PrimaryKey] 
    public long check_id { get; set; } 
    public long room_state_id { get; set; } 
    public DateTime? entry_stamp { get; set; } 
    public int student_id { get; set; } 
    public string reason { get; set; } 
    public string comments { get; set; } 
    public long check_type_id { get; set; } 
    public DateTime? check_dt { get; set; } 
    public byte grace { get; set; } 
    public DateTime curfew_dt { get; set; } 
    public int excused_by { get; set; } 
    public string status { get; set; } 
    public int points { get; set; } 
    public string check_class { get; set; } 
    public int leave_id { get; set; } 
    public DateTime night_of { get; set; } 
    public DateTime violation_dt { get; set; } 
    public string excused_reason { get; set; } 
    public DateTime? excused_dt { get; set; } 
    public sbyte imported { get; set; } 
} 

Вот определение

CREATE TABLE checks (
    check_id bigint(11) NOT NULL AUTO_INCREMENT, 
    room_state_id bigint(11) NOT NULL DEFAULT 0, 
    entry_stamp datetime DEFAULT NULL, 
    student_id int(11) NOT NULL DEFAULT 0, 
    reason varchar(60) DEFAULT NULL, 
    comments text DEFAULT NULL, 
    check_type_id bigint(20) NOT NULL DEFAULT 0, 
    check_dt datetime DEFAULT NULL, 
    grace tinyint(4) UNSIGNED NOT NULL DEFAULT 0, 
    curfew_dt datetime NOT NULL DEFAULT '0000-00-00 00:00:00', 
    excused_by int(11) NOT NULL DEFAULT 0, 
    status char(1) NOT NULL DEFAULT '', 
    points int(11) NOT NULL DEFAULT 0, 
    check_class char(2) NOT NULL DEFAULT '', 
    leave_id int(11) NOT NULL DEFAULT 0, 
    night_of date NOT NULL DEFAULT '0000-00-00', 
    violation_dt datetime NOT NULL DEFAULT '0000-00-00 00:00:00', 
    excused_reason varchar(255) NOT NULL DEFAULT '', 
    excused_dt datetime DEFAULT '0000-00-00 00:00:00', 
    imported tinyint(1) NOT NULL DEFAULT 0, 
    PRIMARY KEY (check_id), 
    INDEX check_class (check_class), 
    INDEX check_dt (check_dt), 
    INDEX check_type_id (check_type_id), 
    INDEX excused_by (excused_by), 
    INDEX leave_id (leave_id), 
    INDEX night_of (night_of), 
    INDEX status (status), 
    INDEX student_id (student_id) 
) 

MySQL таблицы и я пытаюсь получить некоторые результаты использования:

public object Get(GetChecks request) 
    { 
     return new GetChecksResponse { Results = Db.Select<Check>(q => q.student_id == request.StudentId) }; 
    } 

Когда я проверяю это, я получаю таблицу результатов с правильным количеством строк, но ни одна из данных не заполняется (все поля во всех строках пустые или 0, за исключением времени, имеющего бессмысленную дату). Как я могу найти, почему ORMLite не заполняет мои POCOs?

ОБНОВЛЕНИЕ:

Протоколирование показывает много ошибок преобразования DateTime:

2016-01-23 15:35:53.5869|ERROR|OrmLiteWriteCommandExtensions|MySql.Data.Types.MySqlConversionException: Unable to convert MySQL date/time value to System.DateTime 

на MySql.Data.Types.MySqlDateTime.GetDateTime() на MySql.Data.MySqlClient.MySqlDataReader.GetValue (Int32 я) в MySql.Data.MySqlClient.MySqlDataReader.GetValues ​​(Object [] значения) на ServiceStack.OrmLite.OrmLiteWriteCommandExtensions.PopulateWithSqlReader [T] (T objWithProperties, IOrmLiteDialectProvider dialectProvider, IDataReader читателя, Tuple`3 [] indexCache, объект [])

+0

Имеет ли [регистрация] (https://github.co) m/ServiceStack/ServiceStack/wiki/Logging) показать ошибки? Вы создали таблицу с OrmLite, например: 'db.CreateTable ()', или вы пытаетесь сопоставить ее с существующей таблицей? если да, укажите, пожалуйста, используемое определение Create Table. – mythz

ответ

2

Если добавить logging:

LogManager.LogFactory = new ConsoleLogFactory(); 

Вы увидите сообщение об ошибке:

ERROR: System.FormatException: Input string was not in a correct format. 
    at System.Number.StringToNumber(String str, NumberStyles options, NumberBuffer& number, NumberFormatInfo info, Boolean parseDecimal) 
    at System.Number.ParseInt32(String s, NumberStyles style, NumberFormatInfo info) 
    at System.SByte.Parse(String s, NumberStyles style, NumberFormatInfo info) 
    at ServiceStack.Text.Common.DeserializeBuiltin`1.<>c.<GetParseFn>b__4_2(String value) in C:\src\ServiceStack.Text\src\ServiceStack.Text\Common\DeserializeBuiltin.cs:line 51 
    at ServiceStack.OrmLite.OrmLiteConverterExtensions.ConvertNumber(IOrmLiteDialectProvider dialectProvider, Type toIntegerType, Object value) in C:\src\ServiceStack.OrmLite\src\ServiceStack.OrmLite\IOrmLiteConverter.cs:line 151 
    at ServiceStack.OrmLite.OrmLiteConverterExtensions.ConvertNumber(IOrmLiteConverter converter, Type toIntegerType, Object value) in C:\src\ServiceStack.OrmLite\src\ServiceStack.OrmLite\IOrmLiteConverter.cs:line 115 
    at ServiceStack.OrmLite.Converters.IntegerConverter.FromDbValue(Type fieldType, Object value) in C:\src\ServiceStack.OrmLite\src\ServiceStack.OrmLite\Converters\IntegerConverters.cs:line 25 
    at ServiceStack.OrmLite.OrmLiteWriteCommandExtensions.PopulateWithSqlReader[T](T objWithProperties, IOrmLiteDialectProvider dialectProvider, IDataReader reader, Tuple`3[] indexCache, Object[] values) in C:\src\ServiceStack.OrmLite\src\ServiceStack.OrmLite\OrmLiteWriteCommandExtensions.cs:line 343 

Вопрос заключается в том, что ADO.NET провайдер MySql возвращает tinyint(1) как BOOL, так что вы можете решить путем изменения его на bool:

public bool imported { get; set; } 
+0

Спасибо за очень быстрый ответ - включилось ведение журнала, но похоже, что я вижу много ошибок DateTime, а не ошибок в строке. Я на самом деле первоначально импортировался как «bool», но когда он не работал, я попытался построить с использованием шаблонов ORMLite T4, и именно там я получил sbyte. – scotru

+0

@scotru - это проблема [MySql data issue] (http://stackoverflow.com/q/710182/85785), не связанная с OrmLite. – mythz

+0

Спасибо! Я обычно использую [поставщик DevArt] (https://www.devart.com/dotconnect/mysql/) Можно ли настроить OrmLite для использования этого провайдера? – scotru

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