【问题标题】:SQL SELECT using a variable condition after WHERESQL SELECT 在 WHERE 之后使用变量条件
【发布时间】:2012-12-26 03:02:23
【问题描述】:

我正在使用带有网页模型的 ASP.NET,并创建了一个数据库供用户发布,这一切都很棒,然后我创建了一个页面,以便用户可以编辑他们的帖子,但是我想要它,所以用户只能编辑他们自己的帖子。

为此,我尝试了以下方法:

我做了一个变量

var EmailMatch = WebSecurity.CurrentUserName;

因此,如果我将@EmailMatch 放在 html 标记中的任何位置,它将显示当前登录用户的电子邮件地址。现在为了仅显示该用户发表的帖子,我使用了以下选择语句:

var selectAllString = "SELECT * FROM SaleData WHERE Email = '@EmailMatch'";

理论上我认为这应该可行,因为当用户发帖时,它会将他们的电子邮件地址发送到“电子邮件”字段下的数据库中,并且它应该显示与当前登录的用户相同的记录。但是这声明返回0结果,我已经尝试了所有我能想到的都没有成功,这是我最后的手段,有人可以告诉我我错过了什么吗?提前谢谢..

【问题讨论】:

    标签: asp.net mysql variables select where


    【解决方案1】:

    执行此操作的正确方法是通过参数化查询。永远不要将您无法控制的字符串连接到查询中。

    var EmailMatch = WebSecurity.CurrentUserName;
    var selectAllString = "SELECT * FROM SaleData WHERE Email = @EmailMatch";
    SqlCommand cmd = new SqlCommand(s);
    cmd.Parameters.Add("@EmailMatch", EmailMatch);
    var resultsTable = cmd.ExecuteReader();
    

    【讨论】:

    • 这里的相关点是你不需要在'@EmailMatch'周围加上引号
    • @MichaelBray - 你是绝对正确的 - 我应该在我的回答中提到这一点。
    • 感谢您的及时回复,但是这段代码给了我这个我不熟悉的错误:'CS0246:找不到类型或命名空间名称'SqlCommand'(您是否缺少使用指令还是程序集引用?)'
    • @Ben - 它将位于 System.Data.SqlClient 命名空间中 - 这是用于 SQL Server 的。对于其他数据库,请使用提供的 dll 中提供的 SqlCommand
    【解决方案2】:
    var selectAllString = "SELECT * FROM SaleData WHERE Email = '" + EmailMatch + "'";
    

    注意:这可能会使您受到 SQL 注入攻击。

    【讨论】:

      【解决方案3】:
      cmd = new MySqlCommand("SELECT * FROM SaleData WHERE Email = @EmailMatch", MySqlConn.conn);
      cmd.Parameters.AddWithValue("@EmailMatch", EmailMatch);
      cmd.Prepare();
      cmd.ExecuteReader();
      

      【讨论】:

      • 谢谢,但是这段代码告诉我一个错误:'CS0103: The name 'cmd' does not exist in the current context'
      【解决方案4】:

      试试这个:

      var selectAllString = "SELECT * FROM SaleData WHERE Email = '"+EmailMatch+"'";
      

      或者为了避免 SQL 注入,你的 SQL 语句是正确的,但是你必须在你的代码中添加这个:

      using (OleDbConnection CON = new OleDbConnection("your connection string")) {
         OleDbCommand Com = CON.CreateCommand();
         Com.CommandText = "SELECT * FROM SaleData WHERE Email = @EmailMatch";
              Com.CommandType = CommandType.Text;
              Com.CommandTimeout = 0;
              Com.Connection.Open();
              Com.Parameters.AddWithValue("EmailMatch",EmailMatch);
         ...
         // continue your code from here... 
      }
      

      【讨论】:

      • 您的命令类型是 StoredProcedure,但您提供的是 sql select 语句。你的命令类型应该是 CommandType.Text
      • 让我面临 sql 注入风险的代码有效,但是,是的,使网站保持打开状态。当我尝试添加额外的代码时,它返回此错误:'CS0246:类型或命名空间名称找不到“OleDbConnection”(您是否缺少 using 指令或程序集引用?)'
      • 您使用的是什么数据提供者?如果您使用的是 MSAccess 或 MSSQL,则可以使用 OleDbConnection
      • 添加此参考using System.Data.OleDb
      • 我很确定我使用的是 MSSQL,无论是 Webmatrix 2 中的哪一个。对不起,我是一个初学者,所有这些答案都非常不同,很难遵循逻辑。我仍然无法让它工作,我想我需要做更多的研究,谢谢你的帮助。
      猜你喜欢
      • 1970-01-01
      • 2021-03-10
      • 2021-04-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多