C#ExecuteScalar()

时间:2018-10-20 22:47:01

标签: c# sql executescalar

我正在尝试制作掷骰子游戏,存储用户/游戏数据等。在此问题中,我试图查看用户名是否已被占用。但是由于某种原因,无论我如何尝试声明变量以接受ExecuteScalar()的结果,我总是会收到错误“无法从nVarChar转换为int”。

private bool CheckForUser()
{
        //returns true if Username is already registered
        SqlConnection connection = new SqlConnection("...");
        string query = "SELECT * FROM Users WHERE USERID = @alias";
        SqlCommand cmd = new SqlCommand(query, connection);
        cmd.Parameters.AddWithValue("@alias", tbNewUsername.Text);
        connection.Open();
        Object DbResult = cmd.ExecuteScalar(); //<-ERROR
        connection.Close();
        DbResult = (DbResult == DBNull.Value) ? null : DbResult;

        if (DbResult != null)
            return true;
        else
            return false;

}

这是我寻求帮助之前的最后一次尝试。强制转换为int无效,string无效,并且将DbResult声明为对象无效。我了解为什么无法将其转换为int,但我不知道为什么它仍会继续尝试。

谢谢您的帮助。

2 个答案:

答案 0 :(得分:-1)

在GUI中进行这种检查,而不是在数据库中进行检查,这可能不是一个好主意。这样您只会遇到比赛条件。通常您:

  • 将表设置为仅允许唯一(登录)名称
  • 尝试插入特定的新用户
  • 插入失败或不失败

类似通知注册用户名称已被使用的东西吗?这是Register UI的附加生活质量功能,而不是核心功能。

编译器错误对您显示的代码没有任何影响。剩下的只有一个选择:可能超出这些界限的其他东西严重破坏了竞争对手,甚至无法告诉您问题出在哪里。

编辑:另一个问题是您没有断开连接。那会引起你的问题。您应该始终通过网络连接和文件访问来实现使用模式。还有其他实现IDisposeable的东西。

答案 1 :(得分:-2)

您是否看过Microsoft的示例?它们具有以下示例,该示例告诉您如何使用ExecuteScalar函数以及期望使用哪种返回类型:

cmd.CommandText = "SELECT COUNT(*) FROM dbo.region";  
Int32 count = (Int32) cmd.ExecuteScalar();