【问题标题】:Looping WHERE variable in SELECT statement for c#在 C# 的 SELECT 语句中循环 WHERE 变量
【发布时间】:2013-06-27 07:26:28
【问题描述】:

所以,我正在尝试创建一个名为“shoutout”的区域,当前用户可以在其中查看“shoutout”,基本上是来自与他/她的朋友的人在shoutout 表中的消息。

所以,我首先将当前用户的所有朋友放入一个名为“currentuserfriends”的数组中,然后我希望从用户名=“currentuserfriends”中的所有用户的shoutout表中选择消息。

但是我不知道如何在 select 语句中循环,

我不想做类似的事情,

string getuserfriendlist = "SELECT friend FROM friend WHERE username = '" + currentuserfriends[0] + "'";

并手动增加 currentuserfriends[0]。有没有办法在单个 select 语句中循环 currentuserfriends 直到结束?谢谢。

好友桌

username | friend

喊话桌

username | message | datetime

代码:

        string[] currentuserfriends = new string[9999];
string[] posternames = new string[9999];
    string getuserfriendlist = "SELECT friend FROM friend WHERE username = '" + currentuser + "'";

    SqlCommand cmdb = new SqlCommand(getuserfriendlist, con);

    SqlDataReader drb;

    drb = cmdb.ExecuteReader();

    while (drb.Read())
    {

        string currentuserfriend = drb["friend"].ToString();
        currentuserfriends[l++] = currentuserfriend;
    }
    drb.Close();

    string getshoutout = "SELECT * FROM shoutout WHERE username = '" + currentuserfriends + "' AND username ='" + currentuser + "' order by datetime DESC";
    SqlCommand cmdc = new SqlCommand(getshoutout, con);
    SqlDataReader drc;
    drc = cmdc.ExecuteReader();

    while (drc.Read())
    {
        string postername = drb["username"].ToString();
        posternames[m++] = postername;
    }
    drc.Close();

    Label2.Text = posternames[0];
    Label3.Text = posternames[1];
    Label4.Text = posternames[2];
    Label5.Text = posternames[3];
    Label6.Text = posternames[4];

【问题讨论】:

  • 我想报告一个错误,我创建了一个用户帐户,现在您的网站停止工作。我的用户名是'; drop table shoutout; --(请查看使用SqlParameters,搜索一下这个网站上有很多关于它的问题。)
  • )))))))) sql 注入让我开心!
  • 关于主题说明,here is a different, but related, question 可能会解决您的问题。 编辑: 另一个问题,大小为 9999 的数组是什么?为什么不直接使用List<string>
  • @ScottChamberlain:我认为drop table 是您遇到的最少问题。真正的危险是有人在您不知情的情况下接管了您的服务器或stealing all your data
  • @Steven 是的,但是下拉表是最容易在评论空间中理解这一点的方法,不过感谢您提供的链接,我以后会用它作为一个很好的例子。

标签: c# sql webforms


【解决方案1】:

您可以使用List<string> 代替数组。在这种情况下,您可以执行以下操作:

var currentuserfriends = new List<string>();

while (drb.Read())
{
    currentuserfriends.Add(drb["friend"].ToString())
}

正如其他人所说,您可以优化您的查询。我喜欢更进一步并建议实体框架(或 LINQ to SQL)。它允许您这样做:

var db = new ObjectContext();

string[] currentuserfriends = (
    from friend in db.Friends
    where friend.Username == currentuser
    select friend.Name)
    .ToArray();

使您不必手工制作 SQL 查询,并直接防止您的查询遭受 SQL 注入,因为您当前的查询目前容易受到 SQL 注入的攻击。

【讨论】:

    【解决方案2】:

    对数组使用foreach循环,然后生成SQL查询

    【讨论】:

      【解决方案3】:

      有没有办法循环当前用户朋友直到结束 选择语句?

      是的,有。 IN Operator 就是这样做的。

      【讨论】:

        【解决方案4】:

        首先使用以下代码使您的数组成为逗号分隔的字符串

        string idString = String.Join(",",currentuserfriends);
        

        然后,使用下面的sql语句

        SELECT friend FROM friend WHERE username in ("+idstring+");
        

        【讨论】:

          猜你喜欢
          • 2014-07-29
          • 1970-01-01
          • 2015-05-09
          • 1970-01-01
          • 1970-01-01
          • 2018-10-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多