jjzjj

c# - 执行 SQL 查询时显示进度条

coder 2024-05-31 原文

我想在从 SQL 数据库读取数据时通知用户 我决定创建一个带有进度条的表单,但它不起作用——可能是因为需要一个线程。我想以编程方式创建表单

        ProgressBar pb = new ProgressBar();

        pb.MarqueeAnimationSpeed = 30;
        pb.Style = ProgressBarStyle.Marquee;
        pb.Dock = DockStyle.Fill;

        progressForm.ClientSize = new Size(200, 50);
        progressForm.FormBorderStyle = FormBorderStyle.FixedDialog;
        progressForm.StartPosition = FormStartPosition.CenterScreen;
        progressForm.Controls.Add(pb);
        progressForm.ControlBox = false;
        progressForm.TopMost = true;

        progressForm.Show();  
        //do data processes here (all queries and executes)
        progressForm.close();

我如何修改上面的代码来实现我的既定目标?

编辑:顺便说一句,我想在我项目的每个数据函数中使用这个进度条形式。例如:fillGrid、runQuery..

@Will 非常感谢您的回答。我的意思是如何使用类的函数,例如我的 gridFill 函数在该连接类中:

 class ConnectionClass
    {
       public static SqlConnection connection = new SqlConnection();

    public string sorgu;
    public static string server;
    public static string userId;
    public static string catalog;
    public static string password;
    public static string accessMethod;
    public DataSet ds = new DataSet();
    Form progressForm = new Form();       

    public bool Open()
    {
        try
        {
            if (connection.State != ConnectionState.Open)
            {

                connection.ConnectionString = "Data Source = " + server + ";" +
                                              "Initial Catalog=" + catalog + ";" +
                                              "User ID=" + userId + ";" +
                                              "Password=" + password + ";" +
                                              "Connect Timeout=0";

                connection.Open();
                return true;
            }
            else
            {
                return true;
            }


        }
        catch (Exception ex)
        {
            MessageBox.Show("System message:" + ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            return false;
        }

    }

    public DataTable Dt(string query)
    {
        DataTable dt = new DataTable();
        if (Open())
        {
            SqlDataAdapter da = new SqlDataAdapter(query, connection);
            try
            {   
                //progressForm.Showdialog()  is this possible???
                da.Fill(dt);
                //progressForm.close(); ??
            }
            catch (Exception ex)
            {
                MessageBox.Show("Sistem Mesajı:" + ex.Message, "Hata", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }         
        return dt;
    }

    public bool Run(string query, string hataMsj)
    {
        Form activeForm = Form.ActiveForm;
        query = " SET DATEFORMAT DMY " + query;

        SqlCommand sc = new SqlCommand(query, connection);
        try
        {
            Open();
            sc.ExecuteNonQuery();
            return true;
        }           
        catch (Exception )
        {
            return false;
        }
    }

    public void fillComboBox(string sorgu, ComboBox cb, string text, string value)
    {
        DataTable dt = Dt(sorgu);

        cb.DisplayMember = text;
        cb.ValueMember = value;
        cb.DataSource = dt;
        if (cb.Items.Count > 0)
        {
            cb.SelectedIndex = 0;
        }

    }

    public int fillGridView(string sorgu, DataGridView dgv)
    {
        DataTable dtGrvw = Dt(sorgu);
        dgv.DataSource = dtGrvw;
        return 1;
    }       
    }

以及来自另一个表单(类)的示例查询

   ConnectionClass cc = new ConnectionClass();

    query= "  INSERT INTO tblPersonel (" +
                                          " [sqlUserName] " +
                                          ",[personelNo] " +
                                          ",[ad] " +
                                          ",[soyad] " +
                                          ",[departmanId] " +
                                          ",[emailadres] " +
                                          ",[tcKimlikNo],[kangurubu],[dokumaciNo])VALUES" +
                                          "('" + tbSqlUserName.Text +
                                          "','" + tbPersonelNo.Text +
                                          "','" + tbAd.Text +
                                          "','" + tbSoyad.Text +
                                          "','" + cbDepartman.SelectedValue.ToString() +
                                          "','" + tbMail.Text +
                                          "','" + tbKimlikno.Text + 
                                          "','" + tbKangrubu.Text + 
                                          "','" + tbDokumaciNo.Text + "' ) ";
                    if (cc.Run(query, "Unexpected error on insert new person"))
                    {
                        fillGrid();
                        this.Close();

                    }

    public void fillGrid()
    {
        query= " select * from View_Personel order by personelNo desc";
        cc.fillGridView(query, gridviewPersonel);
    }

我无法想象如何在 bw_DoWork 事件中使用它。因为我的函数有参数。(query, gridview) 当我从另一个类调用它时,我可以将它与参数一起使用...

附注: this Method对我来说很好,但没有用。没看懂问题

最佳答案

使用 BackgroundWorker 类填充您的 DataGrid。

     Form progressForm;

     public void func() {
        BackgroundWorker bw = new BackgroundWorker ();
        bw.DoWork += new DoWorkEventHandler (bw_DoWork);
        bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler (bw_RunWorkerCompleted);

        progressForm = new Form ();

        ProgressBar pb = new ProgressBar ();

        pb.MarqueeAnimationSpeed = 30;
        pb.Style = ProgressBarStyle.Marquee;
        pb.Dock = DockStyle.Fill;

        progressForm.ClientSize = new Size (200, 50);
        progressForm.FormBorderStyle = FormBorderStyle.FixedDialog;
        progressForm.StartPosition = FormStartPosition.CenterScreen;
        progressForm.Controls.Add (pb);
        progressForm.ControlBox = false;
        progressForm.TopMost = true;

        progressForm.Show ();

        string queryString = "SELECT ...."; // fill query string here
        var params = new KeyValuePair<GridControl, string>(sorgu, queryString);
        bw.RunWorkerAsync (params);
    }

    void bw_DoWork (object sender, DoWorkEventArgs e) {
        KeyValuePair<GridControl, string> params = e.Argument as KeyValuePair<GridControl, string>;
        ConnectionClass cc = new Connection Class();
        cc.fillGrid(params.Value, params.Key);
    }

    void bw_RunWorkerCompleted (object sender, RunWorkerCompletedEventArgs e) {
        progressForm.Close (); //
    }

可以向 BackgroundWorker 发送参数。如果您需要多个参数,您可以发送一个包含您需要的任何对象的元组。

编辑:如果您使用的是 3.5,则可以改用 KeyValuePair。为此更新了代码。

关于c# - 执行 SQL 查询时显示进度条,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8447856/

有关c# - 执行 SQL 查询时显示进度条的更多相关文章

  1. ruby-openid:执行发现时未设置@socket - 2

    我在使用omniauth/openid时遇到了一些麻烦。在尝试进行身份验证时,我在日志中发现了这一点:OpenID::FetchingError:Errorfetchinghttps://www.google.com/accounts/o8/.well-known/host-meta?hd=profiles.google.com%2Fmy_username:undefinedmethod`io'fornil:NilClass重要的是undefinedmethodio'fornil:NilClass来自openid/fetchers.rb,在下面的代码片段中:moduleNetclass

  2. ruby - ECONNRESET (Whois::ConnectionError) - 尝试在 Ruby 中查询 Whois 时出错 - 2

    我正在用Ruby编写一个简单的程序来检查域列表是否被占用。基本上它循环遍历列表,并使用以下函数进行检查。require'rubygems'require'whois'defcheck_domain(domain)c=Whois::Client.newc.query("google.com").available?end程序不断出错(即使我在google.com中进行硬编码),并打印以下消息。鉴于该程序非常简单,我已经没有什么想法了-有什么建议吗?/Library/Ruby/Gems/1.8/gems/whois-2.0.2/lib/whois/server/adapters/base.

  3. ruby - Chef 执行非顺序配方 - 2

    我遵循了教程http://gettingstartedwithchef.com/,第1章。我的运行list是"run_list":["recipe[apt]","recipe[phpap]"]我的phpapRecipe默认Recipeinclude_recipe"apache2"include_recipe"build-essential"include_recipe"openssl"include_recipe"mysql::client"include_recipe"mysql::server"include_recipe"php"include_recipe"php::modul

  4. ruby-on-rails - 在 Rails 和 ActiveRecord 中查询时忽略某些字段 - 2

    我知道我可以指定某些字段来使用pluck查询数据库。ids=Item.where('due_at但是我想知道,是否有一种方法可以指定我想避免从数据库查询的某些字段。某种反拔?posts=Post.where(published:true).do_not_lookup(:enormous_field) 最佳答案 Model#attribute_names应该返回列/属性数组。您可以排除其中一些并传递给pluck或select方法。像这样:posts=Post.where(published:true).select(Post.attr

  5. ruby - 为什么 Ruby 的 each 迭代器先执行? - 2

    我在用Ruby执行简单任务时遇到了一件奇怪的事情。我只想用每个方法迭代字母表,但迭代在执行中先进行:alfawit=("a".."z")puts"That'sanalphabet:\n\n#{alfawit.each{|litera|putslitera}}"这段代码的结果是:(缩写)abc⋮xyzThat'sanalphabet:a..z知道为什么它会这样工作或者我做错了什么吗?提前致谢。 最佳答案 因为您的each调用被插入到在固定字符串之前执行的字符串文字中。此外,each返回一个Enumerable,实际上您甚至打印它。试试

  6. c# - 如何在 ruby​​ 中调用 C# dll? - 2

    如何在ruby​​中调用C#dll? 最佳答案 我能想到几种可能性:为您的DLL编写(或找人编写)一个COM包装器,如果它还没有,则使用Ruby的WIN32OLE库来调用它;看看RubyCLR,其中一位作者是JohnLam,他继续在Microsoft从事IronRuby方面的工作。(估计不会再维护了,可能不支持.Net2.0以上的版本);正如其他地方已经提到的,看看使用IronRuby,如果这是您的技术选择。有一个主题是here.请注意,最后一篇文章实际上来自JohnLam(看起来像是2009年3月),他似乎很自在地断言RubyCL

  7. C# 到 Ruby sha1 base64 编码 - 2

    我正在尝试在Ruby中复制Convert.ToBase64String()行为。这是我的C#代码:varsha1=newSHA1CryptoServiceProvider();varpasswordBytes=Encoding.UTF8.GetBytes("password");varpasswordHash=sha1.ComputeHash(passwordBytes);returnConvert.ToBase64String(passwordHash);//returns"W6ph5Mm5Pz8GgiULbPgzG37mj9g="当我在Ruby中尝试同样的事情时,我得到了相同sha

  8. ruby-on-rails - 有没有办法为 CarrierWave/Fog 设置上传进度指示器? - 2

    我在Rails应用程序中使用CarrierWave/Fog将视频上传到AmazonS3。有没有办法判断上传的进度,让我可以显示上传进度如何? 最佳答案 CarrierWave和Fog本身没有这种功能;你需要一个前端uploader来显示进度。当我不得不解决这个问题时,我使用了jQueryfileupload因为我的堆栈中已经有jQuery。甚至还有apostonCarrierWaveintegration因此您只需按照那里的说明操作即可获得适用于您的应用的进度条。 关于ruby-on-r

  9. ruby - 检查是否通过 require 执行或导入了 Ruby 程序 - 2

    如何检查Ruby文件是否是通过“require”或“load”导入的,而不是简单地从命令行执行的?例如:foo.rb的内容:puts"Hello"bar.rb的内容require'foo'输出:$./foo.rbHello$./bar.rbHello基本上,我想调用bar.rb以不执行puts调用。 最佳答案 将foo.rb改为:if__FILE__==$0puts"Hello"end检查__FILE__-当前ruby​​文件的名称-与$0-正在运行的脚本的名称。 关于ruby-检查是否

  10. 基于C#实现简易绘图工具【100010177】 - 2

    C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.

随机推荐