SQL Update - 不更新for循环中的多个行

时间:2011-07-01 18:26:22

标签: c# sql winforms sqlite datagridview

我有一个链接到SQlite数据库的DataGridView(DGV)。我想更新有关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进行排序时,它会工作并同时更新所有行...但是当我尝试根据“类型”对它们进行排序然后编辑行时,相同查询通过了! :| (哈希键不会改变)

就像,一行不断向上移动行列表,并且在for循环中始终是 行r

编辑2:这绝对是DGV行的问题 每次我对DGV进行排序,然后尝试编辑字段时,查询的hashkey值与我选择的一次不同。就像行ID一次更新后完全改变一样。看起来DGV会在一行更新后自动排序!

有没有办法禁用这个???!

2 个答案:

答案 0 :(得分:1)

看起来你没有增加最大计数器。

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!!
}
}

答案 1 :(得分:1)

您的问题是您在SQL查询中使用双引号来分隔字符串值。将它们替换为单引号:

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

另外,请注意SQL Injection。你的代码没有解决这个问题。