0

この文字列を使用してデータベースを更新していますが、この場合は正常に機能します。Znesek_nakupa最後の行で更新します。

string sqlUpd = "UPDATE Racun SET Znesek_nakupa='10' WHERE Id_racun= (SELECT MAX(Id_racun) FROM Racun)";

しかし、10だけでなく変数を挿入しようとすると、エラーが発生します:

データ型 varchar から数値への変換中にエラーが発生しました。

コード例:

double totalPrice = 1.1;
string sqlUpd = "UPDATE Racun SET Znesek_nakupa='totalPrice' WHERE Id_racun= (SELECT MAX(Id_racun) FROM Racun)";

これどうやってするの?

4

2 に答える 2

3

この問題はSQLとは関係がなく、C#で文字列と変数を使用することと関係があります。

変数の値をC#の文字列に挿入するために、変数の名前を文字列に配置することはできません。文字列は、変数が含まれていることを「認識」していません。代わりに機能するいくつかのアプローチを次に示します。

double totalPrice = 1.1;

// string concatenation
string sqlUpd =
    "UPDATE Racun SET Znesek_nakupa='" +
    totalPrice +
    "' WHERE Id_racun= (SELECT MAX(Id_racun) FROM Racun)";

// with string.Format
string sqlUpd = string.Format(
    "UPDATE Racun SET Znesek_nakupa='{0}' WHERE Id_racun= (SELECT MAX(Id_racun) FROM Racun)",
    totalPrice);

ただし、このようにSQLクエリに変数の値を埋め込むだけのアプローチは、SQLインジェクション攻撃のリスクがあるため、ベストプラクティスとは見なされません。通常、パラメータ化されたSQLクエリを使用する必要があります。

クエリのパラメータ化されたバージョンは次のようになります(上記にリンクされているページから例を持ち上げます):

SqlConnection conn = new SqlConnection(_connectionString);
conn.Open();
string s = "UPDATE Racun SET Znesek_nakupa='@totalPrice' WHERE Id_racun= (SELECT MAX(Id_racun) FROM Racun";
SqlCommand cmd = new SqlCommand(s);
cmd.Parameters.Add("@totalPrice", totalPrice);
SqlDataReader reader = cmd.ExecuteReader();
于 2013-02-10T10:45:58.037 に答える
0

はい、分かりました。データベースに変数 totalPrice を保存しようとすると、エラーになります。C# には区切り文字としてコンマがあるためです。データベースでは、代わりにドットを送信する必要があります。したがって、コンマをドットに置き換えるだけで、完全に機能するようになりました。

したがって、コードは次のようになります。

string sqlUpd = "UPDATE Racun SET Znesek_nakupa='" + Convert.ToString(totalPrice).Replace(',', '.') + "' WHERE Id_racun= (SELECT MAX(Id_racun) FROM Racun)";
于 2013-02-10T16:08:12.800 に答える