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

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

最佳答案

您需要将查询更改为类似

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)

A string comparison using a pattern that contains char and varchar data may not pass a LIKE comparison because of how the data is stored.

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

相关文章:

c# - 使用另一个类的类方法

c# - 来自 WebAPI 的服务器调用图像

c# - 如何防止 .NET XML 解析器扩展 XML 中的参数实体?

c# - 如何在 C# 中获取服务器和客户端之间的延迟?

c# - 用户控件连接到 SqlServer 数据库

c# - 如何从 System.IO.File 调用访问 PSDrive?

c# - 从一个实现 INotifyPropertyChanged 的​​基类继承

c# - 使用 Azure AD 登录后无法使用 WebApp 静默获取 token ?

c# - 我可以使用 ExecuteScalar 进行更新吗?

c# - 在运行时设置连接字符串 - EF Code First