我有一个表userdata
,其中包含以下列:
userId
userName
userEmail
userContact
userDob
userAdd
userImage
userPass
我正在使用存储过程从此表中选择数据。
现在我想用存储过程更新此表。我能够使用存储过程更新此表,但我的要求在profile.aspx
我允许用户使用存储过程更新所有列。但在其他形式中,我希望用户仅更新几列,例如在setting.aspx
页面上我允许用户仅更新userPass
列。
所以我必须制作另一个存储过程。我有很多像这样的桌子。我想知道我需要创建多少存储过程来更新具有不同列的许多表。
任何人都可以建议一个简短的方法,这样我每个表只能使用一个存储过程来更新整个表或单个列,或者使用任何c#代码来缩短它吗?
提前致谢
答案 0 :(得分:3)
您可以在MS SQL Server中使用ISNULL
功能,MSDN的以下声明对此进行了解释。
用指定的替换值替换NULL。
您可以编写一个存储过程,该过程会更新您要在各种操作中更新的所有字段。从所有页面调用相同的过程。然后从页面只传递该页面的相关参数&其余参数(与该页面无关)通过null
。
您的存储过程应该是这样的
UPDATE dbo.userTable SET
userName = ISNull(@userName, userName),
userEmail= ISNull(@userEmail, userEmail),
-- list of all your table fields goes here
WHERE userID = @userID
如果你传递参数,它会做什么;它将更新该字段的值;如果您为任何字段传递null
,它将使用其现有值更新该字段。因此,在更新操作中该字段不会受到影响。
答案 1 :(得分:0)
您可以使用具有多个if.. else..
条件的单个存储过程控制每个单个字段的更新。然后,您可以将它们作为参数传递,以控制要更新的字段。
答案 2 :(得分:0)
我认为你可以这样做: 在首页,您应设置您不想更新的字段,但将值作为参数传递给store-procedure。在store-procedure中,将这些字段的旧值设置为相应的参数,如果不相等,则更新它,否则不对这些字段执行任何操作。
答案 3 :(得分:0)
你可以使用这样的东西:
UPDATE tbl t
SET t.userName = CASE WHEN @userName IS NULL THEN t.userName ELSE @userName END
, t.userEmail = CASE WHEN @userEmail IS NULL THEN t.userEmail ELSE @userEmail END
, ...
WHERE t.userName = CASE WHEN @WHERE_userName IS NULL THEN t.userName ELSE @WHERE_userName END
AND ...
因此,如果您不想更新特定字段,只需将DBNull.Value从代码传递给该参数的过程调用。 请记住,仅当您不打算使用NULL值更新字段时,这才有效。 如果你需要空值,那么你可以重写一点代码,使其适用于空值。如果您需要进一步的帮助,请发表评论。
答案 4 :(得分:0)
获取您需要更新的Datatable中的所有数据。 使用datatable.WriteXML方法并进入 Stream 对象,所有字符串都使用XmlWriteMode.IgnoreSchema来获取数据。
DataTable dt = new DataTable();
dt.WriteXml(stream object ,XmlWriteMode.IgnoreSchema)
现在创建接受Varchar(max)参数的过程,并将 Stream 对象传递给过程。
之后,您可以使用Openxml或在Sqlserver中的XML变量中获取所有这些内容 获取@tablevariable或#temp表中的所有数据。
Openxml in sqlserver 要么 For Xml for XMl variable
然后你将获得一个表中的所有东西使用该表来更新你的 数据库表基于您的主键ID 像....
SQl qquery如下所示
Update "Database Table Name"
set .........
from "GetDatafromc#table"