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

本文关键字:异常 引用 查询 输出 SQL | 更新日期: 2023-09-27 18:18:00

在努力从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行。

系统。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

是什么导致该代码中的空引用异常?如果答案在堆栈跟踪中,有人能给我解释一下吗?

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

您需要将查询更改为

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

同样,你不会得到一个强制转换异常,而是一个空引用异常。

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

为什么不把查询改成

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

应该总是返回Int

我认为问题在于类型SqlDbType.Char。试着把它改成SqlDbType.VarChar

请看下面的演示

SQL Fiddle DEMO

From LIKE (Transact-SQL)

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

问题是你的SQL语句

LIKE '@currentUser'"

这将不会被识别为参数,你最好按照下面的操作

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

和设置参数

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

你得到这个异常是因为从

返回的值
(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 + "%";