//Кнопка сохранения в MySQL private async void button7_Click(object sender, RoutedEventArgs e) { //Выключаем кнопку button7.IsEnabled = false; button7.Tag = button7.Content; button7.Content = "Processing..."; SQLConnectionParams SqlConnParams = new SQLConnectionParams(); DB db = new DB(); SqlConnParams.tablename = textBox1.Text; SqlConnParams.hostname = textBox3.Text; SqlConnParams.database = textBox4.Text; SqlConnParams.user = textBox5.Text; SqlConnParams.passwd = textBox6.Text; int Completed; if (Filtered_dt == null) { // Включаем видимость прогрессбара и задаем его максимальное число Progressbar.Maximum = dt.Rows.Count - 1; Progressbar.Visibility = Visibility.Visible; Completed = await db.SaveDataTableToMySQLAsync(dt, SqlConnParams); } else { // Включаем видимость прогрессбара и задаем его максимальное число Progressbar.Maximum = Filtered_dt.Rows.Count - 1; Progressbar.Visibility = Visibility.Visible; Completed = await db.SaveDataTableToMySQLAsync(Filtered_dt, SqlConnParams); } if (Completed > 0) { Progressbar.Value = Progressbar.Maximum; MessageBox.Show("Export Complete. " + Completed + " rows added."); } //Включаем кнопку button7.IsEnabled = true; button7.Content = button7.Tag; button7.Tag = ""; }
//Метод извлечения из базы данных MySQL public async Task <DataTable> GetDatatableFromMySQLAsync(SQLConnectionParams SqlConnParams) { return(await Task.Run(() => { string conString = @"Data Source=" + SqlConnParams.hostname + ";port=3306;Initial Catalog=" + SqlConnParams.database + ";User Id=" + SqlConnParams.user + ";password="******""; try { MySqlConnection conn = new MySqlConnection(conString); MySqlCommand cmd = new MySqlCommand("SELECT * FROM " + SqlConnParams.tablename, conn); cmd.CommandType = CommandType.Text; MySqlDataAdapter sda = new MySqlDataAdapter(cmd); DataTable results = new DataTable(); sda.Fill(results); //Удаляем первый столбец - там ID шник results.Columns.RemoveAt(0); int progress = 0; //Инкрементируем прогрессбар System.Threading.Thread.Sleep(1); //Задержка, чтобы не перегружать UI progress += 0; ProcessChanged(progress); //Вызыывем событие ProcessChanged и передаем ему текущий прогресс if (_cancelled) // Если флаг отмены true то прервать операцию { _cancelled = false; ProcessChanged(0); //Вызыывем событие ProcessChanged и передаем ему текущий прогресс DataTable emptyDT = new DataTable(); return emptyDT; } return results; } catch { DataTable results = new DataTable(); return results; } })); }
//Кнопка загрузки из MySQL private async void button6_Click(object sender, RoutedEventArgs e) { //Выключаем кнопку button6.IsEnabled = false; button6.Tag = button6.Content; button6.Content = "Processing..."; dt = new DataTable(); DB db = new DB(); SQLConnectionParams SqlConnParams = new SQLConnectionParams(); SqlConnParams.tablename = textBox7.Text; SqlConnParams.hostname = textBox3.Text; SqlConnParams.database = textBox4.Text; SqlConnParams.user = textBox5.Text; SqlConnParams.passwd = textBox6.Text; dt = await db.GetDatatableFromMySQLAsync(SqlConnParams); dataGrid.ItemsSource = null; dataGrid.ItemsSource = dt.AsDataView(); Progressbar.Value = Progressbar.Maximum; MessageBox.Show("Import Complete."); //Включаем кнопку button6.IsEnabled = true; button6.Content = button6.Tag; button6.Tag = ""; }
public async Task <int> SaveToExistingTableAsync(DataTable DataTable, SQLConnectionParams SqlConnParams) { return(await Task.Run(() => { //Cоздаем экземпляр класса для работы с Mysql MySqlExecuter MySqlExec = new MySqlExecuter(SqlConnParams); MySqlExec.ConnectionOpen(); //Окрываем соединеие MySqlExec.ExecSQL("SET AUTOCOMMIT=0;"); //Включаем в базе данных ручной коммит транзакций MySqlExec.ExecSQL("START TRANSACTION;"); // Начинаем транзакцию string SQLstring = ""; //========ФОРМИРУЕМ ЗНАЧЕННИЯ=========== //Формируем SQL строку INSERT //Переменная для оптимизации прогреса - чтобы обновляеть интерфейс не на каждой итерации цикла, а раз в N раз int SkipsCounter = 0; int devider = 5; //Переменная указывает в дальнейшем коде раз в какое число бы будем обновляем прогресс бар. Чтобы обращаться к интерфейсу как можно реже и не обновлять его слишком часто при загрузке очень большого кол-ва строк. if (DataTable.Rows.Count > 500 & DataTable.Rows.Count < 15000) //Если строк больше 500 но меньше 15000 { devider = 20; } else if (DataTable.Rows.Count > 15000) // Если файл больше 15000 { devider = 100; } int progress = 0; foreach (DataRow row in DataTable.Rows)//Перибераем строки { SQLstring = "INSERT INTO " + SqlConnParams.tablename + "("; string SQLstringColumnsTail = ""; foreach (var Column in DataTable.Columns) //Перебираем колонки, чтобы сформировать список полей для SQL строки { string ColumnName = Column.ToString(); ColumnName = CheckWord(ColumnName); //Проверяем слова SQLstringColumnsTail = SQLstringColumnsTail + ColumnName + ", "; } SQLstringColumnsTail = SQLstringColumnsTail.Remove(SQLstringColumnsTail.Length - 2, 2); SQLstring = SQLstring + SQLstringColumnsTail + ") values("; string SQLstringValuesTail = ""; //Для парамертризации sql запросов создаем коллекцию параметров типа ключ значение. //Эта коллекция будет содержать список ключ значение соответвующее параметру со знаком @ в строке INSERT и значению реально требующемуся для записи в базу данных, тоесть содержимому ячейки из Datatable Dictionary <string, string> MySQLParametersList = new Dictionary <string, string> (); foreach (var Column in DataTable.Columns) //Перебираем колонки, чтобы сформировать значений для SQL строки (значения колоной используем в качестве индекса для Row) { string ColumnName = Column.ToString(); // В качестве значения добавляем название колонки со знаком @, чтобы конечная срока SQL выглядела примерно так : INSERT INTO tablename (Column1, Column2) VALUES (@Column1, @Column2) SQLstringValuesTail = SQLstringValuesTail + "@" + ColumnName + ", "; //Добавим к коллекции параметров название колонки ( @Column1 ) в качестве ключа Key , и содержимое ячейеки в качестве значения Value row[ColumnName].ToString() MySQLParametersList.Add("@" + ColumnName, row[ColumnName].ToString()); } SQLstringValuesTail = SQLstringValuesTail.Remove(SQLstringValuesTail.Length - 2, 2); SQLstring = SQLstring + SQLstringValuesTail + ")"; //Выполняем команду SQL - передаем строку SQL и список параметров для параметризированного запроса MySqlExec.ExecSQL(SQLstring, MySQLParametersList); //Инкрементируем прогрессбар if (SkipsCounter <= devider) //Если счетчик пропусков меньше либо равен заданному значению числа пропусков { SkipsCounter++; //Инкрементируем счетчик } else //Если счетчик достиг большего значения { System.Threading.Thread.Sleep(1); //Задержка для освобождения UI SkipsCounter++; //Инкрементируем счетчик progress += SkipsCounter; //Добавляем к прогресу длинну текущей агрегатора линий ProcessChanged(progress); //Вызыывем событие ProcessChanged и передаем ему текущий прогресс //Счетчик пропусков SkipsCounter = 0; } if (_cancelled)// Если флаг отмены true то прервать операцию { _cancelled = false; ProcessChanged(0); //Вызыывем событие ProcessChanged и передаем ему текущий прогресс MySqlExec.ConnectionClose(); //Закрываем соединение return 0; } } MySqlExec.ExecSQL("COMMIT;"); // Завершаем транзакцию MySqlExec.ConnectionClose();//Закрываем соединение //КОНЕЦ========ФОРМИРУЕМ ЗНАЧЕННИЯ=========== return progress + SkipsCounter; })); }
public MySqlExecuter(SQLConnectionParams SqlConnParams) //В конструкторе при создании экземпляра класса получаем на вход параметры SQL соединеия нашего типа SQLConnectionParams { this.SqlConnParams = SqlConnParams; }