c# - C# 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 不起作用,字符串不起作用,并且将 DbResult 声明为对象不起作用。我明白为什么它不能转换为int,但我不知道为什么它继续尝试。
感谢您的任何帮助。
解决方案
在 GUI 而不是 DB 中进行这种检查可能是一个坏主意。这样你只会遇到竞争条件。通常你:
- 将表格设置为仅允许唯一(登录)名称
- 尝试插入特定的新用户
- 插入失败或不失败
诸如通知注册用户名称已被占用之类的东西?这是 Register UI 的附加生活质量功能,而不是核心功能。
编译器错误不会对您显示的代码产生任何影响。那只剩下一个选择:其他东西 - 可能超出这些线 - 严重地绊倒了编译器,它甚至无法告诉你问题出在哪里了。
编辑:另一个问题是您没有处理连接。这会给你带来问题。您应该始终使用网络连接和文件访问来实现使用模式。以及其他任何实现 IDisposeable 的东西。
推荐阅读
- javascript - 使用 moment.js 在当前时间尝试使用 isBefore 时的弃用警告
- apache - 使用 .htaccess 进行通配符重定向
- vba - 按 ID 或名称而不是数字导航到 PPT 幻灯片
- linux - 使用 wget o curl 进行多次下载
- html - 在css中调整特定图像的大小
- ffmpeg - 如何在歌曲 Discord.js 中寻找位置?
- r - 为什么ggplot会沿着我的时间序列geom_line间歇性地绘制直线?
- azure-pipelines - Azure Pipelines:PublishBuildArtifacts 和 PublishPipelineArtifact 任务之间的区别?
- javascript - 如何使滚动框响应?
- linux - 如何使用托管在 Kestrel/linux 中的 aspnet core 3.1 配置签名 SSL 证书