我有一个链接到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会在一行更新后自动排序!
有没有办法禁用这个???!
答案 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。你的代码没有解决这个问题。