2

負の小数に問題があります。

price私が定義したSQL Serverデータベースでdecimal(8,2) NULL

そして私がC#で使用しているコード:

string query = string.Format("INSERT INTO ticket_elements " +
                             "(ticket_id, product_name, price, tax, amount) " +
                             VALUES ({0}, '{1}', '{2}', '{3}', '{4}'); SELECT SCOPE_IDENTITY();",
                                 ticket_id, pro2.ProductName, tPrice, tax, fixedAmountStr);

価格も負の値ではない場合{2}、問題なく動作しますが、価格を次のように設定すると、次の-0.25エラーが発生します。

数値データ型の varchar を変換する際の算術オーバーフロー。

db で負の値を使用するにはどうすればよいですか?

アップデート:

ただし、次のコードは負または正の値で正常に機能します。

私は本当に混乱しています。

string query = string.Format("INSERT INTO tickets " +
                             "(registration_date, cancellation, cancellation_date,    total_products, total_gross_price, total_net_price, pay_type, user_id, client_id)" +
                             " VALUES ('{0}', '{1}', '{2}', '{3}', '{4}',  '{5}', '{6}', {7}, {8});" +
                             " SELECT SCOPE_IDENTITY();", regData, "False", "", this.TotalProducts, totalGrossPrice, totalNetPrice, this.PayType, this.CashierId,  this.ClientId);
4

2 に答える 2

2

代わりにパラメーター化されたクエリを使用してください。インジェクション攻撃からあなたを救い、ハードコーディングされた値で直接 SQL を渡すよりも実際には高速です (サーバーはコンパイルされたパラメーター化されたクエリをキャッシュし、値のみを送信できるため)。これはあなたがそれを行う方法です:

string query = "INSERT INTO ticket_elements " +
"(ticket_id, product_name, price, tax, amount) " +
"VALUES (@ticket_id, @product_name, @price, @tax, @amount);" + 
"SELECT SCOPE_IDENTITY();",
// Instantiate SqlCommand object with above query.
sqlCommand.Parameters.Add("@ticket_id", ticket_id);
sqlCommand.Parameters.Add("@product_name", pro2.ProductName);
sqlCommand.Parameters.Add("@price", tPrice);
sqlCommand.Parameters.Add("@tax", tax);
sqlCommand.Parameters.Add("@amount", fixedAmountStr);

文字列を渡す場合、DB 側で変換を実行する必要があり、変換できない場合は失敗する可能性があることに注意してください。より良い方法は、厳密に型指定された値を取得し (つまり、金額を解析して有効であることを確認します)、それらの値をパラメーターに渡すことです。

于 2012-07-26T16:52:07.427 に答える