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

标签 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 Reference Exception?如果答案在堆栈跟踪中,那么有人可以向我解释一下吗?我发现堆栈跟踪非常混乱。

最佳答案

您会收到此异常,因为该值从以下位置返回:

(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 + "%";

关于c# - SQL查询输出中的空引用异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17036458/

相关文章:

sql-server - 聚集索引和非聚集索引之间的性能差异

c# - wpf拖放视觉选择项目

.net - Jquery回发,回发后保持相同的选项卡

c# - 如何将 Nuget 包 dll 添加到 Wix 安装程序

c# - 将关键字存储在数据库中的最佳方法是什么,与语言无关

c# - 在自动生成的 GridView WPF C# 中仅显示日期

sql - Id 或 [TableName]Id 作为主键/实体标识符

c# - 为什么 C# 不允许重载 operator()?

c# - 为什么在没有返回值的 lambda 中添加 throw 会被推断为 Func<T> 而不是 Action?

c# - 只要层次结构中的所有类只使用托管资源,就可以使用虚拟 Dispose() 方法吗?