繁体   English   中英

字符串从SQL结果在一起

[英]String together results from sql

我有一个包含一堆电子邮件地址的数据库,我需要将它们格式化为一个字符串,如下所示:

toaddress = "name@gmail.com,name1@gmail.com,name2@gmail.com,name3@gmail.com"

当前代码:

string toaddress = "";
using (SqlConnection conn = new SqlConnection(""))
{
    SqlCommand cmd = new SqlCommand("SELECT email FROM dbo.Members", conn);
    conn.Open();
    SqlDataReader rdr = cmd.ExecuteReader();
    while (rdr.Read())
    {
        toaddress = rdr["email"].ToString();
    }
    rdr.Close();
}

最简单的方法是像这样使用StringBuilder

StringBuilder sb = new StringBuilder();
string toaddress = null;
using (SqlConnection conn = new SqlConnection(""))
{
    SqlCommand cmd = new SqlCommand("SELECT email FROM dbo.Members", conn);
    conn.Open();
    SqlDataReader rdr = cmd.ExecuteReader();
    while (rdr.Read())
    {
        sb.Append(rdr["email"].ToString() + ",");
    }
    rdr.Close();
}

toaddress = sb.ToString().TrimEnd(',');

记得Trim ,从字符串的使用结束String.TrimEnd

如果在CommandDataReader对象上使用using语句,则更好,例如:

using (SqlConnection conn = new SqlConnection(""))
{
    using (SqlCommand cmd = new SqlCommand("SELECT email FROM dbo.Members", conn))
    {
        conn.Open();
        using (SqlDataReader rdr = cmd.ExecuteReader())
        {
            while (rdr.Read())
            {
                sb.Append(rdr["email"].ToString() + ",");
            }
        }
    }
}

将地址切换到List<string>如下所示:

List<string> addresses = new List<string>();

获取时使用add

addresses.Add(rdr["email"] as string));

然后最后使用string.Join

var toaddress = string.Join(",", addresses);

*编辑*

建议二,避免重复两次:

public IEnumerable<string> GetEmails()
{
  using (SqlConnection conn = new SqlConnection(""))
  {
      SqlCommand cmd = new SqlCommand("SELECT email FROM dbo.Members", conn);
      conn.Open();
      SqlDataReader rdr = cmd.ExecuteReader();
      while (rdr.Read())
      {
          toaddress = rdr["email"].ToString();
      }
      rdr.Close();
  }
}

然后只需调用: string.Join(",", GetEmails())

这样,如果您想用它来做疯狂的事情,可以:

string.Join(",", GetEmails().Select(email => email.ToLower()).Distinct())

使所有电子邮件都小写且区分(例如)。

使用Sql Server(肯定是2008年,似乎是在2005年,但不确定),可以使用FOR XML将所有行以','作为分隔符,并使用STUFF删除第一个',':

select stuff((select ',' +email 
              from Members
              for XML PATH('')),1,1,'')

您正在覆盖当前字符串。 要使其正常工作,您需要像

toaddress += "," + rdr["email"].ToString();

但是,这是一种丑陋的方式。 最好将结果放在列表的最前面并使用字符串。

List<string> addresses = new List<string>();
... database stuff    
while (rdr.Read())
{
  addresses.Add(rdr["email"].ToString());
}
... stuff
string toaddress = string.Join(",", addresses)

您可以创建一个List并使用string.Join将各项组合在一起。

List<string> items = new List<string>();
using (SqlConnection conn = new SqlConnection(""))
{
    SqlCommand cmd = new SqlCommand("SELECT email FROM dbo.Members", conn);
    conn.Open();
    SqlDataReader rdr = cmd.ExecuteReader();
    while (rdr.Read())
    {
        items.Add(rdr["email"].ToString());
    }
    rdr.Close();
}

toaddress = string.Join(",", items);

如果您使用的是3.5框架,则需要ToArray()列表。

var toaddress = new StringBuilder();
var delimiter = "";
using (SqlConnection conn = new SqlConnection(""))
{
    SqlCommand cmd = new SqlCommand("SELECT email FROM dbo.Members", conn);
    conn.Open();
    SqlDataReader rdr = cmd.ExecuteReader();
    while (rdr.Read())
    {
        toaddress.AppendFormat("{0}{1}", delimiter, rdr["email"].ToString());
        delimiter = ",";
    }
    rdr.Close();
}
return toaddress.ToString();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM