【问题标题】:C# ExecuteScalar() [duplicate]C# ExecuteScalar() [重复]
【发布时间】:2018-10-20 22:47:00
【问题描述】:

我正在尝试制作掷骰子游戏,存储用户/游戏数据等。在这个问题中,我试图查看用户名是否已被使用。但由于某种原因,无论我如何尝试声明我的变量以获取 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 不起作用,字符串不起作用,并且将 DbResult 声明为对象不起作用。明白为什么不能转换成int,但不知道为什么还要继续尝试。

感谢您的帮助。

【问题讨论】:

  • 这就是为什么这是重复的:您将string 传递给带有AddWithValue 的参数,它假定参数是NVARCHAR,而它应该是int(根据到USERID)。使用cmd.Parameters.Add("alias", DbType.Int32).Value = tbNewUsername.Text;(或类似的,我没有打开VS)
  • 我找到了。 "SELECT * FROM Users WHERE USERID = @alias" 您将用户 ID(整数主键)与字符串输入进行比较。如果您具体说明这是编译时错误还是运行时错误,将会有很大帮助:) 我仍然坚持需要重新设计它。

标签: c# sql executescalar


【解决方案1】:

在 GUI 而不是 DB 中进行这种检查可能是个坏主意。这样你只会遇到竞争条件。通常你:

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

诸如通知注册用户名称已被占用之类的东西?这是 Register UI 的一项附加生活质量功能,而不是核心功能。

编译器错误不会对您显示的代码产生任何影响。那只剩下一个选择:其他的东西——可能在这些线之上——严重地绊倒了编译器,它甚至不能告诉你问题出在哪里了。

编辑:另一个问题是您没有处理连接。这会给你带来问题。您应该始终使用网络连接和文件访问来实现使用模式。以及任何其他实现 IDisposeable 的东西。

【讨论】:

  • 谁在没有任何关于我做错了什么的信息的情况下一直对我投反对票?声望不到 2000 年,我想我至少应该得到一个解释。
  • 阅读我在问题下的评论,了解为什么有人可能对你投了反对票
  • @CamiloTerevinto:谁不同意 Race Condition 证明你的代码?还有哪些其他可靠的选项来证明数据库访问的竞争条件?
  • 可能不是因为那个,而是因为编译器错误(没有),假设超过1个用户使用系统等。或者它很可能是因为有人不喜欢你,我们不知道:)
【解决方案2】:

你看过Microsoft 的例子吗?他们有以下示例,它告诉您如何使用ExecuteScalar 函数以及期望的返回类型:

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

【讨论】:

  • 虽然是一个很好的通用答案,但这并不能真正解决问题。特别是Object DbResult = cmd.ExecuteScalar(); //&lt;-ERROR coudl 如何将“无法从 nVarChar 转换为 int”作为编译器警告。据我所知,他在这段代码中所做的一切都是正确的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-19
  • 1970-01-01
  • 1970-01-01
  • 2013-07-06
  • 1970-01-01
  • 2016-08-07
相关资源
最近更新 更多