有Boolean一个功能:
根据以下建议重写:
public bool checkUser_Login(TextBox logingox)
{
var login = logingox.Text;
string checklogin = $"select count(login_users) from registration where login_users = '{login}'";
using (SqlConnection con = new SqlConnection(connectionString))
{
con.Open();
using (SqlCommand check = new SqlCommand(checklogin, con))
{
check.Parameters.Add("login_users", SqlDbType.VarChar).Value = login;
int result = (int)check.ExecuteScalar();
return result > 0;
}
}
}
检查数据库中的匹配项,如果这样的记录已经存在,则textBox返回,如果不存在则返回。我决定将这个“奇迹”与事件结合使用。得到一个示例代码:truefalse TextChanged
private void textBox1_TextChanged(object sender, EventArgs e)
{
if (checkUser_Login(TextBoxLogin) == true)
{
label2.Text = "Пользователь под ником, " + textBox1.Text + ", уже существует!";
button1.Enabled = false;
}else
{
label2.Text = "\0";
}
}
事实证明,如果登录已经注册,则实时检查的效果。我得到了适当的提示,绕过了首先使用按钮所花费的时间,然后尝试修复它(我不需要就超过 900000 个用户的软件速度提供任何建议,谢谢)。如何处理这种形式的异常 - отсутствия подключения. 那些。如果服务器关闭,那么我会得到一个简单的 - Подключение отсутствует。
结果是:
private async Task<bool> checkUser_Login(TextBox logingox)
{
var login = logingox.Text;
string checklogin = $"select login_users from registration where login_users = '{login}'";
using (var con = new SqlConnection(connectionString))
{
await con.OpenAsync();
using (var check = new SqlCommand(checklogin, con))
{
check.Parameters.Add("login_users", SqlDbType.VarChar).Value = login;
var result = (string)await check.ExecuteScalarAsync();
return result != null;
}
}
}
用法:
bool x = await checkUser_Login(textBox1);
if (x) {...}
并且不要忘记使用的方法中的异步。
private async void textBox1_TextChanged(object sender, EventArgs e)



我对使用 dB.getConnection() 获取数据库连接感到有些困惑。这就像“不根据 MS SQL”。
我会提供这个选项:
假设我们有一个“连接字符串”(这就是表达式连接字符串经常被翻译的方式)
那么上面对应的代码会写成这样:
如果数据库不可用,有一个明显的地方会发生错误 - 这是连接打开行:
cn.Open()现在,让我们推理。
你可以做一些廉价而愉快的事情:
try-catch用-em 包围这个特定的行,如果其中发生错误,向用户显示一个带有数据库不可用消息的消息框。但是,如果你仔细想想,这不是一个很好的策略。这并没有像我们希望的那样经过测试(尝试一下,测试 MessageBox 的外观 - 相信我,检查 Exception 测试要容易得多!)
此外,这混合了“接口层”(消息输出)和“逻辑层”。
此外,假设我们打开了与数据库的连接,但发生了其他一些错误。
通常,将与数据库的所有交互包装在 try-catch 中可能比在 checkUser_Login() 函数中处理它更好。
但是你需要在调用的地方添加异常处理。添加结构化异常处理以将“基本不可用”错误与其他不太可能的错误分开也是一个好主意。
下一步是过渡到与基础的异步交互,嗯,因为这是可能的。在那里,异常的行为方式也有一些特殊性。
小型代码审查。
这个:
替换为一行:
SqlDataAdapter能够打开和关闭连接本身并满足请求。也就是说,您可以简单地编写:
SqlDataAdapter需要将大量数据加载到DataTable. 同时,您正在从数据库中请求单个值。让我们重写代码以获得一个值。
让我们以正确的方式进行 - 使用参数化查询。
我不知道您的数据库表中有什么类型的列。在您的代码中指定适当的类型
SqlDbType。此外,无需从数据库返回登录信息。返回一些指示用户存在的简单值就足够了。例如:
现在,事实上,这个问题的答案。
使用块
try-catch。这里可能会出现以下问题:在长时间没有连接到数据库的情况下冻结的 GUI 界面。
要解决它,您应该使用异步代码。
就像是:
自然,调用此方法时,需要使用
await.现在您的应用程序界面将响应。