使用listview项进行多SQL表更新

时间:2015-10-17 18:40:30

标签: c# sql listview

我有一个包含itemcode - itemcount - tablename的SQL table1 我的windows form1包含listview1和button1。

当我点击button1时,列中的所有listview1 SubItems 1值都应该从SubItems [2]值中的表名更新,其中itemcode值是SubItems [0]。

我尝试了以下代码,但没有按原样运行,因为它只执行与第一行有关的操作,而不是listview1中的其余行:

foreach (ListViewItem item in listView1.Items)
{
    item.Selected = true;
}
if (cn.State == ConnectionState.Closed) cn.Open();
cm = new SqlCommand();
cm.Connection = cn;

ListViewItem lvi1 = listView1.SelectedItems[0];
string tableName = lvi1.SubItems[2].Text;
string itemcode1 = lvi1.SubItems[0].Text;
string itemcode2 = lvi1.SubItems[1].Text;

string sql = "UPDATE " + tableName + " SET [itemcount]= " + itemcode2 + " WHERE [itemcode]= " + itemcode1 + " AND [itemcount] IS NOT NULL";
cm.CommandText = sql;
cm.ExecuteNonQuery();

这是屏幕截图:

我的3张桌子是相同的 当用户点击按钮“保存”它减去蓝色高亮显示列中的所有值时,其值已经在黑色高亮显示的列中,其中itemcode = red高亮显示列如下:

listview1 and it's values

带有代码1的1-项目存在于testtbl1中,黑色突出显示的列显示并且它的计数为50:

testtbl  :  itemcode   itemcount   tablename
               1           50      testtbl1

[在此输入图像说明] [3]

带有代码2的2项目存在于testtbl2中,黑色突出显示的列显示并且它的计数为40:

testtbl2   itemcode   itemcount   tablename
              2            40      testtbl2

[在此处输入图像说明] [4]

3-现在如第一张照片所示,项目代码计数:1是15,项目代码:2计数是20

现在当用户点击保存按钮时,它应该减去每个项目表中项目中蓝色突出显示列中每个项目的项目数量,以得到以下结果:

[结果在testtbl1] [5]

testtbl    itemcode   itemcount   tablename
              1           35      testtbl1

[结果在testtbl2] [6]

testtbl2   itemcode   itemcount   tablename
              2            20      testtbl2

2 个答案:

答案 0 :(得分:0)

我仍然觉得你的一些问题令人困惑,但我认为这很接近你想要的。我想你想为每一行运行一个更新,但你只是为第一个选定的行进行了更新。如果您想要更新每一行,那么您根本不需要打扰SelectedRows,只需将它们全部循环。 你说你想减去计数,但你的查询没有这样做,我把它放进去,我希望它是你想要的。 从我读到的,SubItems从第二列(listview索引1)开始,所以我调整了SubItems访问。如果我弄错了,请重新调整。 最后,如果允许用户在ListView中输入自由格式文本,则此代码会引发SQL注入危险,因此请确保在插入Update语句中的值之前清理数据。

string sql = "UPDATE {0} SET [itemcount] = [itemcount] - {1} WHERE [itemcode] = {2} AND [itemcount] IS NOT NULL";
foreach (ListViewItem item in listView1.Items)
{
    string qry = string.Format(sql, item.SubItems[1].Text, item.SubItems[0].Text, item.Text);
    using(cm = new SqlCommand(qry, cn))
    {
       cn.Open();
       cm.ExecuteNonQuery();
       cn.Close();
    }
}

跟进:

要使用参数,请将SQL更改为:

string sql = "UPDATE {0} SET [itemcount] = [itemcount] - @itemcount WHERE [itemcode] = @itemcode AND [itemcount] IS NOT NULL";

并将SqlParameters添加到Command(假设为SqlDbTypes):

SqlParameter par_ItemCount = new SqlParameter("@itemcount", SqlDbType.Int);
par_ItemCount.Value = int.Parse(item.SubItems[0].Text);
cm.Parameters.Add(par_ItemCount);

SqlParameter par_ItemCode = new SqlParameter("@itemcode", SqlDbType.Int);
par_ItemCode.Value = int.Parse(item.Text);
cm.Parameters.Add(par_ItemCode);

但是,表名仍然存在问题。您不能将参数用于表名。如果用户可以编辑表名的任何可能方式,则必须在将其注入SQL之前对其进行验证。这可以像在有效表名列表中检查一样简单。

答案 1 :(得分:0)

foreach(taskShowListView.Items中的ListViewItem itemRow)             {

            if (itemRow.Selected == true)
            {

                int taskId = Convert.ToInt32(itemRow.SubItems[0].Text);
                string taskDate = itemRow.SubItems[1].ToString();
                string taskDescription = itemRow.SubItems[2].ToString();

                MessageBox.Show("selected");

                ListViewItem listViewItem = new ListViewItem(Convert.ToInt32(taskId[0].Text));
                listViewItem.SubItems.Add(**taskDate[1]**.ToString());
                listViewItem.SubItems.Add(taskDescription[2].ToString());
                taskShowListView.Items.Add(listViewItem);


            }

        }