在c#的SELECT语句中循环WHERE变量

时间:2013-06-27 07:26:29

标签: c# sql webforms

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

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

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

我不想做类似的事情,

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

并手动增加currentuserfriends [0]。有没有办法将currentuserfriends循环到单个select语句的结尾?感谢。

朋友表

username | friend

shoutout table

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];

4 个答案:

答案 0 :(得分: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注入查询。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

  

有没有办法将currentuserfriends循环到单个结尾   选择陈述?

是的,有。 IN Operator做到了。

答案 3 :(得分:0)

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

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

然后,使用下面的sql语句

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