問題

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

 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を取得し続け、理由はわかりません。誰か助けてくれますか?

  ベストアンサー

まず、パラメータを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();
 

...デバッガを見てください。また、データベース内のフィールドのタイプを見てください。これは、実際に何を期待するかを教えてください。 2つの間のマッピングの SqlDbType 列挙を見てください。

  同じタグがついた質問を見る

c#sqlwinforms