Выполнить несколько запросов к MySQL БД

sibbora

Client
Регистрация
23.11.2013
Сообщения
149
Благодарностей
73
Баллы
28
Вот такой вопрос назрел: как выполнить несколько SELECT-запросов к базе данных в рамках одной сессии? Пока заставил работать только такой код:

Код:
string strTSep = "\t";
string strResult = String.Empty;
double dblQMatches = 0;

DateTime dtStartDate = Convert.ToDateTime("05.08.2015");
DateTime dtFinishDate = DateTime.Now;
DateTime dtCurrentDay = dtStartDate;

//Параметры подключения к БД, команда для MySql
var DBCommand = new MySql.Data.MySqlClient.MySqlCommand();
string strConnectionString = "blablablablablablabla";

//Подключаемся
try{
    DBCommand.Connection = new MySql.Data.MySqlClient.MySqlConnection(strConnectionString);
}catch(Exception e){
    return "MySql connect failed";
}

while (dtCurrentDay<dtFinishDate) {
    //Выполняем запрос и обрабатываем данные
    try{
        DBCommand.CommandText = "SELECT COUNT(*) FROM ttrss_entries WHERE date_entered>'"+
         dtCurrentDay.AddDays(-1).ToString("yyyy-MM-dd") + "' AND date_entered<'"+
         dtCurrentDay.AddDays(1).ToString("yyyy-MM-dd") +  "';";
       
        DBCommand.Connection.Open();
        var SQLReader = DBCommand.ExecuteReader();
        while (SQLReader.Read()){
            dblQMatches = SQLReader.GetDouble(0);
        }
        strResult = dtCurrentDay.ToString("dd.MM.yyyy") + strTSep + dtCurrentDay.ToString("dddd") + strTSep + dblQMatches.ToString();
        project.SendInfoToLog(strResult);
        File.AppendAllText(project.Directory + "\\RssStat.txt", strResult + "\r\n");
       
        //Закрываем запрос
        SQLReader.Close();
    }catch (MySql.Data.MySqlClient.MySqlException e){
        strResult = String.Format("MySql SQLReader exception: {0}", e.Message);
    }finally{
        //Закрываем подключение к БД
        DBCommand.Connection.Close();
    }
    dtCurrentDay = dtCurrentDay.AddDays(1);
}

return "ok";
Как видно, в каждой итерации соединение с БД устанавливается заново. А сделать иначе не получается, так как:
1) DBCommand.Connection.Open(); не удаётся выполнить вне цикла (до задания строки DBCommand.CommandText)
2) var SQLReader = DBCommand.ExecuteReader(); при повторном вызове ругается, что это соединение уже открыто.

Возможно ли сделать так:
1) создать подключение к БД;
2) выполнить множество запросов в каком-то цикле;
3) закрыть подключение к БД?
 

bhairava7

Client
Регистрация
18.08.2015
Сообщения
154
Благодарностей
15
Баллы
18
Вот такой вопрос назрел: как выполнить несколько SELECT-запросов к базе данных в рамках одной сессии? Пока заставил работать только такой код:

Код:
string strTSep = "\t";
string strResult = String.Empty;
double dblQMatches = 0;

DateTime dtStartDate = Convert.ToDateTime("05.08.2015");
DateTime dtFinishDate = DateTime.Now;
DateTime dtCurrentDay = dtStartDate;

//Параметры подключения к БД, команда для MySql
var DBCommand = new MySql.Data.MySqlClient.MySqlCommand();
string strConnectionString = "blablablablablablabla";

//Подключаемся
try{
    DBCommand.Connection = new MySql.Data.MySqlClient.MySqlConnection(strConnectionString);
}catch(Exception e){
    return "MySql connect failed";
}

while (dtCurrentDay<dtFinishDate) {
    //Выполняем запрос и обрабатываем данные
    try{
        DBCommand.CommandText = "SELECT COUNT(*) FROM ttrss_entries WHERE date_entered>'"+
         dtCurrentDay.AddDays(-1).ToString("yyyy-MM-dd") + "' AND date_entered<'"+
         dtCurrentDay.AddDays(1).ToString("yyyy-MM-dd") +  "';";
      
        DBCommand.Connection.Open();
        var SQLReader = DBCommand.ExecuteReader();
        while (SQLReader.Read()){
            dblQMatches = SQLReader.GetDouble(0);
        }
        strResult = dtCurrentDay.ToString("dd.MM.yyyy") + strTSep + dtCurrentDay.ToString("dddd") + strTSep + dblQMatches.ToString();
        project.SendInfoToLog(strResult);
        File.AppendAllText(project.Directory + "\\RssStat.txt", strResult + "\r\n");
      
        //Закрываем запрос
        SQLReader.Close();
    }catch (MySql.Data.MySqlClient.MySqlException e){
        strResult = String.Format("MySql SQLReader exception: {0}", e.Message);
    }finally{
        //Закрываем подключение к БД
        DBCommand.Connection.Close();
    }
    dtCurrentDay = dtCurrentDay.AddDays(1);
}

return "ok";
Как видно, в каждой итерации соединение с БД устанавливается заново. А сделать иначе не получается, так как:
1) DBCommand.Connection.Open(); не удаётся выполнить вне цикла (до задания строки DBCommand.CommandText)
2) var SQLReader = DBCommand.ExecuteReader(); при повторном вызове ругается, что это соединение уже открыто.

Возможно ли сделать так:
1) создать подключение к БД;
2) выполнить множество запросов в каком-то цикле;
3) закрыть подключение к БД?
А что конкретно нужно сделать?
Если объединить данные из разных таблиц, то можно в самом sql запросе написать запрос через джоины.
 

sibbora

Client
Регистрация
23.11.2013
Сообщения
149
Благодарностей
73
Баллы
28
А что конкретно нужно сделать?
Если объединить данные из разных таблиц, то можно в самом sql запросе написать запрос через джоины.
Если при каждой итерации реконнектиться к базе данных, то происходит задержка в несколько секунд. Этого хотелось бы избежать. В приведённом мной примере конечно можно обойтись средствами самого SQL, получив в результате одного запроса уже готовые данные. Но это только пример. Хотелось бы иметь возможность в рамках одного подключения выполнить несколько последовательных селектов/инсертов.
 

tka4enko.ilya

Client
Регистрация
20.10.2015
Сообщения
61
Благодарностей
9
Баллы
8
Если при каждой итерации реконнектиться к базе данных, то происходит задержка в несколько секунд. Этого хотелось бы избежать. В приведённом мной примере конечно можно обойтись средствами самого SQL, получив в результате одного запроса уже готовые данные. Но это только пример. Хотелось бы иметь возможность в рамках одного подключения выполнить несколько последовательных селектов/инсертов.
Тогда наверное нужно сначала использовать класс DbConnection, открывать подключение, а потом уже его в DBCommand.
 

sibbora

Client
Регистрация
23.11.2013
Сообщения
149
Благодарностей
73
Баллы
28
Вот так работает:
Код:
//Параметры подключения к БД, команда для MySql
var DBCommand = new MySql.Data.MySqlClient.MySqlCommand();
string strConnectionString = "Data source=bla;UserId=bla;Password=bla;database=bla;";

//Подключаемся
try{
    DBCommand.Connection = new MySql.Data.MySqlClient.MySqlConnection(strConnectionString);
}catch(Exception e){
    return "MySql connect failed";
}

//Выполняем запрос и обрабатываем данные
try{
    DBCommand.Connection.Open();
    for (int r=0;r<20;r++) {
        DBCommand.CommandText = "SELECT COUNT(*) FROM ttrss_entries WHERE date_entered>'"+
         dtCurrentDay.AddDays(-1).ToString("yyyy-MM-dd") + " 23:59:59' AND date_entered<'"+
         dtCurrentDay.AddDays(1).ToString("yyyy-MM-dd") +  "';";
       
        var SQLReader = DBCommand.ExecuteReader(); //!!!!!!!
        while (SQLReader.Read()){
            dblQMatches = SQLReader.GetDouble(0);
        }
        strResult = dtCurrentDay.ToString("dd.MM.yyyy") + strTSep + dtCurrentDay.ToString("dddd") + strTSep + dblQMatches.ToString();
        project.SendInfoToLog(strResult);
       
        dtCurrentDay = dtCurrentDay.AddDays(1);
        SQLReader.Close(); //!!!!!!!
    }
}catch (MySql.Data.MySqlClient.MySqlException e){
    strResult = String.Format("MySql SQLReader exception: {0}", e.Message);
    project.SendErrorToLog(strResult);
}finally{
    //Закрываем подключение к БД
    DBCommand.Connection.Close();
}
пояснение: внутри цикла создаём и закрываем DBCommand.ExecuteReader(). В этом случае не выбрасывается ошибка "SQLReader already exists", но и не происходит реконнекта к базе на каждом шаге.
 

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)