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

C# 在C 2008中从数据库检索记录,c#,asp.net-3.5,C#,Asp.net 3.5,我需要以下代码逻辑的语法帮助: 我有一个从数据库获取电子邮件地址的代码块。电子邮件地址需要分配给字符串变量strEmailAddress,并用逗号分隔 我的代码是: SqlConnection conn = new SqlConnection(strConn); string sqlEmailAddress = "usp_Get_Email_Address"; SqlCommand cmdEmailAddr = new SqlCommand(sqlEmailAddress, conn); cmd

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

我有一个从数据库获取电子邮件地址的代码块。电子邮件地址需要分配给字符串变量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中

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));
}
使用以下方法:


这就是你要找的

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(); // Typo Glitch! using (SqlDataReader sqlDREmailAddr = cmdEmailAddr.ExecuteReader()){ while(sqlDREmailAddr.Read()){ if (!sqlDREmailAddr.IsDBNull(sqlDREmailAddr.GetOrdinal("emailAddr"))){ // HANDLE THE DB NULL... }else{ strEmailAddress = sqlDREmailAddr.GetSqlString(sqlDREmailAddr.GetOrdinal("emailAddr")); // Do something with strEmailAddr... } } } } } 注意:

conn变量上的输入错误错误。。。 进行检查以确保返回的数据库值不为空 调用GetOrdinal以返回基于emailAddr字符串值的列,该值对应于SQL Select…查询中的列,该列是作为GetSqlString参数的int类型。。 编辑:感谢约翰·桑德斯指出了一个错误

编辑2:感谢彼得·利勒沃德指出了一个拼写错误

希望这有帮助, 顺致敬意,
Tom。

对HasRows的测试是多余的,因为如果没有行,第一次调用Read将返回false。我也这么认为,我最初的答案没有它……但在MSDN的示例中,他们都做了。所以我把两者都放了。我不知道你的存储过程返回了什么。它在数据记录中如何显示?它返回一个字符串;可以返回多条记录;答案已更新。阅读SqlDataReader方法,您可能会学到一些东西。将GetOrdinals移出循环。瑞德的大写字母是R:@Peter Lillevold:唉……真希望有个聪明的拼写检查器能发现那个。。。是 啊好主意非常感谢你的评论!
while (sqlDREmailAddr.Read())
{
 ...
 // Assumes only one column is returned with the email address
 strEmailAddress = sqlDREmailAddr.GetString(0);
}
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(); // Typo Glitch! using (SqlDataReader sqlDREmailAddr = cmdEmailAddr.ExecuteReader()){ while(sqlDREmailAddr.Read()){ if (!sqlDREmailAddr.IsDBNull(sqlDREmailAddr.GetOrdinal("emailAddr"))){ // HANDLE THE DB NULL... }else{ strEmailAddress = sqlDREmailAddr.GetSqlString(sqlDREmailAddr.GetOrdinal("emailAddr")); // Do something with strEmailAddr... } } } } }