如何使用C#从SQL Server获取电子邮件

时间:2014-03-27 05:11:23

标签: c# asp.net sql sql-server

这让我烦恼。这么简单的东西,它不起作用。我能做错什么?

以下是我正在使用的代码......

    string strSQL = "SELECT ac.ContactEmail AS fldEmail FROM vwApprenticeshipContactDetails ac WHERE (ac.ApprenticeshipID = @ApprenticeshipID)";
    SqlCommand cmd2 = new SqlCommand(strSQL, cnn);
    cmd2.Parameters.Add("@ApprenticeshipID", SqlDbType.Int).Value = wsAppID;
    Object fldEmail = cmd2.ExecuteScalar();

信不信由你,当我调试并查看'fldEmail'的值时,上面会返回看起来像数组的内容。换句话说,它是空的,没有或为null(不能告诉输出窗口显示数组)。我直接在SQL服务器上运行它,我收到的电子邮件显示正常。数据库字段中的“@”字符可能会在这里引起某些问题吗?

我期待的电子邮件是'g.somebody@domain.com.au',对我来说看起来不错。

更新

我用上面的ContactEmail字段替换了数据库中的另一个列名,它回来了。不确定为什么电子邮件是个问题。这里的数据类型是VARCHAR(50)

更新

在调试模式下,我注意到它返回system.DBNull数据类型(深入挖掘它返回空),但为什么呢?我在SQL Server中使用正确的参数运行完全相同的查询,我收到一封电子邮件显示。奇怪

由于

2 个答案:

答案 0 :(得分:2)

解决了!

出于某种原因(当涉及到C#中的电子邮件对象时,我是一个菜鸟),但是执行标量没有正确填充,因为它不是"读"第一。我的意思是,当我将ExecuteScalar更改为SqlReader时,它起作用,因为我强迫"强迫"在测试之前读取SQL。

所以我的代码现在看起来像这样,它会返回一封电子邮件!

strSQL = @"SELECT TOP 1 ContactEmail FROM vwApprenticeshipContactDetails WHERE ApprenticeshipID = @ApprenticeshipID";
SqlCommand cmd2 = new SqlCommand(strSQL, cnn);
cmd2.Parameters.Add("@ApprenticeshipID", SqlDbType.Int).Value = wsAppID;
using (SqlDataReader rdr = cmd2.ExecuteReader())
{
  string fldEmail = "support@domain.com.au";   //this is as a default in case the sql above does not return a value
  while (rdr.Read())
  {
    fldEmail = rdr.GetSqlValue(0).ToString();
  }
}

我最初是在避免使用SqlReader,因为我认为它们是专门为读取多行数据而设计的。在我的情况下,我知道给定的参数只返回一行或根本没有。

由于

答案 1 :(得分:1)

在第一次更改时,出于性能原因选择前1名。

string strSQL = "SELECT Top 1 ac.ContactEmail AS fldEmail FROM ...

如果查询中没有任何结果,则会得到null值。

您可以检查sql server profiler中查询返回的记录数。

您还可以检查连接字符串以确保连接到正确的数据库。