Написание инструмента динамических запросов Winforms - PullRequest
4 голосов
/ 10 марта 2012

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

Так что я пытаюсь написать это сам.На данный момент я создал древовидное представление, которое заполняется во время выполнения таблицами / столбцами, и я могу выбрать столбцы, которые проверяются пользователями.Но теперь я должен выяснить, как динамически 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 для каждой таблицы / столбца, а затем я мог просто построить ее оттуда, но я в растерянности.

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

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 на специальной основе.

Ответы [ 3 ]

1 голос
/ 12 марта 2012

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

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

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

Существует множество других

И даже больше здесь

0 голосов
/ 20 апреля 2012

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

Вот более простой подход:

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

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

0 голосов
/ 12 марта 2012

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

Кроме того, кажется, что вы позволяете им искать вашу базу данных на основе определенных полейи параметры, на самом деле не позволяя им писать запросы, так как они не очень грамотны в SQL.Это по-прежнему непростая задача (imho), но как только у вас появится представление, вы можете представить им поля «с возможностью поиска» и поля «с возможностью отображения», с которыми они могут выбирать (подождите, пока вы не начнете обрабатывать)комплекс, где пункты:)

...