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

それがプロパティであるため、私のクラスはbool 値としてstuff1Columnandを読み込もうとしています。stuff2Column

編集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#のブール型に相当するものがないため、NUMERIC型のみを使用して、C#では戻り値を整数として評価できます。

したがって、BOOLEANタイプを保持し、C#コードを変更して、返されたBOOLEAN値を評価します(つまり、Falseの場合は0、Trueの場合は1)。

于 2013-01-11T17:01:13.513 に答える