none
如何多线程链接SQL Server(WPF) RRS feed

  • 问题

  •         DataSet ds = new DataSet();
            DataTable dt = new DataTable();
            SqlCommand comm = new SqlClient.SqlCommand();
            SqlConnection conn = new SqlClient.SqlConnection();
            SqlDataAdapter da = new SqlClient.SqlDataAdapter();        
    
    internal void ConnectToData(string srcTable, string WhereString, DataGrid datag)
            {
                conn.Close();
                conn.ConnectionString = ConnectionString; 
                else
                {
                    comm.CommandText = "Select * From " + srcTable; //设置命令
                }
                if (string.IsNullOrEmpty(WhereString) == false) comm.CommandText += WhereString; //看是否要查询数据
                // objconn 和 objcomm
                comm.Connection = conn; //链接
                da.SelectCommand = comm; //命令
                var builder = new SqlClient.SqlCommandBuilder(da);
                conn.Open(); //打开数据
                da.Fill(ds, srcTable); //填充数据
                dt = ds.Tables[srcTable]; //找到对应表格
                conn.Close(); //关闭连接
                if (datag != null)
                {
                    datag.ItemsSource = dt.DefaultView; //把数据填入表中
                }
            }
    
    这个是我链接SQL数据库的代码,使用WPF,测试无误。但是我觉得如果数据库的数据过多或者用户电脑太慢的话,加载数据就比较费劲,所以我想用多线程进行处理。但是我用多线程的话,每次都是在最后一行datag.ItemsSource = dt.DefaultView这里报错,说另一线程拥有该对象。用BackgroundWorker没有反应。请问各位如何使用多线程连接数据?

    2019年10月2日 4:11

答案

  • Hi  Aileen--1024, 

    >> 这个是我链接SQL数据库的代码,使用WPF,测试无误。但是我觉得如果数据库的数据过多或者用户电脑太慢的话,加载数据就比较费劲,所以我想用多线程进行处理。但是我用多线程的话,每次都是在最后一行datag.ItemsSource = dt.DefaultView这里报错,说另一线程拥有该对象。用BackgroundWorker没有反应。请问各位如何使用多线程连接数据?

    WPF 会将其大多数对象与 UI 线程进行关联。这称之为线程关联,意味着要使用一个 WPF 对象,只能在创建它的线程上使用。 所以你再其他线程使用UI 线程的对象,就会报此类错误。

    你可以使用Dispatcher 来更新UI 线程对象数据。

     Application.Current.Dispatcher.BeginInvoke(DispatcherPriority.Normal,
                    new Action(() =>
                    {
                         datag.ItemsSource = dt.DefaultView; //把数据填入表中
                    }));
    
    Best regards

    Yong Lu


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2019年10月2日 8:35
    版主