SQL Update - не обновлять несколько строк в цикле for - PullRequest
1 голос
/ 01 июля 2011

У меня есть DataGridView (DGV), связанный с базой данных SQlite.Я хочу обновить некоторую информацию о DGV.Итак, у меня есть контекстное меню, которое позволяет мне изменить один столбец и обновить базу данных.Я хочу иметь возможность выбирать несколько строк и редактировать их.Например: если я выбрал пять строк и изменил тип с аварийных сигналов на ошибки;изменение отражается в DGV, а затем, когда я просматриваю базу данных, изменение не отражается.Обновлена ​​только одна строка.

Мой фрагмент кода ниже

foreach (DataGridViewRow r in dataGridView1.SelectedRows)
        {
            SQLiteTransaction SQLiteTrans = connection.BeginTransaction();
            SQLiteCommand cmd = connection.CreateCommand();
            MessageBox.Show(r.ToString());
            if (r.Cells["typeDataGridViewTextBoxColumn"].Value.ToString().Contains("#") == false)
            {
                r.Cells["typeDataGridViewTextBoxColumn"].Value = r.Cells["typeDataGridViewTextBoxColumn"].Value.ToString() + " # " + max;
            }
            else
            {
                r.Cells["typeDataGridViewTextBoxColumn"].Value = r.Cells["typeDataGridViewTextBoxColumn"].Value.ToString().Substring(0, r.Cells["typeDataGridViewTextBoxColumn"].Value.ToString().IndexOf("#")) + "# " + max;
            }
            string querytext = "Update LogDatabase set Type = \"" + r.Cells["typeDataGridViewTextBoxColumn"].Value + "\" where HashKey = \"" + r.Cells["hashKeyDataGridViewTextBoxColumn"].Value.ToString() + "\"";
            cmd.CommandText = querytext;
            cmd.ExecuteNonQuery();
            SQLiteTrans.Commit();    
        }

У меня нет большого опыта работы с SQL.Поэтому я не уверен, что что-то не так с тем, как я обновил базу данных!

Что мне нужно отредактировать, чтобы убедиться, что все строки также обновляются в БД ?!

Помощь оценена.

Редактировать: Попытка проверки запроса перед его отправкой.

Когда я пытаюсь редактировать несколько строк вDGV без сортировки DGV по любому столбцу работает и обновляет все строки одновременно ... Но когда я пытаюсь отсортировать их по типу и затем редактировать строки, тот же запрос проходит!: |(Ключ хэша не изменяется)

Похоже, одна строка продолжает перемещаться вверх по списку строк и всегда является строкой r в цикле for.

Редактировать 2: Это определенно проблема со строками DGV Каждый раз, когда я сортирую DGV и затем пытаюсь редактировать поля, запросы имеют значения хеш-ключа, отличные откак только это я выбрал.Это как идентификаторы строк полностью изменены после одного обновления.Похоже, DGV автоматически сортирует, как только одна строка обновляется!

Есть ли способ отключить это ???!

Ответы [ 2 ]

1 голос
/ 01 июля 2011

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

string querytext = "Update LogDatabase set Type = '" + 
                    r.Cells["typeDataGridViewTextBoxColumn"].Value + 
                    "' where HashKey = '" +  
                    r.Cells["hashKeyDataGridViewTextBoxColumn"].Value.ToString() + 
                    "'";

Также остерегайтесь SQL-инъекций . Ваш код не имеет с этим дело.

1 голос
/ 01 июля 2011

Похоже, вы не увеличивали максимальный счетчик.

foreach (DataGridViewRow row in dataGridView1.SelectedRows)
{
using (SQLiteTransaction SQLiteTrans = connection.BeginTransaction())
{
    SQLiteCommand cmd = connection.CreateCommand();
    MessageBox.Show(row.ToString());

    var txtValue = row.Cells["typeDataGridViewTextBoxColumn"].Value;
    if (txtValue.Contains("#"))
    {
        txtValue = String.Format("{0} # {1}", txtValue, max);
    }else
    {
        txtValue = txtValue.SubString(0, txtValue.IndexOf("#")) + "# " + max.ToString();
    }
    string querytext = "Update LogDatabase set Type = @type where HashKey = @key";
            //Create your SqlParameters here!
    cmd.CommandText = querytext;
    cmd.ExecuteNonQuery();
    SQLiteTrans.Commit();    
    max++; //You weren't increasing your counter!!
}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...