Экспорт документов из PostgreSQL на второй базе


Это моя первая попытка с базой данных. Я прочитал несколько статей/книг и теперь я сама его попробовала и я хочу знать, если я могу написать это лучше или какие у меня ошибки. В целом я использую попробовать/поймать/наконец, сделав несколько операторов в один способ, более ДБО и подключения в отдельный метод. Я не использую функции на стороне DB, потому что это придет в будущем.

Проблемы:

  1. Это довольно долго > многие высказывания
  2. Смешивая 2 базы в один способ
  3. Я не знаю, где использовать try/поймать
  4. Например, настройка соединения и для получения следующего ID я написал другой способ
  5. Это хорошо объявлять переменные в начале? Объявить его, когда я использую его?
public void ExportDocuments(List<string> arrayIds)
{
    var getNpgsqlConnection = SetNpgsqlConnection();
    var getMRDGlrConnection = SetMRDGlrConnection();
    int f_id = 0;
    int period = 0;
    int mrnumber = 0;
    bool mrCreated = true;
    bool f_exportcheckbox;
    string f_name = String.Empty;
    string f_subject = String.Empty;
    string f_agendanumber = String.Empty;
    string foldername = String.Empty;
    DateTime mrdate = DateTime.Now;
    Dictionary<int, string> ressortList = new Dictionary<int, string>();

    try
    {
        int getNextMRId = GetNextMRId(); //gets the last ID+1 from DB
        foreach (var item in arrayIds)
        {
            using (var cmd = new NpgsqlCommand())
            {
                cmd.Connection = getNpgsqlConnection ;
                cmd.CommandText = "SELECT f_id, f_name, f_subject, f_agendanumber, f_exportcheckbox, period, mrnumber, foldername, mrdate FROM mrd_folder.files INNER JOIN mrd_folder.folders ON files.f_folders_id  = folders.id WHERE f_id = @arrayId;";
                cmd.Parameters.AddWithValue("arrayId", Convert.ToInt32(item));

                using (var reader = cmd.ExecuteReader())
                {
                    while (reader.Read())
                    {
                        try
                        {
                            f_id = (int)reader["f_id"];
                            f_name = reader["f_name"].ToString();
                            f_subject = reader["f_subject"].ToString();
                            f_agendanumber = reader["f_agendanumber"].ToString();
                            f_exportcheckbox = (bool)reader["f_exportcheckbox"];
                            period = (int)reader["period"];
                            mrnumber = 1002;// (int)reader["mrnumber"];
                            mrdate = (DateTime)reader["mrdate"];
                        }
                        catch (Exception e)
                        {
                            Debug.WriteLine(e.Message);
                            throw;
                        }
                    }
                }
            }
            using (var getRessorts = new NpgsqlCommand())
            {

                getRessorts.Connection = getNpgsqlConnection ;
                getRessorts.CommandText = "SELECT ressortsbeantragung.r_id, ressorts.r_abbrevention FROM mrd_folder.ressortsbeantragung INNER JOIN mrd_folder.ressorts ON ressortsbeantragung.r_id = ressorts.r_id WHERE ressortsbeantragung.f_id = @arrayId";
                getRessorts.Parameters.AddWithValue("arrayId", Convert.ToInt32(item));
                using (var readRessort = getRessorts.ExecuteReader())
                {
                    while (readRessort.Read())
                    {
                        try
                        {
                            ressortList.Add((int)readRessort["r_id"], readRessort["r_abbrevention"].ToString());
                        }
                        catch (Exception e)
                        {
                            Debug.WriteLine(e.Message);
                            throw;
                        }
                    }
                }
            }

            //Import to MRO
            try
            {
                using (var cmd = new NpgsqlCommand())
                {
                    cmd.Connection = getMRDGlrConnection ;
                    if (mrCreated)
                    {
                        string currentDate = DateTime.Now.GetDateTimeFormats()[5];

                        cmd.CommandText = "SELECT insertmrsitzung(@period, @mrnumber, @mrdate)";
                        cmd.Parameters.AddWithValue("period", period);
                        cmd.Parameters.AddWithValue("mrnumber", mrnumber.ToString());


                        cmd.Parameters.Add("mrdate", NpgsqlTypes.NpgsqlDbType.Date);
                        cmd.Parameters[2].Value = mrdate;

                        cmd.ExecuteNonQuery();
                        mrCreated = false;
                    }

                    cmd.CommandText = String.Empty;
                    cmd.Parameters.Clear();

                    cmd.CommandText = "SELECT inserttopunkt(@f_id, @f_agendanumber, @f_subject, '')";
                    cmd.Parameters.AddWithValue("f_id", getNextMRId);
                    cmd.Parameters.AddWithValue("f_agendanumber", f_agendanumber);
                    cmd.Parameters.AddWithValue("f_subject", f_subject);

                    cmd.ExecuteNonQuery();

                    foreach (var res in ressortList)
                    {
                        cmd.CommandText = String.Empty;
                        cmd.Parameters.Clear();
                        if (res.Value == "BKA")
                        {
                            string rename = "BK";
                            //cmd.Parameters.AddWithValue("r_kurz", rename);
                            cmd.CommandText = @"SELECT inserttopunktressort(@f_id, @f_agendanumber, '" + rename + "')";
                        }
                        else
                            cmd.CommandText = @"SELECT inserttopunktressort(@f_id, @f_agendanumber, '" + res.Value + "')";

                        cmd.Parameters.AddWithValue("f_id", getNextMRId);
                        cmd.Parameters.AddWithValue("f_agendanumber", f_agendanumber);


                        cmd.ExecuteNonQuery();
                    }
                }
            }
            catch (Exception e)
            {
                Debug.WriteLine(e.Message);
                throw;
            }
            ressortList.Clear();
        }
    }
    catch (Exception e)
    {
        Debug.WriteLine(e.Message);
        throw;
    }
    finally
    {
        getNpgsqlConnection.Close();
        getMRDGlrConnection.Close();
    }
}

private NpgsqlConnection SetNpgsqlConnection()
{

    var setConnectionString = ConfigurationManager.ConnectionStrings["Test1"];
    string getConnectionString = setConnectionString.ConnectionString;

    var npgsqlConnection = new NpgsqlConnection();
    npgsqlConnection.ConnectionString = getConnectionString;
    try
    {
        npgsqlConnection.Open();
    }
    catch (Exception e)
    {
        Debug.WriteLine(e.Message);
        throw;
    }

    return npgsqlConnection;
}


Комментарии
1 ответ

Нет таких методов, как SetNpgsqlConnection(). ДБ соединения должны быть правильно утилизированы, и таким образом они должны быть использованы внутри блока using, например

using (SqlConnection con = new SqlConnection(connectionString))
{
// do stuff
}

Нет смысла в сохранении своих соединений в живых так долго, как вы делаете. Обычно дБ соединения должны быть как можно короче.


Дайте переменных и т. д. именами.


  • arrayIds почти венгерскую нотацию (что не приветствуется). Более того, это даже не массив! Почему бы просто не назвать его "идентификаторы"?

  • f_id, f_exportcheckbox: не используйте подчеркивания и т. д. в середине названия. Имена должны быть верблюжьего или PascalCase. Единственное место, где я ожидал подчеркивания в имени переменной в класс переменную.

  • mrnumber, mrCreated: Я не знаю, что "господин" относится. Не используйте аббревиатуры, если они хорошо известны.


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


Не писать ADO.NET вручную; вместо того, чтобы использовать ORM, как щеголь или организации базы и работы с классами.


Не используйте AddWithValue().


Ваш метод-это 140+ строк. Даже если вы примените выше, он еще делает несколько вещей. Разделить его на более мелкие методы, электронная.г


  • один, который извлекает данные из mrd_folder.files,

  • другой, который получает данные от mrd_folder.ressortsbeantragung,

  • третий для выполнения insertmrsitzung,

  • четвертое для выполнения inserttopunkt,

  • пятый выполнять inserttopunktressort.

И, пожалуйста, не держать соединение открытым для тех, кто последние три: убедитесь, что каждый метод управляет собственное подключение к БД и доверять рамках эффективно распределить ресурсы.

1
ответ дан 27 февраля 2018 в 02:02 Источник Поделиться