在C# 2008中从数据库检索记录

3

我需要关于以下代码逻辑的语法帮助:

我有一个代码块,从数据库中获取电子邮件地址。这些电子邮件地址需要分配给一个名为strEmailAddress的字符串变量,并用逗号进行分隔。

我的代码如下:

SqlConnection conn = new SqlConnection(strConn);
string sqlEmailAddress = "usp_Get_Email_Address";
SqlCommand cmdEmailAddr = new SqlCommand(sqlEmailAddress, conn);
cmdEmailAddr.CommandType = CommandType.StoredProcedure;
con.Open();
SqlDataReader sqlDREmailAddr = cmdEmailAddr.ExecuteReader();

如何循环遍历记录并将结果存储在以逗号分隔的 strEmailAddress 中?
4个回答

5
while (sqlDREmailAddr.Read())
{
    //...process each row here
}

我也建议将读取器用 using 语句包裹起来,以确保它被正确地关闭:

using (SqlDataReader sqlDREmailAddr = cmdEmailAddr.ExecuteReader())
{
}

根据数据集中的列名,从每个记录中读取值的方法如下所示(更新:现在所有地址已经合并):

var emailAddress = new StringBuilder();
var emailAddressOrdinal = sqlDREmailAddr.GetOrdinal("EmailAddress");
while (sqlDREmailAddr.Read())
{
    if (emailAddress.Length > 0)
        emailAddress.Append(',');
    emailAddress.Append(sqlDREmailAddr.GetString(emailAddressOrdinal));
}

3

使用SqlDataReader.Read方法:

while (sqlDREmailAddr.Read())
{
 ...
 // Assumes only one column is returned with the email address
 strEmailAddress = sqlDREmailAddr.GetString(0);
}

我不知道你的存储过程返回什么。它在数据记录中如何显示? - Oded
它返回一个字符串;可能会返回多个记录; - user279521
答案已更新。阅读SqlDataReader方法,你可能会学到一些东西。 - Oded

1
while (sqlDREmailAddr.Read())
  {
    // handle row here
  }

1
由于第一次调用Read()如果没有行将返回false,因此对于HasRows的测试相当多余。 - Peter Lillevold
我也是这么想的,最初我的答案没有它...但在MSDN的示例中,他们两个都用了。所以我也加上了两个。http://msdn.microsoft.com/en-us/library/haa3afyz%28VS.71%29.aspx - Gabe

1

这就是你要找的内容...

using (SqlConnection conn = new SqlConnection(strConn)){
   string sqlEmailAddress = "usp_Get_Email_Address";
using (SqlCommand cmdEmailAddr = new SqlCommand(sqlEmailAddress, conn)){ cmdEmailAddr.CommandType = CommandType.StoredProcedure;
conn.Open(); // 这里有个打字错误!
using (SqlDataReader sqlDREmailAddr = cmdEmailAddr.ExecuteReader()){
while(sqlDREmailAddr.Read()){
if (!sqlDREmailAddr.IsDBNull(sqlDREmailAddr.GetOrdinal("emailAddr"))){
// 处理数据库值为空的情况...
}else{
strEmailAddress = sqlDREmailAddr.GetSqlString(sqlDREmailAddr.GetOrdinal("emailAddr"));
// 对strEmailAddr执行某些操作...
} } } }
}

注意:

  • 变量conn中有一个打字错误...
  • 检查以确保返回的数据库值不为NULL
  • 调用GetOrdinal方法基于字符串值emailAddr来返回与SQL查询中相应列对应的列(该列是一个int类型),然后将其作为参数传递给GetSqlString方法。

编辑:感谢John Saunders指出一个错误!

编辑#2:感谢Peter Lillevold指出一个拼写错误...

希望这可以帮到您, 最好的祝福, 汤姆。


1
将你的GetOrdinal移出循环。而且Read是大写R :) - Peter Lillevold
@Peter Lillevold:唉...希望有一些智能的拼写检查器来发现这个错误...是啊...你发现得真好...:) 很棒+1给你的评论! - t0mm13b

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接