【问题标题】:ExecuteScalar SQLException: scalar variable not declaredExecuteScalar SQLException:未声明标量变量
【发布时间】:2017-03-23 12:37:02
【问题描述】:

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

            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”类型的异常,但未在用户代码中处理

附加信息:必须声明标量变量“@UserName”。

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

请问,我该如何解决?

【问题讨论】:

    标签: c# asp.net sql-server


    【解决方案1】:

    因为你已经在此处添加一个参数:

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

    我猜activedirectory.DisplayName null。 ADO.NET 中一个奇怪的故障是带有null 值的参数没有传递。要将null 向下传递到数据库,您需要传递DBNull.Value。所以:

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

    或更多速记:

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

    但是!这就引出了一个问题:如果显示名称是null,这段代码应该做什么?清楚地显示的 SQL 查询不会以预期的方式运行。

    【讨论】:

      【解决方案2】:

      您好,请您将代码更改为以下内容

      var parma = new SqlParameter("@UserName",activedirectory.DisplayName);
                      userquery.Parameters.Add(parma);
      

      【讨论】:

      • 嗯...为什么?有原因吗?特别是,是否有与该问题相关的原因?我期望该更改会对问题中报告的问题产生任何影响。
      猜你喜欢
      • 1970-01-01
      • 2019-09-27
      • 1970-01-01
      • 1970-01-01
      • 2015-05-04
      • 1970-01-01
      • 2018-03-07
      • 1970-01-01
      • 2011-11-03
      相关资源
      最近更新 更多