SQL查询输出中的空引用异常

时间:2013-06-11 04:20:46

标签: c# .net sql-server ado.net nullreferenceexception

在努力从SQL数据库中提取某些信息以在C#代码中使用以进行一些权限检查之后,我决定回到基础知识并学习如何正确地执行它并慢慢建立我的技能,这样我最终可以做到我需要做什么。下面代码的目标是获取当前的Active Directory用户,然后进入包含用户名和其他信息的SQL表,找到匹配的表,然后在MessageBox中显示它。

string currentUser = System.Security.Principal.WindowsIdentity.GetCurrent().Name;

using (var cn = new SqlConnection(ConfigurationManager.ConnectionStrings["HSEProjRegConnectionString1"].ConnectionString))
using (var cmd = new SqlCommand())
{
    cn.Open();
    cmd.Connection = cn;
    cmd.CommandType = CommandType.Text;
    cmd.CommandText = "SELECT username FROM [tbl_Person] WHERE [username] LIKE '@currentUser'";

    SqlParameter param = new SqlParameter();
    cmd.Parameters.Add("@currentUser", SqlDbType.Char).Value = currentUser;

    MessageBox.Show("{0}", Convert.ToString((int)cmd.ExecuteScalar()));

    cn.Close();
}
但是有些事情是错的。我收到以下错误和堆栈跟踪。第38行是MessageBox行。

System.NullReferenceException:未将对象引用设置为对象的实例。

[NullReferenceException: Object reference not set to an instance of an object.]
HSE_project_Register.admin.Page_Load(Object sender, EventArgs e) in S:\IT\Development\Visual Studio Projects\HSE Project Register\admin\admin.aspx.cs:38
System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e) +25
System.Web.UI.Control.LoadRecursive() +71
System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +3064

该代码中导致Null引用异常的原因是什么?如果答案在Stack Trace中,有人可以向我解释一下吗?我发现Stack Trace非常混乱。

3 个答案:

答案 0 :(得分:2)

您需要将查询更改为

SELECT username FROM [tbl_Person] WHERE [username] LIKE '%' + @currentUser + '%'

此外,您没有获得转换异常,而是一个空引用异常。

所以你需要告诉我们你的页面admin.aspx.cs第38行是什么?

为什么不将查询更改为

SELECT COUNT(username) as Cnt_UserName 
FROM [tbl_Person] 
WHERE [username] LIKE '%' + @currentUser + '%'

哪个应该总是返回Int

我认为问题在于SqlDbType.Char类型。尝试将其更改为SqlDbType.VarChar

查看以下演示

SQL Fiddle DEMO

来自LIKE (Transact-SQL)

  

使用包含char和varchar的模式进行字符串比较   由于数据的存储方式,数据可能无法通过LIKE比较。

答案 1 :(得分:2)

问题在于你的sql语句

LIKE '@currentUser'"

这不会被识别为您最好如下所示的参数

cmd.CommandText = "SELECT username FROM [tbl_Person] WHERE [username] LIKE @currentUser";

并设置参数

 cmd.Parameters.AddWithValue("@currentUser", '%' + currentUser + '%');

答案 2 :(得分:1)

您收到此异常是因为从

返回的值
(int)cmd.ExecuteScalar()

实际上是null。但是,我最感兴趣的是这个。您的查询说:

SELECT username FROM [tbl_Person]...

但是你接受了结果并尝试将其投射到int。对我来说感觉不对。看来Convert.ToString((int)cmd.ExecuteScalar())实际应该是cmd.ExecuteScalar() as string。这既可以处理null,也可以正确地转换它的类型。

要修复您的查询,请考虑以下代码:

cmd.CommandText = "SELECT username FROM [tbl_Person] WHERE [username] LIKE @currentUser";

cmd.Parameters.AddWithValue("@currentUser", "%" + currentUser + "%";