Модераторы: gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ошибка при выполнении заброса MYSQL Connector .net 
V
    Опции темы
IGV
Дата 28.8.2009, 13:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 145
Регистрация: 1.4.2008

Репутация: нет
Всего: 2



Есть SQL скрипт, который мне нужно выполнить. Использую MySQL 5.1 и Connector .NET 6.1.
Код

        public void DeleteClient(int clientID)
        {
            OpenConnection();
            string command = @"SET @tName = CONCAT('sw_', REPLACE(SUBSTRING_INDEX((SELECT ip_sw FROM SW_CL AS t WHERE t.id_client = '@idClient'), '.', -2), '.', ''));"
                                       + @"SET @query = CONCAT('DELETE sw_table, SW_CL FROM ', @tName, ' AS sw_table INNER JOIN SW_CL WHERE sw_table.ID_CL = SW_CL.id_client AND SW_CL.id_client=\'@idClient\'');"
                                       + @"PREPARE stmt1 FROM @query;"
                                       + @"EXECUTE stmt1;";
            command = command.Replace("@idClient", clientID.ToString());
            var c = new MySqlCommand(command, _connection);
            c.ExecuteNonQuery();
        }

Пока у меня вылетает exception в строке c.ExecuteNonQuery(); (Fatal error encountered during command execution.) В чем может быть проблема?
Если подскажите, как это сделать лучше и проще буду очень благодарен.

P.S. если использовать менеджер базы данных, то запрос выполняется на "ура".

Это сообщение отредактировал(а) IGV - 28.8.2009, 13:16
PM MAIL ICQ   Вверх
Crypton
Дата 28.8.2009, 16:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 158
Регистрация: 9.10.2006
Где: США, Санкт-Петерб ург

Репутация: нет
Всего: 2



Код

using(MySqlConnection Conn = new MySqlConnection("Коннекшн стринг сюда")) {
      using(MySqlCommand cmd = new MySqlCommand()) {
           string command = @"SET @tName = CONCAT('sw_', REPLACE(SUBSTRING_INDEX((SELECT ip_sw FROM SW_CL AS t WHERE t.id_client = '@idClient'), '.', -2), '.', ''));"
                                       + @"SET @query = CONCAT('DELETE sw_table, SW_CL FROM ', @tName, ' AS sw_table INNER JOIN SW_CL WHERE sw_table.ID_CL = SW_CL.id_client AND SW_CL.id_client=\'@idClient\'');"
                                       + @"PREPARE stmt1 FROM @query;"
                                       + @"EXECUTE stmt1;";
           cmd.CommandText = command;
           cmd.Connection = Conn;
           cmd.Parameters.AddWithValue("@idClient", clientID);
           cmd.Parameters.AddWithValue("@tName", ... добавь остальные параметры);
           Conn.Open();
          cmd.ExecuteNonQuery();
      }

}


Возможно, что ты просто все параметры не заменил, либо штепсель не поддерживает разделенные запросы (";")

Это сообщение отредактировал(а) Crypton - 28.8.2009, 16:51
--------------------
«Все, что вы знаете — ложь» Теория мироздания 
PM MAIL WWW ICQ Skype   Вверх
IGV
Дата 28.8.2009, 17:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 145
Регистрация: 1.4.2008

Репутация: нет
Всего: 2



Ну во-первых @tName - это параметр, который формирует сам sql-скрипт.
Так, как вы написали это правильнее - использование параметров в MySqlCommand, чтобы не было возможности осуществить SQL Injection.
Ну а во-вторых, я так делал, тоже самое. Сейчас пытаюсь переделать это для stored procedures, возможно поможет.

P.S. я не понял, что вы, в данном контексте, подразумевале под "штепселем"  smile 

Это сообщение отредактировал(а) IGV - 28.8.2009, 17:40
PM MAIL ICQ   Вверх
IGV
Дата 28.8.2009, 18:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 145
Регистрация: 1.4.2008

Репутация: нет
Всего: 2



Ну в общем решил я проблему.

Сделал хранимую процедуру
Код

PROCEDURE KLIENTS.deleteClient(IN idClient CHAR(64))
BEGIN
  SET @tName = CONCAT('sw_', REPLACE(SUBSTRING_INDEX((SELECT ip_sw FROM SW_CL AS t WHERE t.id_client = idClient), '.', -2), '.', ''));
  SET @query = CONCAT('DELETE sw_table, SW_CL FROM ', @tName, ' AS sw_table INNER JOIN SW_CL WHERE sw_table.ID_CL = SW_CL.id_client AND SW_CL.id_client= ' , idClient);     
  PREPARE stmt1 FROM @query;
  EXECUTE stmt1;
END


Затем вызов в программе
Код

            string command = "deleteClient";
            var cmd = new MySqlCommand(command, _connection) {CommandType = CommandType.StoredProcedure};
            var param = new MySqlParameter {ParameterName = "@idClient", Value = clientID};
            cmd.Parameters.Add(param);
            cmd.ExecuteNonQuery();

PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
stab
mr.DUDA
Exception

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, stab, mr.DUDA, Exception.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Базы данных под .NET | Следующая тема »


 




[ Время генерации скрипта: 0.0419 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.