ServiceStack ORMLite 未填充来自 MySQL 的结果
ServiceStack ORMLite not populating results from MySQL
我是 ServiceStack 中 ORMLite 的新手。我正在尝试查询现有的 MySQL 数据库。我创建了这个 POCO 以对应于我在 MySQL:
中的 table 布局
[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; }
}
这是 MySQL table 定义
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)
)
我正在尝试使用以下方法获得一些结果:
public object Get(GetChecks request)
{
return new GetChecksResponse { Results = Db.Select<Check>(q => q.student_id == request.StudentId ) };
}
当我对此进行测试时,我得到了 table 行数正确的结果,但是填充了 none 的数据(所有行中的所有字段均为空白或 0,除了对于具有无意义日期的日期时间)。我如何找到 ORMLite 没有填充我的 POCO 的原因?
更新:
日志记录显示大量 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 i)
在 MySql.Data.MySqlClient.MySqlDataReader.GetValues(对象 [] 值)
在 ServiceStack.OrmLite.OrmLiteWriteCommandExtensions.PopulateWithSqlReader[T](T objWithProperties, IOrmLiteDialectProvider dialectProvider, IDataReader reader, Tuple`3[] indexCache, Object[] values)
如果添加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
问题是 MySql ADO.NET 提供程序 returns tinyint(1)
作为布尔值,因此您可以通过将其更改为 bool
来解决问题:
public bool imported { get; set; }
我是 ServiceStack 中 ORMLite 的新手。我正在尝试查询现有的 MySQL 数据库。我创建了这个 POCO 以对应于我在 MySQL:
中的 table 布局[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; }
}
这是 MySQL table 定义
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)
)
我正在尝试使用以下方法获得一些结果:
public object Get(GetChecks request)
{
return new GetChecksResponse { Results = Db.Select<Check>(q => q.student_id == request.StudentId ) };
}
当我对此进行测试时,我得到了 table 行数正确的结果,但是填充了 none 的数据(所有行中的所有字段均为空白或 0,除了对于具有无意义日期的日期时间)。我如何找到 ORMLite 没有填充我的 POCO 的原因?
更新:
日志记录显示大量 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 i) 在 MySql.Data.MySqlClient.MySqlDataReader.GetValues(对象 [] 值) 在 ServiceStack.OrmLite.OrmLiteWriteCommandExtensions.PopulateWithSqlReader[T](T objWithProperties, IOrmLiteDialectProvider dialectProvider, IDataReader reader, Tuple`3[] indexCache, Object[] values)
如果添加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
问题是 MySql ADO.NET 提供程序 returns tinyint(1)
作为布尔值,因此您可以通过将其更改为 bool
来解决问题:
public bool imported { get; set; }