2

我有一个userdata包含这些列的表:

userId
userName
userEmail
userContact
userDob
userAdd
userImage
userPass

我正在使用存储过程从该表中选择数据。

现在我想用一个存储过程更新这个表。我可以使用存储过程更新此表,但我的要求是profile.aspx允许用户使用存储过程更新所有列。但在其他形式中,我希望用户只更新几列,例如在setting.aspx页面上我允许用户只更新userPass列。

所以我必须制作另一个存储过程。我有很多这样的桌子。而且我想知道我必须创建多少存储过程来更新具有不同列的许多表。

任何人都可以建议一种简短的方法,以便我可以使用每个表只使用一个存储过程来更新整个表或单个列,或者任何 c# 代码来缩短它?

提前致谢

4

5 回答 5

4

您可以ISNULL在 MS SQL Server 中使用该功能,MSDN 的以下语句对此进行了解释。

用指定的替换值替换 NULL。

您可以编写一个存储过程,在各种操作中更新您要更新的所有字段。从所有页面调用相同的过程。然后从一个页面只传递该页面的相关参数和其余参数(与该页面无关) pass 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任何字段,它将使用其现有值更新该字段。这样该字段在更新操作中不会受到影响。

于 2013-04-01T07:20:52.420 回答
0

您可以使用具有多个if.. else..条件的单个存储过程来控制每个字段的更新。然后您可以将它们作为参数传递以控制要更新的字段。

于 2013-04-01T07:10:17.560 回答
0

我认为您可以这样做:在首页,您应该将不想更新的字段设置为不可编辑,但将值作为参数传递给存储过程。在存储过程中,您将这些字段的旧值设置为对应的参数,如果不相等,则更新它,否则,对这些字段不做任何事情。

于 2013-04-01T07:18:48.230 回答
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 值更新字段时才有效。如果您需要空值,则可以重写一点代码以使其与空值一起使用。如果您需要进一步的帮助,请发表评论。

于 2013-04-01T07:24:22.133 回答
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 表中获取所有数据。

sqlserver中的 Openxml 或 用于 XML 变量的 XML

然后你会得到一个表中的所有东西,使用该表根据你的主键 ID 更新你的数据库表,比如....

SQL qquery 如下所示

Update "Database Table Name"
set .........
from "GetDatafromc#table"
于 2013-04-01T07:48:49.653 回答