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 値としてstuff1Column
andを読み込もうとしています。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 はそれをブール値として自動的に解釈します。それで、それがストアドプロシージャであり、実際に格納された値ではないという事実に関係していると思いますか?