【问题标题】:How to write update query to update two tables with SQL Data Source?如何编写更新查询以使用 SQL 数据源更新两个表?
【发布时间】:2011-04-22 11:18:27
【问题描述】:

是否可以使用 SQL 数据源和 ASP.NET 网格视图更新两个表?对于 Select 语句,我有以下 SQL 查询。

SELECT 
   tbl_user_login.ID, tbl_user_login.UserID, 
   tbl_user_login.Pass, tbl_user_login.Enabled, 
   tbl_user_login.Permission, tbl_user_login.Rank, 
   tbl_user_profile.ID AS Expr1, tbl_user_profile.FName,
   tbl_user_profile.LName, tbl_user_profile.Phone, 
   tbl_user_profile.Email1, tbl_user_profile.Email2 
FROM 
   tbl_user_login 
INNER JOIN 
   tbl_user_profile ON tbl_user_login.ID = tbl_user_profile.ID

但我不知道如何在 SQL 数据源中编写更新和删除语句

更新

所以我写了存储过程。

CREATE PROCEDURE UpdateTwoTable 
(
    @ID int, 
    @UserID varchar(10), 
    @Pass varchar(50), 
    @Enabled int, 
    @Permission int,
    @Rank int,
    @FName varchar(50),
    @LName varchar(50),
    @Phone varchar(50),
    @Email1 varchar(50),
    @Email2 varchar(50)
) AS

BEGIN TRANSACTION

UPDATE tbl_user_login SET UserID = @UserID, Pass = @Pass, Enabled = @Enabled, Permission = @Permission, Rank = @Rank WHERE ID = @ID

IF @@ERROR <> 0
BEGIN
    ROLLBACK
    RETURN
END

UPDATE tbl_user_profile SET FName = @FName, LName = @LName, Phone = @Phone, Email1 = @Email1, Email2 = @Email2 WHERE ID = @ID

IF @@ERROR <> 0
BEGIN
    ROLLBACK
    RETURN
END

COMMIT

但我得到了Procedure or function UpdateTwoTable has too many arguments specified.

更新

我按照本指南进行操作,现在问题已解决。感谢所有帮助过的人!

http://www.whitworth.org/2006/01/16/how-to-troubleshoot-procedure-or-function-has-too-many-arguments-specified-in-aspnet-20/

下面是我的 SQL 数据源。

<asp:SqlDataSource ID="SqlDataSource1" runat="server" 
        ConnectionString="<%$ ConnectionStrings:DBConnString %>" 
        SelectCommand="SELECT tbl_user_login.ID, tbl_user_login.UserID, tbl_user_login.Pass, tbl_user_login.Enabled, tbl_user_login.Permission, tbl_user_login.Rank, tbl_user_profile.ID AS Expr1, tbl_user_profile.FName,
tbl_user_profile.LName, tbl_user_profile.Phone, tbl_user_profile.Email1, tbl_user_profile.Email2 FROM tbl_user_login INNER JOIN tbl_user_profile ON tbl_user_login.ID = tbl_user_profile.ID" 
        UpdateCommand="UpdateTwoTable" UpdateCommandType="StoredProcedure"
        OldValuesParameterFormatString="Original_{0}">
        <UpdateParameters>
            <asp:Parameter Name="ID" />
            <asp:Parameter Name="UserID"/>
            <asp:Parameter Name="Pass"/>
            <asp:Parameter Name="Enabled"/>
            <asp:Parameter Name="Permission"/>
            <asp:Parameter Name="Rank"/>
            <asp:Parameter Name="FName"/>
            <asp:Parameter Name="LName"/>
            <asp:Parameter Name="Phone"/>
            <asp:Parameter Name="Email1"/>
            <asp:Parameter Name="Email2"/>
        </UpdateParameters>        
    </asp:SqlDataSource>

【问题讨论】:

标签: sql sql-server tsql sql-update


【解决方案1】:

是的,这是可能的。以下是如何以安全的方式进行操作:

CREATE PROCEDURE UpdateUser (@ID int, @Pass varchar(15), @Email varchar(75)) AS

BEGIN TRANSACTION

    UPDATE tbl_user_login SET Pass = @Pass WHERE ID = @ID

    IF @@ERROR <> 0
    BEGIN
        ROLLBACK
        RETURN
    END

    UPDATE tbl_user_profile SET Email1 = @Email WHERE ID = @ID

    IF @@ERROR <> 0
    BEGIN
        ROLLBACK
        RETURN
    END

COMMIT

通过这种方式,您无需担心任何更新引发的错误。这意味着:如果其中任何一个失败,整个操作将被取消,并且您的数据库中不会有不一致的数据。

更多关于Transactions的使用在这里:http://www.4guysfromrolla.com/webtech/080305-1.shtml

基本的DELETE statement是:DELETE FROM &lt;tablename&gt; WHERE &lt;condition&gt;

【讨论】:

  • 我写了存储过程,现在我得到了这个错误。 Procedure or function UpdateTwoTable has too many arguments specified.
  • @Ye:检查 GridView 标记中&lt;UpdateParameters&gt; 的数量
  • @abatishchev Ermm。是不是很配? 11 个参数被传递给存储过程。还是我错过了什么?
  • @Ye:@Davis 的存储过程只接受 3:@ID, @Pass, Email
  • @abtishchev,不,不。我写了自己的存储过程。请检查问题中的更新。
【解决方案2】:
CREATE PROC UpdateUser
(
    @ID int
    ,@Pass varchar(15)
    ,@Email varchar(75)
   ) AS
BEGIN

Update
   tbl_user_login
Set
   Pass = @Pass
Where
   ID = @ID

Update
  tbl_user_profile
Set
  Email1 = @Email
Where
  ID = @ID

END

您可以像上面那样将多个 sql 命令写入单个 sproc。根据需要展开更新。删除的工作方式相同...

【讨论】:

    【解决方案3】:
    <asp:SqlDataSource runat="server":
        SelectCommand="SELECT ... "
        UpdateCommand="UPDATE a; UPDATE b;"
        DeleteCommand="DELETE FROM a; DELETE FROM b;" />
    

    没有用吗?

    【讨论】:

    • @Ye:是的,当然,这只是每个查询的开始。我刚刚提到了总体思路
    • 我试过了,回发完成没有任何错误,但数据没有更新。我没有收到任何错误。有什么想法吗?
    • @Ye:您可以订阅RowUpdatedRowDeleted 事件,也许会发现一些有用的东西。你使用交易吗?
    • 不。我先尝试了你的建议。好的。我会检查这些事件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-05
    • 2019-12-15
    • 2016-08-27
    • 1970-01-01
    • 1970-01-01
    • 2016-05-24
    相关资源
    最近更新 更多