这让我烦恼。这么简单的东西,它不起作用。我能做错什么?
以下是我正在使用的代码......
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中使用正确的参数运行完全相同的查询,我收到一封电子邮件显示。奇怪
由于
答案 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中查询返回的记录数。
您还可以检查连接字符串以确保连接到正确的数据库。