Member 12085957 Ответов: 2

Есть ли какой-нибудь способ упростить мой код?


Я хочу написать упрощенный код, который может взаимодействовать с Ms-Acess и базой данных MySql.Пожалуйста, кто-нибудь, дайте нам идею.

private void Form1_Load(object sender, EventArgs e)
        {
            if (dataBase == "MySql")
            {
                String conn = "server=localhost; database=sample; uid=root; password=somepassword";
                using (MySqlConnection mysqlconn = new MySqlConnection(conn))
                {
                    string query = "INSERT INTO Name VALUES(" + Name + ")";
                    using (MySqlCommand cmd = new MySqlCommand(query, mysqlconn))
                    {
                      
                        try
                        {
                            mysqlconn.Open();
                            cmd.ExecuteNonQuery();
                        }
                        catch (Exception)
                        {
                           
                        }
                        finally
                        {
                            mysqlconn.Close();
                            mysqlconn.Dispose();
                        }
                    }

                }
              if (dataBase1 == "Ms Ascess")
                {
                    String conn1 = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + path + "sample.mdb;Jet OLEDB:Database Password=somepassword";
                    using (OleDbConnection oledbconn = new OleDbConnection(conn1))
                    {
                        string query = "INSERT INTO Name VALUES(" + Name + ")";
                        using (OleDbCommand cmd = new OleDbCommand(query, oledbconn))
                        {
                            
                            try
                            {
                                oledbconn.Open();
                                cmd.ExecuteNonQuery();
                            }
                            catch (Exception)
                            {
                                
                            }
                            finally
                            {
                                oledbconn.Close();
                                oledbconn.Dispose();
                            }
                        }
                    }

                }
            }
        }

2 Ответов

Рейтинг:
2

OriginalGriff

Во - первых, не делайте этого так-никогда не объединяйте строки для построения SQL-команды. Это оставляет вас широко открытыми для случайной или преднамеренной атаки SQL-инъекции, которая может уничтожить всю вашу базу данных. Вместо этого используйте параметризованные запросы.
Во-вторых, потому что вы используете using блок, тебе это не нужно. finally блок, потому что using будет утилизировать данные, когда переменная выйдет за пределы области действия.
В-третьих, всегда перечисляйте столбцы, в которые вы пытаетесь вставить: это делает ваш код более надежным и простым в обслуживании при изменении БД.
В-четвертых, никогда не проглатывайте исключения - это означает, что вы никогда не знаете, что что-то пошло не так, и это делает код практически невозможным для отладки, потому что вы понятия не имеете, где он начал идти не так. Войдите в систему, сообщите пользователю, разбейте приложение. Что угодно. Но не глотайте их.

private void Form1_Load(object sender, EventArgs e)
    {
    if (dataBase == "MySql")
        {
        String conn = "server=localhost; database=sample; uid=root; password=somepassword";
        using (MySqlConnection mysqlconn = new MySqlConnection(conn))
            {
            string query = "INSERT INTO Name (MyColumn) VALUES(@NM)";
            using (MySqlCommand cmd = new MySqlCommand(query, mysqlconn))
                {
                mysqlconn.Open();
                cmd.Parameters.AddWithValue("@NM", Name);
                cmd.ExecuteNonQuery();
                }
            }
        }
...


Member 12085957

OriginalGriff спасибо за ваш ответ.Спасибо за инструкции, я буду им следовать.Не могли бы вы дать некоторое представление о том, как упростить мой код вместо того, чтобы писать два дубликата кодов для подключения к разным базам данных.

OriginalGriff

Вы не можете сильно упростить его, потому что вам все еще нужны два разных типа объектов, созданных, и вам нужны разные строки подключения - хотя вы могли бы создать их и поместить в переменные DBConnection вместо OleDbConnection и MySqlConnection; и то же самое для командных объектов.
Но...это на самом деле не делает этого для меня - я думаю, что это было бы труднее читать, чем проще.

Вместо этого я бы предложил класс базы данных, с которым вы можете выполнять операции, которые внутренне определяют, какую систему БД использовать. Сохранение этого в виде отдельной сборки / проекта упростило бы ваш основной код, абстрагировав сложности в другую библиотеку DLL.

Но...это необычно. Обычно вы не пытаетесь "переключать" БД на лету-хотя бы потому, что вы никогда не знаете, какая БД имеет последние данные. Гораздо более нормально писать отдельные сборки для каждой БД (как отдельный уровень доступа к данным) и "подключать" соответствующую сборку к приложению, когда оно установлено, вместо того чтобы пытаться все это проработать во время выполнения. Это более чистый код и, вероятно, более надежный.

Рейтинг:
1

Mehdi Gholam

Используйте базовые интерфейсы, такие как IDBConnection, IDBCommand и т.д. : Интерфейс IDbCommand (System. Data)[^]