我不確定這個問題是否已經有關于 SO 的答案,但由于我找不到答案,所以我在這里寫。我正在嘗試使用 CASE 陳述句撰寫更新查詢。的值WHEN和THEN來自哪里,我需要與多個值更新多行用戶給用戶給出的資料。我正在消除我在下面代碼段中的原始代碼中撰寫的回圈,因為問題僅在于AddWithValue. 有沒有辦法SqlParameterCollection用來分配THEN價值?或者一個簡單的字串連接是一種方法嗎?
SqlCommand command = new SqlCommand("UPDATE [Table] SET Column = CASE ", connection);
command.CommandText = "WHEN Column = @Column1 THEN @Column2";
command.CommandText = "ELSE Column END";
command.Parameters.AddWithValue("@Column1", "Value1");
command.Parameters.AddWithValue("@Column2", "Value2");
connection.Open();
command.ExecuteNonQuery();
錯誤:
'@Column2' 附近的語法不正確
uj5u.com熱心網友回復:
只是想注意,如果您使用逐字字串,則可能也不會發生此語法錯誤:
new SqlCommand(@"
UPDATE [Table]
SET
Column = CASE
WHEN Column = @Column1 THEN @Column2
ELSE Column
END"
, connection);
我傾向于堅持所有的 sql,所以它從縮進級別 0 開始,并且使用 @ 字串意味著它可以按照我喜歡的方式格式化 sql,而不需要任何臨時的 c# 使它變得混亂。
如果您正在構建可變數量的案例,字串插值也可能會整理內容,并且您可以通過前綴插入 @ 字串$@- 我記得他們通過“微軟有禮貌并且不想填寫人們的代碼”與@$(屁股)“;)
var whens = "WHEN...";
for(...){
whens = ...
parameters.Add(..)
}
new SqlCommand($@"
UPDATE [Table]
SET
Column = CASE
{whens}
ELSE Column
END
", connection);
當然還有最后的除錯技巧;如果您動態構建 sql 并遇到語法錯誤,請在除錯器中暫停并在運行之前查看命令文本;指向 Command 變數,打開工具提示,單擊 CommandText 屬性旁邊的放大鏡,以在記事本樣式視窗中查看字串,新行等是實際的新行,而不是除錯工具提示顯示的 \n - 它是在這個可視化工具中更容易發現語法錯誤

圖片由https://gunnarpeipman.com/ef-core-toquerystring/amp/ 提供
uj5u.com熱心網友回復:
所以最后都是關于@marc_s 和@serg 在評論中提到的語法錯誤。這有效:
SqlCommand command = new SqlCommand("UPDATE [Table] SET Column = CASE ", connection);
command.CommandText = "WHEN Column = @Column1 THEN @Column2 ";
command.CommandText = "ELSE Column END";
command.Parameters.AddWithValue("@Column1", "Value1");
command.Parameters.AddWithValue("@Column2", "Value2");
connection.Open();
command.ExecuteNonQuery();
uj5u.com熱心網友回復:
嘗試以下 SQL Server 代碼:
SqlCommand command = new SqlCommand();
command.Connection = connection;
command.Parameters.AddWithValue("@Column1", "Value1");
command.Parameters.AddWithValue("@Column2", "Value2");
String StrSqlCommand = "UPDATE [Table] SET Column = CASE ";
StrSqlCommand = " WHEN Column = @Column1 THEN @Column2 ";
StrSqlCommand = " ELSE Column END ";
command.CommandText = StrSqlCommand;
connection.Open();
command.ExecuteNonQuery();
還要注意術語“Value1”和“Value2”。因為在你發送的代碼中,上面的值被認為和字串型別完全一樣。如果您想要另一個值,最好定義一個變數并將其作為引數放在上述運算式中。像這樣的東西:
String strValue1 = "Name1";
String steValue2 = "Name2";
SqlCommand command = new SqlCommand();
command.Connection = connection;
command.Parameters.AddWithValue("@Column1", strValue1);
command.Parameters.AddWithValue("@Column2", strValue2);
String StrSqlCommand = "UPDATE [Table] SET Column = CASE ";
StrSqlCommand = " WHEN Column = @Column1 THEN @Column2 ";
StrSqlCommand = " ELSE Column END ";
command.CommandText = StrSqlCommand;
connection.Open();
command.ExecuteNonQuery();
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/406574.html
標籤:
下一篇:遞回演算法的解決方案
