我有一張桌子,里面有一些列,比如
現在我想用一個for回圈來設定
out_0 = 0,
out_1 = 1,
out_2 = 2,
out_3 = 3,
out_4 = 4
所以我用這樣的代碼更新它
string sql = "update exchange_out set @column = @id where member_id = 6;";
SqlCommand cmd = new SqlCommand(sql, connet);
cmd.Parameters.Add("@column", SqlDbType.NVarChar);
cmd.Parameters.Add("@id", SqlDbType.Int);
int n = 0;
for (int i = 0; i < 5; i )
{
cmd.Parameters["@column"].Value = "out_" i;
cmd.Parameters["@gid"].Value = i;
n = cmd.ExecuteNonQuery();
MessageBox.Show("" n);
}
但是它沒有將任何資料寫入表中,而實際上它進行了五次更新,因為訊息框五次回傳“1”。
最后我解決了這個問題
for (int i = 0; i < 5; i ){
sql = string.Format("update exchange_out set {0} = {1} where member_id = 6", "out_" i, i);
}
但我仍然想知道為什么它不能通過添加引數來作業?
任何回應將不勝感激。:)
uj5u.com熱心網友回復:
我仍然想知道為什么它不能通過添加引數來作業?
表名、列名等識別符號不能用這種方式引數化,只能引數化資料。您的嘗試有效地運行如下查詢:
update exchange_out set 'out_1' = 1 where member_id = 6;
在任何編程語言中都是一樣的:
var data1 = "hello";
var whichData = "1";
Console.WriteLine(data whichData); //it doesn't compile; you cannot programmatically build a variable name `data1` in this way
您找到的方法是合理的唯一方法,但您仍應引數化資料:
using var cmd = new SqlCommand(sql, connet);
cmd.Parameters.Add("@data", SqlDbType.NVarChar);
cmd.Parameters.Add("@id", SqlDbType.Int);
for (int i = 0; i < 5; i ){
sql = string.Format("update exchange_out set out_{0} = @data where member_id = @id", i);
cmd.CommandText = sql;
cmd.Parameters["@data"].Value = ...
cmd.Parameters["@id].Value = 6;
...
您還可以從 SQL 存根開始,"UPDATE t SET "并反復連接識別符號和引數:
using var cmd = new SqlCommand(sql, connet);
cmd.Parameters.Add("@data", SqlDbType.NVarChar);
cmd.Parameters.Add("@id", SqlDbType.Int);
var sql = "UPDATE exchange_out SET ";
for (int i = 0; i < 5; i ){
sql = string.Format("out_{0} = @data{0},", i);
cmd.Parameters["@data" i].Value = ...
}
sql = sql.TrimEnd(',');
sql = " where member_id = @id";
cmd.Parameters["@id"].Value = 6;
cmd.CommandText = sql;
...
這在一個操作中進行更新,運行如下查詢UPDATE t SET out_1 = @data1, out_2 = @data2 ...
這些對于 SQL 注入是安全的,因為您的代碼控制了整個 SQL;在這種情況下'; DROP TABLE Students;--,用戶沒有任何能力提供{0}進入識別符號,但請注意不要安排它成為可能(不要讓用戶提供識別符號文本)..
在這種情況下,通過插入您控制的整數而不是您不控制的字串,您的非引數嘗試也可以避免 SQL 注入,但請注意,您不會普遍應用該技術,并且有一天會包含用戶提供的字串. 如果您確實發現自己適合您,您應該使用用戶輸入白名單之類的東西 - 用戶提供的任何未列入白名單的字串識別符號都不應放入 SQL
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/478955.html
上一篇:使用另一列分組時按月滾動季度計算
