次の定義を持つ SQLite テーブルがあります。
create table routes(id INTEGER PRIMARY KEY AUTOINCREMENT, name string)
System.Data.SQLiteを使用してレコードを取得したい場合:
cmdRoute.CommandText = "SELECT id, name FROM routes";
using (var rdrRoute = cmdRoute.ExecuteReader())
{
if(rdrRoute.Read())
{
var route = new Route();
route.Id = rdrRoute.GetInt32(0);
route.Name = rdrRoute.GetString(1); // Throws InvalidCastException
}
}
データベースの値が数値の場合、GetString は InvalidCastException をスローします。をウォッチに入れるrdrRoute.GetValue(1)
と、タイプが「オブジェクト{string}」であることがわかります。値を数値以外の値に変更すると、正常に機能します。
SQLite DataReader コードを調べたところ、 SQLiteが値をチェックして、許可された型のセットにマップしているようです。
これは意図された動作ですか?数値を含む文字列が文字列のままになるように、これを防ぐにはどうすればよいですか?