Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/256.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# SQL查询输出中出现空引用异常_C#_.net_Sql Server_Ado.net_Nullreferenceexception - Fatal编程技术网

C# SQL查询输出中出现空引用异常

C# SQL查询输出中出现空引用异常,c#,.net,sql-server,ado.net,nullreferenceexception,C#,.net,Sql Server,Ado.net,Nullreferenceexception,在努力从SQL数据库中提取某些信息以用于C#代码中进行权限检查之后,我决定回到基础知识,学习如何正确地完成这项工作,并逐步提高我的技能,以便最终能够完成我需要做的事情。下面代码的目的是获取当前Active Directory用户,然后进入包含用户名和其他信息的SQL表,找到一个匹配的,然后在MessageBox中显示它 string currentUser = System.Security.Principal.WindowsIdentity.GetCurrent().Name; using

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

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

您会遇到此异常,因为返回的值来自:

(int)cmd.ExecuteScalar()
实际上是空的。然而,我最感兴趣的是这个。你的问题是:

SELECT username FROM [tbl_Person]...
但是你要把结果转换成
int
。我觉得这不对。看起来这个
Convert.ToString((int)cmd.ExecuteScalar())
实际上应该是这个
cmd.ExecuteScalar()作为字符串的字符串。这既可以处理
null
,也可以正确转换其类型

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

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

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

您得到此异常是因为返回的值来自:

(int)cmd.ExecuteScalar()
实际上是空的。然而,我最感兴趣的是这个。你的问题是:

SELECT username FROM [tbl_Person]...
但是你要把结果转换成
int
。我觉得这不对。看起来这个
Convert.ToString((int)cmd.ExecuteScalar())
实际上应该是这个
cmd.ExecuteScalar()作为字符串的字符串。这既可以处理
null
,也可以正确转换其类型

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

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

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

您需要将查询更改为

SELECT username FROM [tbl_Person] WHERE [username] LIKE '%' + @currentUser + '%'
SELECT COUNT(username) as Cnt_UserName 
FROM [tbl_Person] 
WHERE [username] LIKE '%' + @currentUser + '%'
此外,您不会得到强制转换异常,而是一个空引用异常

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

为什么不把查询改成

SELECT username FROM [tbl_Person] WHERE [username] LIKE '%' + @currentUser + '%'
SELECT COUNT(username) as Cnt_UserName 
FROM [tbl_Person] 
WHERE [username] LIKE '%' + @currentUser + '%'
它应该总是返回一个Int

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

请看下面的演示

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


您需要将查询更改为

SELECT username FROM [tbl_Person] WHERE [username] LIKE '%' + @currentUser + '%'
SELECT COUNT(username) as Cnt_UserName 
FROM [tbl_Person] 
WHERE [username] LIKE '%' + @currentUser + '%'
此外,您不会得到强制转换异常,而是一个空引用异常

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

为什么不把查询改成

SELECT username FROM [tbl_Person] WHERE [username] LIKE '%' + @currentUser + '%'
SELECT COUNT(username) as Cnt_UserName 
FROM [tbl_Person] 
WHERE [username] LIKE '%' + @currentUser + '%'
它应该总是返回一个Int

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

请看下面的演示

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


问题在于您的sql语句

像“@currentUser”

这将不会被识别为参数,您最好按以下操作

cmd.CommandText = "SELECT username FROM [tbl_Person] WHERE [username] LIKE @currentUser";
当您设置参数时

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

问题在于您的sql语句

像“@currentUser”

这将不会被识别为参数,您最好按以下操作

cmd.CommandText = "SELECT username FROM [tbl_Person] WHERE [username] LIKE @currentUser";
当您设置参数时

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

哦,这是有道理的。这是否意味着我的查询是不正确的,因为它是为了输出一些我稍后将在C#中用于进行比较的内容?@Trido,请查看我的编辑并回复。查询和您的代码对我来说似乎不太合适。这确实有效,虽然没有显示任何内容,但它已修复了我的错误。我认为这可能与类型转换有关,但老实说,我一直在努力将其转换为字符串。这很好地解决了这个问题,而且更容易阅读。我没有设置MessageBox,而是将其设置为标签,因为这样更容易。标签是空的,这是好的,因为您是对的,它返回了一个
null
。我只需要找出查询出了什么问题,因为我想让它输出用户名,当然假设它是查询。@Trido,太棒了。我很高兴能帮上忙@Trido,请查看我的编辑,以帮助您使查询正常工作。哦,这很有意义。这是否意味着我的查询是不正确的,因为它是为了输出一些我稍后将在C#中用于进行比较的内容?@Trido,请查看我的编辑并回复。查询和您的代码对我来说似乎不太合适。这确实有效,虽然没有显示任何内容,但它已修复了我的错误。我认为这可能与类型转换有关,但老实说,我一直在努力将其转换为字符串。这很好地解决了这个问题,而且更容易阅读。我没有设置MessageBox,而是将其设置为标签,因为这样更容易。标签是空的,这是好的,因为您是对的,它返回了一个
null
。我只需要找出查询出了什么问题,因为我想让它输出用户名,当然假设它是查询。@Trido,太棒了。我很高兴能帮上忙@Trido,请查看我的编辑以帮助您使查询正常工作。我做到了,Messagebox行是
Messagebox.Show(“{0}”),Convert.ToString((int)cmd.ExecuteScalar())
。感谢您的回复,非常感谢。我做到了,Messagebox行是
Messagebox.Show(“{0}”,Convert.ToString((int)cmd.ExecuteScalar())
。感谢您的回复,非常感谢。几乎所有的
NullReferenceException
案例都是相同的。恳求