Открыть Winform на основе результата SQL-запроса

#c# #sql #winforms #ms-access-97

#c# #sql #winforms #ms-access-97

Вопрос:

В настоящее время я нахожусь в процессе переноса приложения базы данных Access97 в новое приложение WinForms.

У нас есть центральная форма для всех «Учетных записей», в которой отображаются общие данные учетной записи, внутри этой формы есть кнопка, которая открывает другую форму, приложение получает имя формы из SQL-запроса, используя пример таблицы ниже.

 | ClientID | FormName |
 ---------- ---------- 
|    1     |   frm1   |
|    2     |   frm2   |
  

Итак, если идентификатор клиента равен 1, кнопка должна открыть Form1, если идентификатор клиента равен 2, кнопка должна открыть Form2.

Мой вопрос в том, как бы мне заставить WinForms выполнить запрос по нажатию кнопки, чтобы затем открыть соответствующую форму, найденную в таблице?

Любая помощь очень ценится.

Комментарии:

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

2. Я понимаю это, но причина, по которой я спрашиваю, заключается в том, что я даже не могу начать думать, с чего начать. В настоящее время для тестирования у меня есть функциональность простой кнопки.

3. @SamiKuhmonen С более чем 40 формами, которые можно открыть, я подумал, что будет лучший вариант.

4. @JammD Вы можете назвать формы соответствующим образом и использовать отражение для создания экземпляра на основе имени в этом случае.

5. @SamiKuhmonen Спасибо, теперь у меня есть начальный шаг, чтобы, по крайней мере, получить необходимую мне функциональность.

Ответ №1:

Вам нужно будет написать вспомогательный метод SQL. Что-то вроде следующего (которое я не проверял и не взломал)

 public static T SQLGet<T>(SqlConnection conn, string sql)
{
    using (SqlCommand command = new SqlCommand())
    {
        command.Connection = conn;
        command.CommandTimeout = 0; // No timeout - set or remove.
        command.CommandText = sql;
        return (T)Convert.ChangeType(Command.ExecuteScalar(), typeof(T));
    }
}
  

вы можете использовать это как

 SqlConnection conn = new SqlConnection(someValidConnectionString);
string formName = Utilities.SQLGet<string>(conn, 
    "SELECT [FormName] "   
    "FROM [SomeTable] WHERE [ClientID] = 1;") // Not considering SQL injection here!
  

Теперь вы можете использовать отражение с полученным именем formName

 Type t = assembly.GetType(formName);
Form frm1 = (Form)Activator.CreateInstance(t);
  

Я надеюсь, что это поможет.

Примечание. это не имеет обработки ошибок.

Комментарии:

1. Использование as Form вместо прямого приведения помогло бы уменьшить одно исключение и просто разрешить сравнение с null.