2013-01-11 23 views
1

我想从C#读取以下存储过程。为什么我的mysql查询总是返回一个int值而不是布尔值?

DECLARE IsTrue boolean; 
DECLARE IsFalse boolean; 
set IsTrue = true; 
set IsFalse = false; 
SELECT 
    stuff.ID1 
    ,stuff.ID2 
    ,stuff.ID3 
    ,stuff.ID4 
     ,CASE 
      WHEN stuff1.ID1 IS NOT NULL THEN IsTrue 
      WHEN stuff1.ID1 IS NULL THEN IsFalse 
      END AS 'stuff1Column' 
     ,CASE 
      WHEN stuff2.ID1 IS NOT NULL THEN IsTrue 
      WHEN stuff2.ID1 IS NULL THEN IsFalse 
      END AS 'stuff2Column' 
     FROM myStuff.stuff 
     LEFT JOIN myStuff.stuff1 ON stuff.ID1 = myStuff.stuff1.ID1 
     LEFT JOIN myStuff.stuff2 ON stuff2.ID1 = myStuff.stuff2.ID1 
     ORDER BY stuff.ID1 DESC; 

基本上在C#我抛出以下异常。

Object of type 'System.Int32' cannot be converted to type 'System.Boolean'. 

即使我指定返回它给我的Int,而不是一个布尔值。我也尝试过使用tinyint(1),但它仍然无法工作。

这里是类:

public class Stuff { 
     private int _ID1; 
     private int _ID2; 
     private int _ID3; 
     private int _ID4; 
     private bool _stuff1Column; 
     private bool _stuff2Column; 

    public int ID1 { 
     get { return _ID1; } 
     set { _ID1 = value; } 
    } 
    public int ID2 { 
     get { return _ID2; } 
     set { _ID2 = value; } 
    } 
    public int ID3 { 
     get { return _ID3; } 
     set { _ID3 = value; } 
    } 
    public int ID4 { 
     get { return _ID4; } 
     set { _ID4 = value; } 
    } 
    public bool Stuff1Column { 
     get { return _stuff1Column; } 
    set { _stuff1Column = value; } 
    } 
    public bool Stuff2Column { 
     get { return _stuff2Column; } 
     set { _stuff2Column = value; } 
    } 
} 

编辑1

我的阶级是试图在stuff1Columnstuff2Column改为布尔值,因为这是性质是什么。

编辑2

下面是C#代码中读取它。

public static List<T> Read<T>(T data, string procedure) { 
    List<T> collection = new List<T>(); 
    PropertyInfo[] properties = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance); 
    List<PropertyInfo> propertiesToSearch = new List<PropertyInfo>(); 
    foreach (PropertyInfo prop in properties) { 
     if (prop.GetCustomAttributes(false).Any(x => x.GetType() == typeof(DataParameter))) 
      propertiesToSearch.Add(prop); 
    } 
    MySqlConnection connection = new MySqlConnection(Properties.Settings.Default.MySqlConnection); 
    MySqlCommand command = new MySqlCommand(procedure, connection); 
    command.CommandType = CommandType.StoredProcedure; 
    foreach (PropertyInfo property in propertiesToSearch) { 
     var parameterName = "@" + property.Name; 
     var value = property.GetValue(data, null); 
     command.Parameters.AddWithValue(parameterName, value); 
    } 
    connection.Open(); 
    MySqlDataReader reader = command.ExecuteReader(); 
    while (reader.Read()) { 
     T item = Activator.CreateInstance<T>(); 
     foreach (PropertyInfo property in propertiesToSearch) { 
      if (reader[property.Name] is MySql.Data.Types.MySqlDateTime) { 
       property.SetValue(item, (DateTime)(MySql.Data.Types.MySqlDateTime)reader[property.Name], null); 
      } else { 
       Type test = reader[property.Name].GetType(); 
       property.SetValue(item, reader[property.Name], null); 
      } 
     } 
     collection.Add(item); 
    } 
    reader.Close(); 
    connection.Close(); 
    return collection; 
} 

EDIT 3

我已经(1)存储在具有一个TINYINT另一个表值MySqlDataReader会自动将其解释为一个布尔值。所以我相信这是一个存储过程,它可能不是一个实际的存储值?

+1

你能分享你的C#代码吗? –

+0

它不会解决您的问题,但你可以用'CASE WHEN stuff1.ID1 IS NOT NULL THEN IsTrue运算 ELSE IsFalse END而是采用2'AS“stuff1Column'' WHERE' – cheesemacfly

回答

2

我错了,在MySQL中没有C#布尔类型的等价物,所以您只能使用NUMERIC类型并在C#中将返回值计算为ntegers。

因此,请保持BOOLEAN类型并修改您的C#代码以评估返回的BOOLEAN值(所以0代表假,1代表真)。

+0

我尝试切换到BIT和其然后给我以下错误。 'System.UInt32'类型的对象不能转换为'System.Boolean'类型。' – meanbunny

+0

@meanbunny我们可以看到你的C#代码吗? – cheesemacfly

+0

我添加了上面的代码 – meanbunny

相关问题