#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.