public DB(MainForm fm) { f = fm; ds = new DataSet(); th = f.th; //ds.ReadXml("db.xml"); //f.dbLabel.Text="db.xml"; }
//выполнить Update public void Update() { try { CultureInfo provider = CultureInfo.InvariantCulture; //находим имя таблицу, из которой делаем выборку даных String tableName = TreeHelper.FindCreateTableName(f.treeView.Nodes[0]); DataTable tbl = ds.Tables[tableName]; //условие отбора стро для удаления string where = th.FindWhere(); //находим столбцы List <string> columns = TreeHelper.FindUpdateColumns(f.treeView.Nodes[0]); //значения столбцов List <string> values = TreeHelper.FindUpdateValues(f.treeView.Nodes[0]); DataRow[] foundRows = tbl.Select(where); //Обновляем отобранные строки for (int i = 0; i < foundRows.Length; i++) { for (int j = 0; j < columns.Count; j++) // цикл по обновляемым полям { if (tbl.Columns[columns[j]].DataType == System.Type.GetType("System.String")) { foundRows[i][columns[j]] = values[j].Replace("'", ""); //удаляем лишние одинарные кавычки } else if (tbl.Columns[columns[j]].DataType == System.Type.GetType("System.DateTime")) { try { foundRows[i][columns[j]] = DateTime.ParseExact(values[j].Replace("'", ""), "dd.MM.yyyy HH:mm", provider); //преобразуем строку в дату } catch { try { foundRows[i][columns[j]] = DateTime.ParseExact(values[j].Replace("'", ""), "dd.MM.yyyy HH", provider); //преобразуем строку в дату } catch { foundRows[i][columns[j]] = DateTime.ParseExact(values[j].Replace("'", ""), "dd.MM.yyyy", provider); //преобразуем строку в дату } } } else { if (tbl.Columns[columns[j]].DataType == System.Type.GetType("System.Decimal")) { foundRows[i][columns[j]] = Convert.ToDecimal(values[j], new CultureInfo("en-US")); } else { foundRows[i][columns[j]] = values[j]; } } } } f.resultBox.Text += ">Ок"; } catch (Exception e) { f.resultBox.Text += ">" + e.Message + Environment.NewLine; } }
//выполнить select public void Select() { try { //находим имя таблицы, из которой делаем выборку даных List <string> tables = th.FindSelectTable(); // таблица в БД DataTable dt = ds.Tables[tables[0]]; // представление данных после выполнения запроса select DataTable rsltDt = dt.Copy(); //выражение where string expression = th.FindWhere(); // выражение orderby string orderby = th.FindSelectOrderBy(); // список столбцов в запросе List <SelectColumn> clmns = TreeHelper.FindSelectColumns(f.treeView.Nodes[0]); //добавляем функции и выражения в таблицу - определяем новые столбцы, //у уоторыйх Expression определяет функцию и выражение for (int i = 0; i < clmns.Count; i++) { SelectColumn tc = clmns[i]; if (tc.ColumnType != SelectColumnType._column) { DataColumn newColumn = new DataColumn(); //newColumn.DataType = String; newColumn.ColumnName = tc.Column_name; if (tc.Column_alias != "") { newColumn.Caption = tc.Column_alias; } else { newColumn.Caption = tc.Column_name; } newColumn.Expression = tc.Expr; rsltDt.Columns.Add(newColumn); } else { if (tc.Column_alias != "") { rsltDt.Columns[tc.Column_name].Caption = tc.Column_alias; } } } //!!!!!здесь происходит select и упорядочивани штатными соедствамии класса DataTable!!!!!! DataRow[] foundRows = rsltDt.Select(expression, orderby); // если запрос ничего не вернул if (foundRows.Length == 0) { f.resultBox.Text += ">Запрос вернул пустое множество" + Environment.NewLine; return; } //создаем структуру выходных полей: //добавляем поля,функции и выражения, которые есть в запросе, в таблицу DataTable rsltTable = new DataTable(); for (int i = 0; i < clmns.Count; i++) { DataColumn newColumn = new DataColumn(); SelectColumn tc = clmns[i]; if (tc.Column_name != "*") { newColumn = foundRows[0].Table.Columns[tc.Column_name]; if (newColumn != null) { DataColumn cl = new DataColumn(); cl.ColumnName = newColumn.ColumnName; cl.Caption = newColumn.Caption; cl.DataType = newColumn.DataType; rsltTable.Columns.Add(cl); } else { f.resultBox.Text += ">Набор данных не содержит поле \"" + tc.Column_name + "\"" + Environment.NewLine; return; } } else {// если в запросе звездочки for (int k = 0; k < foundRows[0].Table.Columns.Count; k++) { newColumn = foundRows[0].Table.Columns[k]; DataColumn cl = new DataColumn(); cl.ColumnName = newColumn.ColumnName; cl.Caption = newColumn.Caption; cl.DataType = newColumn.DataType; rsltTable.Columns.Add(cl); } } } //копируем строки в rsltTable for (int i = 0; i < foundRows.Length; i++) { DataRow row = rsltTable.NewRow(); for (int j = 0; j < rsltTable.Columns.Count; j++) { string colName = rsltTable.Columns[j].ColumnName; row[colName] = foundRows[i][colName]; } rsltTable.Rows.Add(row); } //выводим результат // печатаем шапку for (int i = 0; i < rsltTable.Columns.Count; i++) { f.resultBox.Text += "<" + rsltTable.Columns[i].Caption + ">\t"; } f.resultBox.Text += Environment.NewLine; // Печатаем результирующаю таблицу for (int i = 0; i < rsltTable.Rows.Count; i++) { for (int j = 0; j < rsltTable.Rows[i].ItemArray.Length; j++) { f.resultBox.Text += rsltTable.Rows[i][j] + "\t"; } f.resultBox.Text += Environment.NewLine; } } catch (Exception e) { f.resultBox.Text += ">" + e.Message + Environment.NewLine; } }
//выполнить Insert public void Insert() { try { CultureInfo provider = CultureInfo.InvariantCulture; //находим имя таблицу, из которой делаем выборку даных String tableName = TreeHelper.FindCreateTableName(f.treeView.Nodes[0]); DataTable tbl = ds.Tables[tableName]; //находим столбцы List <string> columns = TreeHelper.FindInsertColumns(f.treeView.Nodes[0]); //значения столбцов List <string> values = TreeHelper.FindInsertValues(f.treeView.Nodes[0]); // вставляем строку { DataRow row = tbl.NewRow(); for (int i = 0; i < columns.Count; i++) { if (tbl.Columns[i].DataType == System.Type.GetType("System.String")) { row[columns[i]] = values[i].Replace("'", ""); //удаляем лишние одинарные кавычки } else if (tbl.Columns[i].DataType == System.Type.GetType("System.DateTime")) { try { row[columns[i]] = DateTime.ParseExact(values[i].Replace("'", ""), "dd.MM.yyyy HH:mm:ss", provider); //преобразуем строку в дату } catch { try { row[columns[i]] = DateTime.ParseExact(values[i].Replace("'", ""), "dd.MM.yyyy HH:mm", provider); //преобразуем строку в дату } catch { try { row[columns[i]] = DateTime.ParseExact(values[i].Replace("'", ""), "dd.MM.yyyy HH", provider); //преобразуем строку в дату } catch { row[columns[i]] = DateTime.ParseExact(values[i].Replace("'", ""), "dd.MM.yyyy", provider); //преобразуем строку в дату } } } } else { if (tbl.Columns[i].DataType == System.Type.GetType("System.Decimal")) { row[columns[i]] = Convert.ToDecimal(values[i], new CultureInfo("en-US")); } else { row[columns[i]] = values[i]; } } } tbl.Rows.Add(row); f.resultBox.Text += ">Ок"; } catch (Exception e) { f.resultBox.Text += ">" + e.Message + Environment.NewLine; } }