仅在选定列

时间:2016-08-02 22:10:23

标签: c# sql

我在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

或其他任何方式更简单,更快捷? 谢谢你的答案

3 个答案:

答案 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中使用COALESCENULLIF的组合来编写单个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

运行此块并弄乱测试参数。只有您定义的参数才会更改。

  • 我在页面中插入了一个CASE语句,因为我假设您已将其转换为int。
  • 您需要TRIM()字符串以删除空格