9

商品名で商品価格を取得しようとしています。以下は私が使用している関数です。

public int GetProductPrice(string ProductName)
{
    cnn.Open();
    SqlCommand cmd = new SqlCommand("SELECT ProductPrice FROM Products WHERE ProductName ='" + ProductName + "'", cnn);
    int price = (int)cmd.ExecuteScalar();
    return price;
}

今、私はこのエラーを受け取り続けていますSpecified cast is not valid、そして私は理由がわかりません。誰かが私を助けることができますか?

4

1 に答える 1

12

まず、パラメーターをSQLに直接配置するのではなく、パラメーター化されたSQLを使用する必要があります。また、完了したら、usingステートメントを使用してコマンド(および接続)を閉じる必要があります。SqlConnectionああ、そして操作ごとに新しいものを作成します。だから次のようなもの:

public int GetProductPrice(string productName)
{
    // Quite possibly extract the connection creation into a separate method
    // to call here.
    using (var conn = new SqlConnection(...))
    {
        conn.Open();
        using (var command = new SqlCommand(
            "SELECT ProductPrice FROM Products WHERE ProductName = @ProductName",
            conn))
        {
            command.AddParameter("@ProductName", SqlDbType.VarChar)
                   .Value = productName;
            object price = command.ExecuteScalar();
            // And you'd do the casting here
        }
    }
}

ProductPrice次に、フィールドのタイプがわかりません。返品されている可能性があります。longまたは、おそらくそれdecimalです。見つける最も簡単な方法は、次を使用することです。

object tmp = cmd.ExecuteScalar();

...そしてデバッガーを調べます。また、データベース内のフィールドのタイプも確認してください。これにより、実際に何が期待できるかがわかります。SqlDbType2つの間のマッピングの列挙を見てください。

于 2013-03-22T18:35:49.457 に答える