ExecuteScalar SQLException:标量变量未声明 [英] ExecuteScalar SQLException: scalar variable not declared

查看:97
本文介绍了ExecuteScalar SQLException:标量变量未声明的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试检查SQL Server的表中是否存在用户.我已经创建了连接字符串,打开了一个连接-

I'm trying to check if a user exists within a table in SQL-Server. I have created connection strings, opened a connection -

            var settings = ConfigurationManager.ConnectionStrings["BlogEngine"].ConnectionString;
            SqlConnection conn = new SqlConnection(settings);
            using (conn)
            {
                if (conn.State != ConnectionState.Open)
                {
                    conn.Open();
                    var checkUser = "SELECT COUNT(*) FROM dbo.be_Users WHERE UserName = @UserName";
                    using (SqlCommand userquery = new SqlCommand(checkUser,conn))
                    {
                        var parma = userquery.Parameters;
                        parma.AddWithValue("@UserName", activedirectory.DisplayName);
                        int UserExist = (int)userquery.ExecuteScalar();

                        if (UserExist > 0)
                        {
                            //Username exist
                            AuthenticateUser(staffId, password, rmb);
                        }
                        else
                        {
                            //Username doesn't exist.
                            var sqlQuery = "INSERT INTO dbo.be_Users (BlogID, UserName, Password, LastLoginTime, EmailAddress, Department)" + "VALUES (@BlogID, @UserName, @Password, @LastLoginTime, @EmailAddress, @Department)";
                            using (SqlCommand qe = new SqlCommand(sqlQuery))
                            {

                                var parms = qe.Parameters;
                                parms.AddWithValue("@BlogID", Blog.CurrentInstance.Id.ToString());
                                parms.AddWithValue("@UserName", activedirectory.DisplayName); 
                                parms.AddWithValue("@Password", (passwordFormat == MembershipPasswordFormat.Hashed ? Utils.HashPassword(DEFAULT_PASSWORD) : DEFAULT_PASSWORD));
                                parms.AddWithValue("@LastLoginTime", DateTime.Now);
                                parms.AddWithValue("@EmailAddress", DEFAULT_EMAIL);
                                parms.AddWithValue("@Department", activedirectory.department);

                                qe.ExecuteNonQuery();
                            }
                            AuthenticateUser(staffId, password, rmb);
                        }
                    }conn.Close();
                }

我一直收到此错误-System.Data.dll中发生了类型为'System.Data.SqlClient.SqlException'的异常,但未在用户代码中处理

I keep getting this error - An exception of type 'System.Data.SqlClient.SqlException' occurred in System.Data.dll but was not handled in user code

其他信息:必须声明标量变量"@UserName".

Additional information: Must declare the scalar variable "@UserName".

该异常发生在 int UserExist =(int)userquery.ExecuteScalar(); 行.

请,我该如何解决?

推荐答案

由于您在此处添加了参数,

parma.AddWithValue("@UserName", activedirectory.DisplayName);

我的猜测是 activedirectory.DisplayName null .ADO.NET中的一个奇怪的小问题是,未传递具有 null 的参数.要将 null 传递给数据库,您需要传递 DBNull.Value .所以:

My guess would be that activedirectory.DisplayName is null. A curious glitch in ADO.NET is that parameters with null values are not passed. To pass a null down to the database, you need to pass DBNull.Value. So:

parma.AddWithValue("@UserName", ((object)activedirectory.DisplayName) ?? DBNull.Value);

或更长时间:

object displayName = activedirectory.DisplayName;
if(displayName == null) { displayName = DBNull.Value; }
parma.AddWithValue("@UserName", displayName);

但是!然后,这引发了一个问题:如果显示名称为<空> ,该代码应做什么 ?清楚显示的SQL查询不会以预期的方式运行.

However! This then invites the question: what should this code do if the display name is null? The SQL query shown clearly won't behave in the expected way.

这篇关于ExecuteScalar SQLException:标量变量未声明的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆