2015-05-04 35 views
1

如果我有一个TINYINT(1)列的表,并用DataReader选择此列,MySQL创建一个布尔列。强制MySQL连接器.NET返回一个布尔值

 var query = "SELECT column FROM table"; 
     using (var reader = ExecuteReader(query)) 
     { 
      var schemaTable = reader.GetSchemaTable(); 
      var row = schemaTable.DefaultView[0]; 
      Assert.AreEqual(typeof(bool), row["DataType"]); 
     } 

但是,如果我有一个查询不起作用。

 var query = "SELECT false"; 
     using (var reader = ExecuteReader(query)) 
     { 
      var schemaTable = reader.GetSchemaTable(); 
      var row = schemaTable.DefaultView[0]; 
      Assert.AreEqual(typeof(bool), row["DataType"]); 
     } 

这个测试失败,因为数据类型是System.Int64

是否可以强制查询返回TINYINT(1)值?在大局,我让实体框架生成我的模型,我有一些视图与创建为System.Int64的布尔列,我想这将解决这个问题。

回答

0

您是否尝试过使用CONVERT或CAST?

var query = "SELECT CONVERT(0,TINYINT(1))" 
var query = "SELECT CAST(0 AS TINYINT(1))" 

编辑:这似乎是在MySQL中的CAST/CONVERT函数的限制。一个建议的解决方案是创建一个函数来完成铸造

CREATE FUNCTION x_cast_to_tinyint(number bigint) RETURNS tinyint 
BEGIN return number; 
END 

然后调用函数

select x_cast_to_tinyint(d.tiny_int*1) as tiny 

参考:http://idiot-howto.blogspot.com/2008/07/mysql-cast-limitation.html#!/2008/07/mysql-cast-limitation.html

+0

我一样,MySQL只允许'CAST 0作为符号/ UNSIGNED'这将导致Int64 - https://dev.mysql.com/doc/refman/5.0/en/cast-functions.html –