/// <summary> /// Проверяет правильность составленого SELECT по схеме исходной БД /// </summary> /// <param name="ds">Схема исходной БД</param> /// <param name="from">Оператор FROM</param> public void Validate(DataSet ds, FromClass from) { //если таблица одна, то мы ее ставим по умолчанию if (from.Count == 1) { this.defaultTable = from[0]; } if (paint.Count >0 ) { this.paint.Validate(ds, this.defaultTable); } for (int i=0; i<l.Count; i++) { if (isString(i)) { string curTable = this.Table(i); DataTable table = ds.Tables[curTable]; if (table == null) { string al = this.baseSql.alias.GetTableAlias(curTable); if (al == null) throw new NotExistException("Не найдено таблицы в DataSet-e: " + curTable); if (ds.Tables[al]!=null) table = ds.Tables[al]; else throw new NotExistException("Не найдено таблицы в DataSet-e: " + curTable); } if (this[i] == "*") { l.RemoveAt(i); i=-1; for (int j=0; j<table.Columns.Count;j++) { //l.Add( new Data(curTable, table.Columns[j].ColumnName.ToString())); //if (!isExist(table.Columns[j].ColumnName.ToString())) //{ this.Add(curTable, table.Columns[j].ColumnName.ToString()); //} } continue; } string ColName = this[i]; if (table.Columns[this[i]] == null) { //проверяем наличие колонки в Алиасе if (this.baseSql.alias.GetColumnAlias(this[i]) == null) throw new NotExistException("Не найдено колонки в DataSet-e: "+ curTable+"."+ this[i]); else ColName = this.baseSql.alias.GetColumnAlias(this[i]).name; } //Мы добавлем типы данных в Select if (table.Columns[ColName].DataType == typeof(String)) ((Data)l[i]).type = ElementType.STRING; else if (table.Columns[ColName].DataType == typeof(Decimal)) ((Data)l[i]).type = ElementType.DECIMAL; else if (table.Columns[ColName].DataType == typeof(DateTime)) ((Data)l[i]).type = ElementType.DATE; // //} } else { GetSQL(i).Validate(ds); } } }
/// <summary> /// Упрощает схему SQL-запрсоа. Проверяет колонок и таблиц на существование в DataSet-е /// </summary> /// <param name="ds">Схема датасета</param> /// <param name="from">From-класс</param> public void Simplify(DataSet ds, FromClass from) { for (int i=0; i<l.Count; i++) { if (isString(i)) { string curTable = this.Table(i); DataTable table = ds.Tables[curTable]; if (table == null) { //Должны посмареть Алиас string al = this.baseSql.alias.GetTableAlias(curTable); if (al == null) throw new NotExistException("Не найдено таблицы в DataSet-e: " + curTable); if (ds.Tables[al]!=null) table = ds.Tables[al]; else throw new NotExistException("Не найдено таблицы в DataSet-e: " + curTable); } if (this[i] == "*") { l.RemoveAt(i); i--; for (int j=0; j<table.Columns.Count;j++) this.Add(curTable, table.Columns[j].ColumnName.ToString()); continue; } } else { GetSQL(i).Siplify(ds); } } }
/// <summary> /// Конструктор /// </summary> public SQLStruct() { select = new SelectClass(this); from = new FromClass(this); where = new WhereClass(this); As = new AsClass(this); group = new GroupClass(this); }