6

なぜこれが機能するのでしょうか

int collectionCharge = (int)cmdCheck.ExecuteScalar();

しかし、これは例外を生成します

double collectionCharge = (double)cmdCheck.ExecuteScalar();

System.InvalidCastException: 指定されたキャストは無効です。

なぜ有効ではないのでしょうか。

編集 私は、貨物の価格を取得するクエリから単一の結果を返そうとしています。したがって、小数が必要なため、これをに変換できません。intしたがって、にキャストしようとしていdoubleます。私はまだasp.netを学んでいるので、これを達成するためのより良い方法があれば、正しい方向に向けてください:)

EDIT 2 SQLで完全なコード...

using (SqlCommand cmdCheck = new SqlCommand("SELECT FREIGHT_PRICE FROM FREIGHT_QUOTER_BELNL_NEW WHERE CUSTOMER_NO = @CUSTOMER_NO AND COUNTRY = @COUNTRY AND ROUND(WEIGHT_FROM,0) < @WEIGHT AND ROUND(WEIGHT_TO,0) >= @WEIGHT AND SHIPVIA = '48';", connection))
                {
                    double collectionCharge = (double)cmdCheck.ExecuteScalar();
                    FreightAmount = collectionCharge;
                }
4

5 に答える 5

10

ここでの問題は、にボックス化された をExecuteScalar返すことです。に変換するには、まず箱から取り出してから に変換する必要がありますintobjectdoubleintdouble

double collectionCharge = (double)(int)cmdCheck.ExecuteScalar();
于 2013-03-15T15:08:20.453 に答える
6

Convert.ToXXX を使用して、無効なキャスト例外を回避します。

IE

collectionCharge=Convert.ToDouble(cmdCheck.ExecuteScalar());

ExecuteScalar がオブジェクトを返すように見えるので、コードは次のようになります。

double collectionCharge = (double)cmdCheck.ExecuteScalar();

まだ失敗する可能性があります

于 2013-07-19T07:20:06.850 に答える
2

@DJKRAZE に感謝します。

SELECT CASE(FREIGHT_PRICE AS FLOAT)(ダブル)キャストで動作するクエリを更新しました。

double collectionCharge = (double)cmdCheck.ExecuteScalar();
于 2013-03-15T15:38:56.977 に答える
0

すべての回答を読んだ後、実際に Decimal 値を受け取るケースがありましたが、解決策は簡単でした! 関数を文字列として宣言し、Decimal 値を文字列として受け取りました!

public static string Sals_AccountExpensesGetSums(int accountID)

{

SqlParameterHelper sph = new 
SqlParameterHelper(ConnectionString.GetWriteConnectionString(), 
"sals_AccountExpenses_GetAllSums", 1);

sph.DefineSqlParameter("@AccountID", SqlDbType.Int, ParameterDirection.Input, accountID);


string res = sph.ExecuteScalar().ToString();

return res;
}

ビジネスレイヤーで結果を2倍に変更しました!

public static decimal GetAccountExpensesSums(int accountId)
{
string res = "";
decimal sums = 0;

res = DBAccount.Sals_AccountExpensesGetSums(accountId);

// check so we will not have exception 
if ( res != "")
sums = Convert.ToDecimal(res);

return sums;

}

結果は必要に応じて完璧でした: 889678.70

于 2019-10-17T12:22:11.640 に答える
-1

このコードを使用することをお勧めします:

object o = c.ExecuteScalar();
     if (o != null)
     {
         int x = Int32.Parse(o.ToString());      
     }

これは 2 つのことを行います。最初に、c.ExecuteScalar() がnullを返さないことを確認します。その場合、キャストしようとすると問題が発生します。

2 つ目は、クエリから読み取るときにほとんどすべてのケースに適用できるため、キャストがはるかに簡単になります。

オブジェクトは文字列になります。文字列として使用する場合は、これで完了です。ブール値にしたい場合は、その文字列かどうかを確認してください。Equals("true") int にしInt32.Parse(string); たい場合は、long にしたい場合は、Int64.Parse(string);

基本的に、オーバーロード/明示的な変換を完全に理解する必要はありません。

于 2015-09-23T10:25:51.827 に答える