none
Помогите решить проблему удаления строки в Accesse (C#) RRS feed

  • Вопрос

  • Здравствуйте, я создал в DAL.cs, метод запроса удаления записи из БД Accesse:

    // Метод удаления запись из БД
            public bool DeleteCountries(string Country_ID)
            {
                bool DelResult = false;
                string queryDel = string.Format("DELETE FROM Debitors" +
                        " WHERE ID = '{0}'", Country_ID);
                using (OleDbConnection con = new OleDbConnection(connect))
                {
                    OleDbCommand com = new OleDbCommand(queryDel, con);
                    try
                    {
                        con.Open();
                        if (com.ExecuteNonQuery() == 1)
                            DelResult = true;
                    }
                    catch
                    {
                    }
                }
                return DelResult;
            }

    Потом прописал метод на кнопке btn_deleted

    private void btn_deleted_Click(object sender, EventArgs e)
            {
                if (dgv_Countries.SelectedRows.Count != 0)
                {
                    DAL dal = new DAL();
                    foreach (DataGridViewRow item in dgv_Countries.SelectedRows)
                    {
                        if (!dal.DeleteCountries((string)item.Cells[0].Value))
                        {
                            MessageBox.Show("Ошибка удаления строки " + (string)item.Cells[0].Value);
                        }
                    }

    P.S. При исполнении возникает ошибка:

    Подскажите как решить данную проблему??

        Спасибо!

    24 февраля 2013 г. 16:02

Ответы

  • Создал БД в Access. Обнаружил интересную вещь - если БД находится на диске C:, то запрос-то выполняется успешно, однако БД не перезаписывается, видимо какие-то ограничения в правах. Однако если БД находится на диске D:, то запрос выполняется успешно и данные удаляются.

    I created a database in Access. Discovered an interesting thing - if the database is on drive C:, then the request is successful, but the database is not overwritten, probably some kind of limitation of rights. However, if the database is on drive D:, then the request is successful and the data are deleted.

       static string connectionString = @"provider=Microsoft.Jet.OLEDB.4.0; data source=D:\test.mdb";
    
            static void Main(string[] args) {
                DeleteCountry(1);
            }
    
            public static bool DeleteCountry(int id) {
                string queryDel = string.Format("DELETE FROM Countries WHERE Country_ID = @id");
                using (var con = new OleDbConnection(connectionString)) {
                    var com = new OleDbCommand(queryDel, con);
                    com.Parameters.Add("id", OleDbType.Integer).Value = id;
                    con.Open();
                    var result = com.ExecuteNonQuery();
                    return result > 0;
                }
            }



    25 февраля 2013 г. 18:07
  • Напишите метод удаления так, как я приводил выше, либо избавьтесь от кавычек. У вас там Country_Id - Integer, а вы его сравниваете со строковым значением.

      string queryDel = string.Format("DELETE FROM Debitors" +
                        " WHERE Country_ID = '{0}'", Country_ID);


    25 февраля 2013 г. 18:51

Все ответы

  • Сделайте так:

    item.Cells[0].Value.ToString()

    24 февраля 2013 г. 19:11
    Модератор
  • What is the type (in the Debitors table) of the ID column?

     bool DelResult = false;
                string queryDel = string.Format("DELETE FROM Debitors" +
                        " WHERE ID = '{0}'", Country_ID);

    I suggest to use parameters instead of string concatenation here, e.g.

    string queryDel = "Delete FROM Debitors where ID = @Id";

    com.Parameters.Add("@Id", SqlDbType. ).Value = Country_Id;

    (use correct type for the parameter, say, SqlDbType.Int

    )


    For every expert, there is an equal and opposite expert. - Becker's Law


    My blog

    24 февраля 2013 г. 20:41
  • Сделайте так:

    item.Cells[0].Value.ToString()

    Ошибка пропала, ну запись из базы не удаляется...подскажите что может быть?? 
    24 февраля 2013 г. 21:46
  • Сделайте так:

    item.Cells[0].Value.ToString()

    Ошибка пропала, ну запись из базы не удаляется...подскажите что может быть?? 

    А что происходит при выполнении com.ExecuteNonQuery() ? Выбрасывается исключение или нет? Попробуйте сгенерированный запрос выполнить в Access

    string queryDel = string.Format("DELETE FROM Debitors" + " WHERE ID = '{0}'", Country_ID);

    Да, и как вам уже выше посоветовали, используйте Параметры для конструирования запроса.

    25 февраля 2013 г. 4:16
  • Сделайте так:

    item.Cells[0].Value.ToString()

    Ошибка пропала, ну запись из базы не удаляется...подскажите что может быть?? 

    А что происходит при выполнении com.ExecuteNonQuery() ? Выбрасывается исключение или нет? Попробуйте сгенерированный запрос выполнить в Access

    string queryDel = string.Format("DELETE FROM Debitors" + " WHERE ID = '{0}'", Country_ID);

    Да, и как вам уже выше посоветовали, используйте Параметры для конструирования запроса.

    /Здравствуйте установил...точку остнова

    / Метод удаления запись из БД
            public bool DeleteCountries(string Country_ID)
            { // переход прпоисходит только вот тут дальше все, стоит
                bool DelResult = false;
                string queryDel = string.Format("DELETE FROM Debitors" +
                        " WHERE ID = '{0}'", Country_ID);
                using (OleDbConnection con = new OleDbConnection(connect))
                {
                    OleDbCommand com = new OleDbCommand(queryDel, con);
                    try
                    {
                        con.Open();
                        if (com.ExecuteNonQuery() == 1)
                            DelResult = true;
                    }
                    catch
                    {
                    }
                }
                return DelResult;
            }

    25 февраля 2013 г. 8:57
  • У меня есть нехорошее ощущение, что у вас ID, это не строка, а число (автоинкримент, с высокой долей вероятности). Поэтому в Where не нужны кавычки. Должно быть вот так:

    string queryDel = string.Format("DELETE FROM Debitors" +
                        " WHERE ID = {0}", Country_ID);
    

    Ну и данная страна не должна через связки фигурировать в других запросах или, как вариант, должны стоять каскадные удаления.

    P.s. При отправке сообщений на форум, вставляя код, пользуйтесь клавише "Вставить блок кода":

    а то читать не удобно.

    25 февраля 2013 г. 9:15
    Отвечающий
  • У меня есть нехорошее ощущение, что у вас ID, это не строка, а число (автоинкримент, с высокой долей вероятности). Поэтому в Where не нужны кавычки. Должно быть вот так:

    string queryDel = string.Format("DELETE FROM Debitors" +
                        " WHERE ID = {0}", Country_ID);

    Ну и данная страна не должна через связки фигурировать в других запросах или, как вариант, должны стоять каскадные удаления.

    P.s. При отправке сообщений на форум, вставляя код, пользуйтесь клавише "Вставить блок кода":

    а то читать не удобно.

    Не ошибки не возникает...и не чего не происходит, у меня такое ощущения...что я в коде не то делаю((...даю вам код, тип данных таблицы Countries
    // Метод удаления запись из БД
            public bool DeleteCountries(string Country_ID)
            { 
               bool DelResult = false;
               
                string queryDel = string.Format("DELETE FROM Countries" +
                        " WHERE Country_ID = {0}", Country_ID);
                using (OleDbConnection con = new OleDbConnection(connect))
                {
                    OleDbCommand com = new OleDbCommand(queryDel, con);
                    try
                    {
                        con.Open();
                        if (com.ExecuteNonQuery() == 1)
                            DelResult = true;
                    }
                    catch
                    {
    
                    }
                }
                return DelResult;
              } 
    
    private void btn_deleted_Click(object sender, EventArgs e)
            {
                if (dgv_Countries.SelectedRows.Count != 0)
                {
    
                    DAL dal = new DAL();
                    {
                        foreach (DataGridViewRow item in dgv_Countries.SelectedRows)
                        {
                            if (!dal.DeleteCountries((string)item.Cells[0].Value.ToString()))
                            {
                                dgv_Countries.DataSource = dal.GetAllCountries();
                                MessageBox.Show("Ошибка удаления");
                            }
                        }
                    }

    25 февраля 2013 г. 10:16
  • Since this is AutoIncrement, it means it's integer value, so we don't need using '' around it. But again, please switch to parametric statement instead.

    Also, what is the exact error (if any) you're getting when trying to delete country?

     

    For every expert, there is an equal and opposite expert. - Becker's Law


    My blog

    25 февраля 2013 г. 14:04
  • Сделайте так:

    item.Cells[0].Value.ToString()

    Ошибка пропала, ну запись из базы не удаляется...подскажите что может быть?? 

    А что происходит при выполнении com.ExecuteNonQuery() ? Выбрасывается исключение или нет? Попробуйте сгенерированный запрос выполнить в Access

    string queryDel = string.Format("DELETE FROM Debitors" + " WHERE ID = '{0}'", Country_ID);

    Да, и как вам уже выше посоветовали, используйте Параметры для конструирования запроса.

     А куда в ставить параметр?? данном случаи в моем коде?
    25 февраля 2013 г. 15:59
  • What is the type (in the Debitors table) of the ID column?

     bool DelResult = false;
                string queryDel = string.Format("DELETE FROM Debitors" +
                        " WHERE ID = '{0}'", Country_ID);

    I suggest to use parameters instead of string concatenation here, e.g.

    string queryDel = "Delete FROM Debitors where ID = @Id";

    com.Parameters.Add("@Id", SqlDbType. ).Value = Country_Id;

    (use correct type for the parameter, say, SqlDbType.Int

    )


    For every expert, there is an equal and opposite expert. - Becker's Law


    My blog

    Hello, and where in to put this parameter in my code??
    25 февраля 2013 г. 16:03
  • Since this is AutoIncrement, it means it's integer value, so we don't need using '' around it. But again, please switch to parametric statement instead.

    Also, what is the exact error (if any) you're getting when trying to delete country?

     

    For every expert, there is an equal and opposite expert. - Becker's Law


    My blog

    Hello, and where in to put this parameter in my code??
    25 февраля 2013 г. 16:03
  • I showed in my previous message, e.g.


    "delete from Debitors where Id = @Id"


    For every expert, there is an equal and opposite expert. - Becker's Law


    My blog

    25 февраля 2013 г. 16:24
  • You can put it right before ExecuteNonQuery.

    For every expert, there is an equal and opposite expert. - Becker's Law


    My blog

    25 февраля 2013 г. 16:29
  • Предполагаю, что ошибка "не возникает" из-за того, что у вас блок catch{}  пустой. Попробуйте на время закомментировать конструкцию try-catch, либо добавьте вывод ошибки в DAL:

             try {
                        con.Open();
                        if (com.ExecuteNonQuery() == 1)
                            DelResult = true;
                    }
                    catch(Exception ex) {
                         MessageBox.Show(ex.ToString());
                    }

    • Изменено Varlamov Oleg 25 февраля 2013 г. 16:50
    25 февраля 2013 г. 16:50
  • Предполагаю, что ошибка "не возникает" из-за того, что у вас блок catch{}  пустой. Попробуйте на время закомментировать конструкцию try-catch, либо добавьте вывод ошибки в DAL:

             try {
                        con.Open();
                        if (com.ExecuteNonQuery() == 1)
                            DelResult = true;
                    }
                    catch(Exception ex) {
                         MessageBox.Show(ex.ToString());
                    }

    Не чего не помогает, данные не удаляются(((((((
    25 февраля 2013 г. 17:15
  • Do you get exception? What is the exact command being send to Access? Did you step through the code?

    For every expert, there is an equal and opposite expert. - Becker's Law


    My blog

    25 февраля 2013 г. 17:21
  • Do you get exception? What is the exact command being send to Access? Did you step through the code?

    For every expert, there is an equal and opposite expert. - Becker's Law


    My blog

    Exception and errors not what are not present...I press on the button of btn_deleted, information does not retire
    25 февраля 2013 г. 17:28
  • You need to step through each line of code. Right after the ExecuteNonQuery line fires, you need to examine your table.

    For every expert, there is an equal and opposite expert. - Becker's Law


    My blog

    25 февраля 2013 г. 17:48
  • Создал БД в Access. Обнаружил интересную вещь - если БД находится на диске C:, то запрос-то выполняется успешно, однако БД не перезаписывается, видимо какие-то ограничения в правах. Однако если БД находится на диске D:, то запрос выполняется успешно и данные удаляются.

    I created a database in Access. Discovered an interesting thing - if the database is on drive C:, then the request is successful, but the database is not overwritten, probably some kind of limitation of rights. However, if the database is on drive D:, then the request is successful and the data are deleted.

       static string connectionString = @"provider=Microsoft.Jet.OLEDB.4.0; data source=D:\test.mdb";
    
            static void Main(string[] args) {
                DeleteCountry(1);
            }
    
            public static bool DeleteCountry(int id) {
                string queryDel = string.Format("DELETE FROM Countries WHERE Country_ID = @id");
                using (var con = new OleDbConnection(connectionString)) {
                    var com = new OleDbCommand(queryDel, con);
                    com.Parameters.Add("id", OleDbType.Integer).Value = id;
                    con.Open();
                    var result = com.ExecuteNonQuery();
                    return result > 0;
                }
            }



    25 февраля 2013 г. 18:07
  • Ребята, что не пробевал....и точки останова ставил в DAL, они вообще не чего не показывают..., ставил на кнопке

     private void btn_deleted_Click(object sender, EventArgs e)
            {
                if (dgv_Countries.SelectedRows.Count != 0)\\ Вот здесь останавливается, и все  дальше  не чего не происходит
                {
    
                    DAL dal = new DAL();
                    {
                        foreach (DataGridViewRow item in dgv_Countries.SelectedRows)
                        {
                            if (!dal.DeleteCountries((string)item.Cells[0].Value.ToString()))
                            {
                                dgv_Countries.DataSource = dal.GetAllCountries();
                                MessageBox.Show("Ошибка удаления");
                            }
                        }
                    }

    25 февраля 2013 г. 18:09
  • Вот здесь останавливается, и все  дальше  не чего не происходит

    Стоп, как ничего не происходит? Внутрь условия заходит? Если нет, значит у Вас не выделено ни одной строки.

    • Предложено в качестве ответа Naomi N 25 февраля 2013 г. 18:32
    25 февраля 2013 г. 18:14
  • Вот здесь останавливается, и все  дальше  не чего не происходит

    Стоп, как ничего не происходит? Внутрь условия заходит? Если нет, значит у Вас не выделено ни одной строки.

    Елки-палки точно, я же не поменял dataGridView значение SelectionMode на FullRowSelect.  
    P.S. Все изменил теперь у меня другая ошибка:

    // Метод удаления запись из БД
            public bool DeleteCountries(string Country_ID)
            { 
               bool DelResult = false;
               
                string queryDel = string.Format("DELETE FROM Countries" +
                        " WHERE Country_ID = {0}", Country_ID);
                using (OleDbConnection con = new OleDbConnection(connect))
                {
                    OleDbCommand com = new OleDbCommand(queryDel, con);
                    try
                    {
                        con.Open();
                        if (com.ExecuteNonQuery() == 1)// вот после этого появляетсясообщение
                            DelResult = true;
                    }
                    catch
                    {
    
                    }
                }
                return DelResult;
              } 

    • Предложено в качестве ответа Naomi N 25 февраля 2013 г. 18:32
    • Изменено Иван Лукашов 25 февраля 2013 г. 18:43
    25 февраля 2013 г. 18:27
  • Напишите метод удаления так, как я приводил выше, либо избавьтесь от кавычек. У вас там Country_Id - Integer, а вы его сравниваете со строковым значением.

      string queryDel = string.Format("DELETE FROM Debitors" +
                        " WHERE Country_ID = '{0}'", Country_ID);


    25 февраля 2013 г. 18:51
  • Напишите метод удаления так, как я приводил выше, либо избавьтесь от кавычек. У вас там Country_Id - Integer, а вы его сравниваете со строковым значением.

      string queryDel = string.Format("DELETE FROM Debitors" +
                        " WHERE Country_ID = '{0}'", Country_ID);


    Парни...дай Вам бог здоровья....и мне чайнику тоже)))))....все работет! Спасибо большое все....

    P.S. Теперь буду мучить редактирования данных

    p.s.s. Поможете...если будут вопросы??
    25 февраля 2013 г. 19:02