0

通常、「指定されたキャストは無効です」というエラーは簡単に解決できます。しかし、これは私の頭を悩ませています。

アプリケーションにSQL compactデータベースが統合されていC#ます。現時点では、現在のデータベース構造を取得してデータテーブルに入れています。使用しているSQLコマンドは次のとおりです。

select * from information_schema.columns

列の 1 つが でNUMERIC_PRECISION、これは数値です。

この情報を整数変数に保存しようとしましたが、指定されたキャストが無効であることがわかりました。コードは次のとおりです。

int precision;
if (row["NUMERIC_PRECISION"] != DBNull.Value)
    precision = (int)row["NUMERIC_PRECISION"];

私の質問は、なぜこの操作が無効なのですか? セルは数値であり、整数にキャストしようとしています - 理論的にはこれはうまくいくはずですか?

4

5 に答える 5

2

値がnullになる可能性があると言ったので、実際にはnull許容整数を使用して値を格納します.

int? precision = null;

if(row["NUMERIC_PRECISION"] != DBNull.Value) //or whatever you want to do to make sure it actually has a value
{
    //I usually use Convert.ToInt32 since its easier, but it is also more sensative
    precision = Convert.ToInt32(row["NUMERIC_PRECISION"]);
}

このConvertクラスは使いやすく、目に見えて非常に理にかなっていますが、null または不適切にフォーマットされた値に非常に敏感であり、見つかったときに例外をスローします。

于 2013-03-20T12:54:44.530 に答える
1

row["NUMERIC_PRECISION"] は、数値型がボックス化されたオブジェクトを返します。このボックス化されたオブジェクトの正確なタイプにのみキャストできます。

最初に (decimal) または (long) にキャストしてから、(int) にキャストしてみてください。

行 ["NUMERIC_PRECISION"] のタイプは、デバッガー ウォッチを使用して確認できます。

Convert クラスに変換を処理するように依頼することもできます。

precision = Convert.ToInt32(row["NUMERIC_PRECISION"]);
于 2013-03-20T12:45:31.650 に答える
0

int への単純なキャストの代わりに int.parse を使用してみてください - http://msdn.microsoft.com/en-us/library/system.int32.parse.aspx

于 2013-03-20T12:45:45.230 に答える
0

ベスト プラクティスは次のとおりです。int.Parse(string s)

precision= Convert.ToInt32(row["NUMERIC_PRECISION"]);
于 2013-03-20T12:49:15.310 に答える
0

[編集] 文字列だと言いましたが、解析する必要があります。

試す:precision = int.Parse((string)row["NUMERIC_PRECISION"]);

正しい形式でない場合は例外がスローされるため、例外をキャッチする準備をするか、int.TryParse()のオーバーロードを使用してその有効性を確認する必要があります。

[編集2]

データは文字列ではないようです。Int16 です。だからこれをしてください:

precision = (Int16)row["NUMERIC_PRECISION"];

于 2013-03-20T12:45:30.277 に答える