2012-03-09 3 views
4

Мне было поручено написать приложение winforms C#, которое позволяет пользователям запускать специальные запросы. Я искал в Интернете и нашел много инструментов, которые можно купить (EasyQuery), но на этот раз покупка не может быть и речи.Написание инструмента динамического запроса Winforms

Так что я пытаюсь написать это сам. В этот момент я создал древовидное представление, которое заполняется во время выполнения таблицами/столбцами, и я могу выбрать столбцы, проверенные пользователями. Но теперь я должен выяснить, как динамически JOIN выбранных им таблиц.

Частичная структура таблицы ниже:

Table - Roles - PK = RoleId 
RoleId 
RoleName 

Table - Center PK = CenterId/RoleId/Prefix 
CenterId 
RoleId 
Prefix 

Table - Employee - PK = EmployeeID 
EmployeeId 
Name 
CenterId 
Dept 
Org 

Table - Prof - PK = EmployeeId/Profile 
EmployeeId 
Profile 

У меня есть в общей сложности 6 таблиц, которые могут быть соединены в различных областях, но так как пользователи должны присоединиться на лету мне нужно, чтобы определить JOIN когда они хотят сгенерировать SQL. На данный момент я не знаю, как лучше всего начать генерировать эти JOINs.

Я даже подумал о создании таблицы в базе данных с JOINs, указанным для каждой таблицы/столбца, а затем я мог бы просто создать ее там, но я в недоумении.

Я также пытался что-то похожее на это, но я не хочу, чтобы начать вниз неверный путь, если есть предложения по-разному:

private void GetJoins() 
{ 
    string joinList = string.Empty; 

    foreach (TreeNode tn in TablesTreeView.Nodes) 
    { 
     if (tn.Checked) 
      if (tn.Nodes.Count > 0) // this would be parent items only 
      { 
       foreach (TreeNode childNode in tn.Nodes) 
       { 
        // for first child checked 
        // check the next checked parent nodes for matching checked fields 
        // if next parent node has same field name checked then add the JOIN 
       } 
      } 
     } 
} 

кажется ли это, как он находится на правильном пути или вы можете предложить другой способ?

Я знаю, что это будет невероятно трудная задача, и я еще не дошел до динамического предложения WHERE. Я просто ищу совет по наилучшему способу создания JOINs на разовой основе.

+0

Ваши затраты на сборку действительно меньше, чем $ 1350? –

+0

В настоящее время нет бюджета для покупки внешнего продукта. – Taryn

ответ

1

Я могу оценить ваше желание написать это с нуля, ведь это сложно и интересно! Но не делайте ошибку, тратя ценные ресурсы на то, что уже написано много раз. Создание функционального и защищенного инструмента запроса намного сложнее, чем может показаться на первый взгляд.

SQL Server 2008 Management Studio Express свободен в последний раз, когда я проверял.

Versabanq Squel - это надежный и бесплатный инструмент запросов sql.

There are many others

And even more here

+0

Предоставление им доступа к студию управления SQL-сервером или альтернатива не решает мою проблему. Это будут использовать люди, которые не знают SQL. – Taryn

+0

Если вы действительно хотите написать свой собственный, вы можете загрузить это как отправную точку и настроить все, что хотите: http://www.codeproject.com/Articles/13419/SelectQueryBuilder-Building-complex-and-flexible-S – Coltech

0

Мне кажется, основываясь на вашей схеме выборки, лучше всего, чтобы создать представление со всеми стыки предопределены.

Кроме того, кажется, что вы разрешаете им искать ваш db на основе определенных полей и параметров, не позволяя им писать запросы, так как они не являются грамотными sql per se. Это все еще не простая задача (imho), но как только у вас есть представление, вы можете представить им поля «поиск» и «отображаемые» поля, которые они могут выбрать против (подождите », пока вы не начнете обработку complex where clauses :)

+0

Я посмотрел на создание представления со всеми связанными таблицами (больше, чем показано выше), но проблема с этим является декартовым продуктом записей, что делает результаты довольно непригодными для использования. Я знаю, что как только я доберусь до предложения WHERE, мое развлечение действительно начнется. – Taryn

+0

@bluefeet, это зависит от того, как вы присоединяетесь к своим столам нет? И если вы позволите пользователям выбрать поля, которые они хотят увидеть в результате, они не должны давать им ginormous Cartesian resultset, в основном вы бы использовали одно представление в предложении * FROM *, и вы бы сгенерировали * SELECT * и * WHERE * детали – Jason

-1

Я думаю, вы идете по этому неправильно. Должны ли ваши пользователи иметь возможность присоединиться ко всей этой комбинации таблиц? Знают ли они, что такое соединение?

Вот простой Подход:

  • Создание базы данных запросов, которые пользователи захотят выполнять.
  • Я предполагаю, что ваши запросы будут принимать параметры. Они должны быть помечены с помощью заполнителей.
  • Ваш интерфейс отобразит все возможные запросы для пользователя. После того, как пользователь выберет запрос, который они хотят использовать (на основе описательных имен, конечно), интерфейс проанализирует запрос для заполнителей параметров и сформирует форму для ввода пользователя (то есть курс, основанный на предположении сверху, что ваши запросы принимают параметры)

в конце концов, вы в конечном итоге с мощным хранилище многоразовых запросов, которые вы сами будете контролировать качество. Вместо того, чтобы пользователь щелкнул мышью, чтобы создать суровых монстров, которые нельзя даже использовать повторно!

Смежные вопросы