【问题标题】:SQL Server database querySQL Server 数据库查询
【发布时间】:2011-04-06 13:26:54
【问题描述】:

我使用了 ASP.net 设置的标准用户表,我希望能够删除用户。首先,我需要从名为 members 的表中删除用户 ID,然后删除该用户。为此,我设置了 2 个文本框,其中一个用于用户 ID,另一个用于用户名。

关于 T-SQL 语句的任何想法,它将首先删除成员身份用户 id,然后移动到删除用户名,这是我到目前为止的语句

else
{
   try
   {
      connection.Open();
      cmd = new SqlCommand("DELETE from Membershio
                            WHERE UserId ='" + deleteuserIDbox.Text + "'", connection);
      cmd = new SqlCommand("DELETE from Users WHERE UserName ='" + deleteuserbox.Text + "'", connection);
      cmd.ExecuteNonQuery();
      update.Text = "Your data has been removed";
   }
   catch
   {
      update.Text = "Your data has not been deleted";
   }
}

这两个表是相关的,因此我需要先删除用户 ID,然后再删除用户名

任何帮助都非常感谢

【问题讨论】:

  • 我注意到的第一件事是您在 sql 语句中使用了字符串连接。您需要使用绑定变量:richquackenbush.com/2011/02/bind-variables.html 有几个原因。接下来,接受一些你懒惰的答案!
  • 如果您发布代码、XML 或数据示例,在文本编辑器中突出显示这些行并单击编辑器上的“代码示例”按钮 ({ })工具栏以很好地格式化和语法突出显示它!

标签: c# asp.net sql-server windows


【解决方案1】:

如果理解正确,你的输入法有严重问题。

例如,

UserID   UserName
 1        testUser
 2        testUser2 

应用程序中的逻辑;我可以在 deleteuserIDbox 中输入“1”,在 deleteuserbox 中输入“testUser2”,这反过来会删除 userID 1 但不是用户名“testUser”。

如果您还没有这样做,则需要使用 UserID 上的外键关联这两个表。因此,链接与 UserID 字段保持一致。

另一个问题是,您正在使用用户的输入直接执行查询,从而启用 sql 注入的可能性。

关于您的查询,您可以输入“ cmd.ExecuteNonQuery();”在你的两个 cmd 语句之间。

【讨论】:

    【解决方案2】:

    要使用您当前的代码,您需要执行第一个查询,然后为第二个查询设置 CommandText 并执行它。

      using (SqlCommand cmd = connection.CreateCommand())
      {
           cmd.CommandText = "DELETE FROM Membership WHERE UserID = @UserID";
    
           cmd.Parameters.AddWithValue("@UserID", deleteuserIDbox.Text);
    
           connection.Open();
    
           cmd.ExecuteNonQuery();
    
           cmd.Paramters.Clear();
    
           cmd.CommandText = "DELETE from Users WHERE UserName = @UserName";
    
           cmd.Parameters.AddWithValue("@UserName", deleteuserbox.Text);
    
           cmd.ExecuteNonQuery();
      }
    

    另一种选择是使用存储过程,让您可以同时运行这两个查询。

    另一种选择是进行级联删除。下面是a link 说明如何实现这一点。

    最后,你向SQL Injection 敞开心扉。您永远不应该从用户那里获取输入并将该数据连接到 SQL 语句中。您应该使用存储过程或参数化查询(就像我上面使用的那样)。

    【讨论】:

      【解决方案3】:

      你没有执行第一个命令:

      connection.Open();
      
      cmd = new SqlCommand("DELETE from Membershio
            WHERE UserId ='" +
            deleteuserIDbox.Text + "'", connection);
      
      cmd.ExecuteNonQuery();
      
      cmd = new SqlCommand("DELETE from Users WHERE
            UserName ='" + deleteuserbox.Text +
            "'", connection);
      
      cmd.ExecuteNonQuery();
      

      此外,这些命令应该在事务中执行。

      【讨论】:

        【解决方案4】:

        有点晚了,但我今天才注意到你的问题。

        通过在数据库上执行此操作,您绕过了所有好东西!您应该在 C# 中通过调用 Membership::DeleteUser 方法来做到这一点

        http://msdn.microsoft.com/en-us/library/5xxz7y3a.aspx

        您根本不应该弄乱会员系统的内部结构。

        【讨论】:

          猜你喜欢
          • 2014-03-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多