4

次の定義を持つ 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が値をチェックして、許可された型のセットにマップしているようです。

これは意図された動作ですか?数値を含む文字列が文字列のままになるように、これを防ぐにはどうすればよいですか?

4

1 に答える 1

4

for the SqlDataReader.GetString Method, No conversions are performed; therefore, the data retrieved must already be a string.

Call IsDBNull to check for null values before calling this method.

コードをこれに変更すると、動作するはずです

cmdRoute.CommandText = "SELECT id, name FROM routes";
using (var rdrRoute = cmdRoute.ExecuteReader())
{
    if(rdrRoute.Read())
    {
        var route = new Route();
        route.Id  = rdrRoute["id"];
        if (!rdrRoute.IsDBNull(rdrRoute.GetOrdinal("name")))
        {
           route.Name = rdrRoute["name"].ToString();
           //route.Name = rdrRoute.GetString(rdrRount.GetOrdinal("name"));
           //may not work in .Net 4.0
        }
    }
}

.NET 4.0 GetString() は、.NET 4.0 でエラー/バグを引き起こす可能性があります。プロジェクトをバージョン 3.5 にロールバックするか、コード サンプルを使用するプロジェクトを作成して、.NET 3.5 として作成しますGetString()。 .net 4.0 にはいくつかのバグがあり、KB 修正プログラムがいつリリースされるかわかりません

于 2013-01-31T14:10:55.260 に答える