1

我正在尝试从 C# 中读取以下存储过程。

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

我的班级正在尝试将stuff1Columnand读取stuff2Column为 bool 值,因为这就是属性。

编辑 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;
}

编辑 3

我有另一个存储了 tinyint(1) 值的表,MySqlDataReader 自动将其解释为布尔值。所以我相信这与它是一个存储过程以及它不是实际存储值的事实有关,可能吗?

4

1 回答 1

2

我错了,在 MySQL 中没有与 C# 的 Boolean 类型等效的类型,因此您只能使用 NUMERIC 类型并将返回的值评估为 C# 中的整数。

因此,保留 BOOLEAN 类型并修改 C# 代码以评估返回的 BOOLEAN 值(因此 0 表示 False,1 表示 True)。

于 2013-01-11T17:01:13.513 回答