RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1416249
Accepted
tomato-magnet-regulato
tomato-magnet-regulato
Asked:2022-08-02 18:17:19 +0000 UTC2022-08-02 18:17:19 +0000 UTC 2022-08-02 18:17:19 +0000 UTC

处理与 MS SQL 数据库的连接错误

  • 772

有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)
c# winforms
  • 2 2 个回答
  • 114 Views

2 个回答

  • Voted
  1. S.H.
    2022-08-02T18:58:57Z2022-08-02T18:58:57Z

    我对使用 dB.getConnection() 获取数据库连接感到有些困惑。这就像“不根据 MS SQL”。

    我会提供这个选项:

    假设我们有一个“连接字符串”(这就是表达式连接字符串经常被翻译的方式)

    那么上面对应的代码会写成这样:

        const string connStr = "Password=secret_Pa$$w0rD;Persist Security Info=True;User ID=dbuser;Initial Catalog=DB-test;Data Source=sqlsrv,1433;";
    
        private Boolean checkUser_Login()
        {
            var login_user = textBox1.Text;
            string checklogin = $"select login_user from SignIN where login_user = '{login_user}'";
    
            
            using ( SqlConnection conn = new SqlConnection(connStr) ){
                cn.Open();
                using (SqlCommand command = new SqlCommand(checklogin, conn)){
                    
                    SqlDataAdapter adapter = new SqlDataAdapter();
                    DataTable table = new DataTable();
                    
                    adapter.SelectCommand = command;
                    adapter.Fill(table);            
    
                    if (table.Rows.Count > 0)
                    {
                        return true;
                    }
                    else
                    {
                        return false;
                    }
                }
            }
        }
    

    如果数据库不可用,有一个明显的地方会发生错误 - 这是连接打开行:cn.Open()

    现在,让我们推理。

    1. 你可以做一些廉价而愉快的事情:try-catch用-em 包围这个特定的行,如果其中发生错误,向用户显示一个带有数据库不可用消息的消息框。

    2. 但是,如果你仔细想想,这不是一个很好的策略。这并没有像我们希望的那样经过测试(尝试一下,测试 MessageBox 的外观 - 相信我,检查 Exception 测试要容易得多!)

    此外,这混合了“接口层”(消息输出)和“逻辑层”。

    此外,假设我们打开了与数据库的连接,但发生了其他一些错误。

    通常,将与数据库的所有交互包装在 try-catch 中可能比在 checkUser_Login() 函数中处理它更好。

    但是你需要在调用的地方添加异常处理。添加结构化异常处理以将“基本不可用”错误与其他不太可能的错误分开也是一个好主意。

    下一步是过渡到与基础的异步交互,嗯,因为这是可能的。在那里,异常的行为方式也有一些特殊性。

    • 1
  2. Best Answer
    Alexander Petrov
    2022-08-05T23:52:37Z2022-08-05T23:52:37Z

    小型代码审查。
    这个:

    if (table.Rows.Count > 0)
    {
        return true;
    }
    else
    {
        return false;
    }
    

    替换为一行:

    return table.Rows.Count > 0;
    

    SqlDataAdapter能够打开和关闭连接本身并满足请求。

    也就是说,您可以简单地编写:

    var adapter = new SqlDataAdapter(checklogin, connectionString);
    DataTable table = new DataTable();    
    adapter.Fill(table);
    

    SqlDataAdapter需要将大量数据加载到DataTable. 同时,您正在从数据库中请求单个值。

    让我们重写代码以获得一个值。
    让我们以正确的方式进行 - 使用参数化查询。

    private bool CheckUserLogin()
    {
        string login = loginTextBox.Text;
        string checkLogin = $"select login_user from SignIN where login_user = @login";
    
        using var connection = new SqlConnection(_connectionString);
        connection.Open();
    
        using var command = new SqlCommand(checkLogin, connection);
        command.Parameters.Add("login", SqlDbType.NVarChar).Value = login;
    
        var result = (string)command.ExecuteScalar();
        return result != null;
    }
    

    我不知道您的数据库表中有什么类型的列。在您的代码中指定适当的类型SqlDbType。


    此外,无需从数据库返回登录信息。返回一些指示用户存在的简单值就足够了。例如:

    string checkLogin = $"select count(login_user) from SignIN where login_user = @login";
    
    ...
    
    int result = (int)command.ExecuteScalar();
    return result > 0;
    


    现在,事实上,这个问题的答案。

    使用块try-catch。
    这里可能会出现以下问题:在长时间没有连接到数据库的情况下冻结的 GUI 界面。
    要解决它,您应该使用异步代码。

    就像是:

    private async Task<bool> CheckUserLoginAsync()
    {
        string login = loginTextBox.Text;
        string checkLogin = $"select login_user from SignIN where login_user = @login";
    
        await using var connection = new SqlConnection(_connectionString);
        await connection.OpenAsync();
    
        await using var command = new SqlCommand(checkLogin, connection);
        command.Parameters.Add("login", SqlDbType.NVarChar).Value = login;
    
        var result = (string)await command.ExecuteScalarAsync();
        return result != null;
    }
    

    自然,调用此方法时,需要使用await.
    现在您的应用程序界面将响应。

    • 1

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    我看不懂措辞

    • 1 个回答
  • Marko Smith

    请求的模块“del”不提供名为“default”的导出

    • 3 个回答
  • Marko Smith

    "!+tab" 在 HTML 的 vs 代码中不起作用

    • 5 个回答
  • Marko Smith

    我正在尝试解决“猜词”的问题。Python

    • 2 个回答
  • Marko Smith

    可以使用哪些命令将当前指针移动到指定的提交而不更改工作目录中的文件?

    • 1 个回答
  • Marko Smith

    Python解析野莓

    • 1 个回答
  • Marko Smith

    问题:“警告:检查最新版本的 pip 时出错。”

    • 2 个回答
  • Marko Smith

    帮助编写一个用值填充变量的循环。解决这个问题

    • 2 个回答
  • Marko Smith

    尽管依赖数组为空,但在渲染上调用了 2 次 useEffect

    • 2 个回答
  • Marko Smith

    数据不通过 Telegram.WebApp.sendData 发送

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5