我在C#中构建编辑菜单以编辑数据库中的SQL行,但我希望用户能够选择要更新的特定行中的哪一列,如果他们将框保留为空则更新我不想更新柱。例如
用户看到三个框,他可以在一个框中输入内容,这反映出只更新行中的一列,其余列将保持不变。我开始实现类似这样的东西
string RowUpdate ="";
if(Title !="" && Author =="" && Pages==""){
RowUpdate = "Update BookTable set Title=@Title where BookID=@ID";
}
else if (Title =="" && Author !="" && Pages ==""){
RowUpdate = "Update BookTable set Author=@Author where BookID=@ID";
}
当逻辑完成时,将选择正确的SQL, 正如您所看到的,只有3个文本框的这种逻辑类型会产生9种不同的结果,并且随着编辑行的增长,它会呈指数级增长。
我不知道这是否可能,但如果没有输入值,是否有办法更新唯一的列,所以我不必编写巨大的逻辑来更新特定的列?
类似
RowUpdate = "Update BookTable set (IF null Skip Title=@Title),(If null Skip Author=@Author), (If null Skip Pages=@Pages) where BookID=@ID
或其他任何方式更简单,更快捷? 谢谢你的答案
答案 0 :(得分:0)
这不是最佳解决方案,但希望它能满足您的需求。它将根据可用值创建查询。
string rowUpdate = "UPDATE BookTable SET ";
if(Table != "")
rowUpdate += "Table=@table ";
if(Author != "")
rowUpdate += "Author=@author ";
.
.
rowUpdate += "WHERE BookID=@ID ";
答案 1 :(得分:0)
如果不选择更新属性,是否可以将属性默认为旧值?这将允许您对所有属性执行完整行更新,并且它只会真正更改更新的属性,同时将未编辑的属性设置为与之前相同的值。
答案 2 :(得分:0)
因此,您可以在SQL中使用COALESCE和NULLIF的组合来编写单个UPDATE语句。
首先,让我们创建一个临时表来玩:
CREATE TABLE #mybooktable
(
BookID int not null IDENTITY(1,1),
Title nvarchar(50),
Author nvarchar(100),
Pages int
)
GO
INSERT #mybooktable (Title, Author, Pages) VALUES ('ABC','Mary B.',10)
INSERT #mybooktable (Title, Author, Pages) VALUES ('DEF','John D.',20)
GO
SELECT * FROM #mybooktable
GO
这是查询。 COALESCE将选择第一个非空值。 NULLIF将强制空字符串返回null。
-- variables
DECLARE @bookId int, @title nvarchar(50), @author nvarchar(100), @pages int
-- Some test parameters. Going to only change the title here
SELECT @bookId = 1, @title = 'ABC'
UPDATE #mybooktable SET
Title = COALESCE(NULLIF(@title,''), Title),
Author = COALESCE(NULLIF(@author,''), Author),
Pages = COALESCE(CASE WHEN @pages <= 0 THEN NULL ELSE @pages END, Pages)
WHERE BookID = @bookId
-- check
SELECT * FROM #mybooktable
运行此块并弄乱测试参数。只有您定义的参数才会更改。