3

selectステートメントの結果をC#変数に保存しようとしていますが、このエラーが発生します

「指定されたキャストは無効です」

私がそれを実行するとき。解決方法がわかりません。助けてください

SqlConnection con1 = new SqlConnection(ConfigurationManager.ConnectionStrings["MyConnectionString"].ConnectionString);

        SqlCommand cmd1 = new SqlCommand("select cast(round(sum(CAST(AvgNumbers AS numeric(12,2))),2) as decimal(12,2)) AS [Average Days] from MainTable ", con1);

        cmd1.Connection = con1;
        con1.Open();
        Int32 result = (Int32)cmd1.ExecuteScalar();
        con1.Close();
4

4 に答える 4

5

cmd1.ExecuteScalar()ボックス化された整数を返していません。それをオブジェクトに割り当て、デバッガーでそれを見て、それが実際に何であるかを確認します。

10進数または2進数が返されると思いますが、次のことを行う必要があります。

Int32 result = (Int32)(double)cmd1.ExecuteScalar();

または:

Int32 result = (Int32)(Decimal)cmd1.ExecuteScalar();

[以下のコメントの質問に答えて編集]

10進値を保持するには、次のようにします。

Decimal result = (Decimal) cmd1.ExecuteScalar();

必要に応じて、小数をdoubleにキャストできます。

double result = (double)(Decimal) cmd1.ExectuteScalar();
于 2013-02-18T19:57:56.740 に答える
1

結果はInt32明らかにないので、それを使用できます。

var result = cmd1.ExecuteScalar();

その後、それがどのタイプであるかを確認できます。または使用します。

object result = cmd1.ExecuteScalar();

多分あなたはそれをキャストすることができますより。覚えておいてください、デバッガーで簡単に見ることができます。

于 2013-02-18T20:01:13.470 に答える
1

結果はInt32、基本的にではありません。あなたはそれをキャストしているDecimal(12, 2)ので、なぜあなたがそれを期待するのかわかりません。

私の推測では、それはadoubleまたはdecimal-のいずれかになりますが、呼び出しをキャストから分離してデバッガーを見ると、明らかなはずです。

object result = cmd1.ExecuteScalar();
// Now look at the type of the value of result
于 2013-02-18T19:59:18.940 に答える
0

SQLでは値を小数としてキャストしているので、c#コードでは小数としてキャストしてみてください。

于 2013-02-18T19:58:43.163 に答える