1

クラス「Checkout」に、SQLステートメントを実行してレコードをテーブルに挿入し、scope_identityを選択して、そのレコードのIDを取得する関数があります。IDをintとして返し、Webページの変数に割り当てます。

int OrderID = Checkout.WriteOrder_tblOrders(CustID);

関数は次のとおりです。

public static int WriteOrder_tblOrders(int CustID)
{
    // OrderID is initially 0, then changed when scope_identity is called in the sql statement.
    int OrderID = 0;
    DateTime OrderDate = DateTime.Now;
    string sql = "INSERT INTO tblOrders (OrderDate, CustID) VALUES (@OrderDate, @CustID); SELECT scope_identity();";

    using (SqlConnection myConnection = new SqlConnection(connectString))
    {
        using (SqlCommand cmd = new SqlCommand(sql, myConnection))
        {
            cmd.Parameters.AddWithValue("@CustID", CustID);
            cmd.Parameters.AddWithValue("@OrderDate", OrderDate);
            myConnection.Open();
            OrderID = (int)cmd.ExecuteScalar();
            myConnection.Close();
        }
    }
    return OrderID;
}

デバッガーは、関数に問題がないことを示しており、新しいレコードがそのテーブルに正しく表示されていますが、

「無効なキャスト」

OrderIDを割り当てる最初の行のエラー。私はこれを試しました:

int OrderID = (int)Checkout.WriteOrder_tblOrders(CustID);

intとInt32の両方で、Convert.ToInt32を使用してみましたが、どちらも機能しませんでした。私はここで何が間違っているのですか?

4

2 に答える 2

3

理由は、null値を取得している可能性があります。
したがって、次のように拡張メソッドを作成できます

public static T ExecuteNullableScalar<T>(this SqlCommand cmd) where T : struct
{
    var result = cmd.ExecuteScalar();
    if (result == DBNull.Value) return default(T);
    return (T)result;
}

使用法は次のようになります。

int value = cmd.ExecuteNullableScalar<int>();
//new approach
ulong value=cmd.ExecuteNullableScalar<ulong>();

そうでなければ

 myConnection.Open();
 var o = cmd.ExecuteScalar();
 OrderID = (o== DBNull.Value ? 0 :  Convert.ToUInt64(o));
 myConnection.Close();

かわった

OrderID = (o== DBNull.Value ? 0 :  Convert.ToUInt64(o));
于 2013-03-19T06:26:08.200 に答える
1

助けてくれてありがとう、scope_identityが小数を返すことに気づかなかった。私は次のようにコードを変更しました:

OrderID = Convert.ToInt32((decimal)cmd.ExecuteScalar());

これで正常に動作します。ありがとう!

于 2013-03-19T06:53:18.507 に答える