2

テーブルからセール価格を取得してテキストボックスに入れようとしています。私のテーブルでは、販売価格は10進変数であり、もちろんテキストボックスは文字列です。これを実行すると、データアクセス層で停止する例外があります。

ここにいくつかのコードがあります:

textSellPrice.Text = DAL.Util.getSellPrice(listItemsPricing.SelectedValue.ToString());


public static String getSellPrice(string item)
{
    string sql = "SELECT Price FROM Item it INNER JOIN Customers cu 
        ON it.SalesRep = Cu.SalesRep WHERE CustomerID='" 
        + HttpContext.Current.Session["SelectedCustomer"] +
        "' AND ProductID='" + item + "'";
    string dt = AdoUtil.GetDataColumn(sql);
    return dt;
}



    public static string GetDataColumn(string sqlQuery)
    {
        string result = String.Empty;
        try
        {
            SqlCommand cmd = new SqlCommand(sqlQuery, GetACESConn());

            if (cmd.Connection.State != ConnectionState.Open)
                cmd.Connection.Open();

            SqlDataReader reader = cmd.ExecuteReader();

            if (reader.HasRows)
                while (reader.Read())
                {
                    result = reader.GetString(0);
                }


            if (cmd.Connection.State != ConnectionState.Closed)
                cmd.Connection.Close();

            return result;
        }
        catch (Exception ex)
        {

            return result;
        }
    }

それで、私が行方不明になっていることは完全に明白な何かがありますか?
これについて有益な洞察をありがとう。他のコードが役立つ可能性がある場合は、それを提供できます。ありがとうございました

4

2 に答える 2

7

おそらく小数である価格を選択しています。したがって、呼び出さないでください。呼び出しreader.GetString(0)て、結果を変数reader.GetDecimal(0)に格納します。本当にすべてを文字列に変換したいdecimal場合は、を呼び出すだけです。GetValue(0).ToString()

あなたがそこにいる間に、これを修正してください:

string sql = "SELECT Price FROM Item it INNER JOIN Customers cu ON it.SalesRep = Cu.SalesRep WHERE CustomerID='" + HttpContext.Current.Session["SelectedCustomer"] +
    "' AND ProductID='" + item + "'";

これは、 SQLインジェクション攻撃を懇願しているだけです。このようにSQLに直接値を入れないでください。代わりに、パラメーター化されたSQLを使用して、それらのパラメーターの値を指定してください。例についてはを参照SqlCommand.Parametersしてください。

次に、キャッチしないExceptionでください。また、例外がスローされたときに、何も起こらなかったかのように値を返さないでください...理由もなくエラーをマスクすることになります。

于 2012-06-26T21:57:07.263 に答える
3

CustomerIdデータベースで数値型として宣言されていますが、文字列として読み取ろうとしています。結果を文字列にする必要がある場合は、次のいずれかを実行できます。

  • 数値型(たとえば、decimal)として読み取り、C#で文字列に変換するか、または
  • varcharSQLを変更してRDBMS側にキャストします

ちなみに、 Bobby Tablesを避けるために、パラメータ値をクエリに焼き付けないでください。代わりに、パラメータ化されたクエリを使用する必要があります。

于 2012-06-26T21:58:52.460 に答える