这是删除按钮的代码,本意是想在DataGridView里面删除鼠标点中的单元格,结果把整张表都给删掉了,为啥呐
private void button3_Click(object sender, EventArgs e)
{
string sql = "delete from Table_2 where 1=1";
if (tb1.Text.Trim() == "")
{
MessageBox.Show("无标签可删!");
return;
}
else if (dgv1.CurrentRow.Selected)
{
sql = sql + "and ID=" + Convert.ToInt32(dgv1.CurrentRow.Cells[0].Value.ToString());
}
int n = 0;
SqlConnection conn = new SqlConnection(connStr);
SqlCommand cmd = new SqlCommand(sql, conn);
conn.Open();
n = cmd.ExecuteNonQuery();
if (n == 0)
{
MessageBox.Show("不存在的标签!");
return;
}
else if (n > 0)
{
MessageBox.Show("删除成功!");
}
conn.Close();
//删除完后刷新当前数据
Refresh();
}
这是完整代码
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Collections;
using System.Configuration;
namespace WindowsFormsApplication1
{
public partial class f1 : Form
{
public f1()
{
InitializeComponent();
}
string connStr = ConfigurationManager.ConnectionStrings["str"].ConnectionString;
private void Form1_Load(object sender, EventArgs e)
{
}
private void button1_Click(object sender, EventArgs e)
{
string sql = "select id,ios,kfyy,qdkf,javascript,android,PHP,sjk,NET from Table_2";
SqlConnection conn = new SqlConnection(connStr);
SqlCommand cmd = new SqlCommand(sql, conn);
DataTable dt = new DataTable();
SqlDataAdapter sda = new SqlDataAdapter(cmd);
sda.Fill(dt);
dgv1.DataSource = dt;
}
private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
{
//获取字段名为ios的单元格内容
tb1.Text = dgv1.Rows[e.RowIndex].Cells[e.ColumnIndex].Value.ToString();
tb2.Text = dgv1.Rows[e.RowIndex].Cells["ID"].Value.ToString();
}
private void button3_Click(object sender, EventArgs e)
{
string sql = "delete from Table_2 where 1=0";
if (tb1.Text.Trim() == "")
{
MessageBox.Show("无标签可删!");
return;
}
else if (dgv1.CurrentRow.Selected)
{
sql = sql + "and ID=" + Convert.ToInt32(dgv1.CurrentRow.Cells[0].Value.ToString());
}
int n = 0;
SqlConnection conn = new SqlConnection(connStr);
SqlCommand cmd = new SqlCommand(sql, conn);
conn.Open();
n = cmd.ExecuteNonQuery();
if (n == 0)
{
MessageBox.Show("不存在的标签!");
return;
}
else if (n > 0)
{
MessageBox.Show("删除成功!");
}
conn.Close();
//删除完后刷新当前数据
Refresh();
}
private void tb1_TextChanged(object sender, EventArgs e)
{
}
private void tb2_TextChanged(object sender, EventArgs e)
{
}
private void button2_Click(object sender, EventArgs e)
{
//定义一个初始值n=0,用于判断后期是否成功插入数据
int n = 0;
string sql = "insert into Table_2(ios)values (@ios)";
//判断插入数据是否为空,如果为空,则提示重新插入
if (tb1.Text.Trim() == "")
{
MessageBox.Show("插入数据不能为空,请重新插入!");
return;
}
//向数据库插入参数
SqlParameter[] param = {
new SqlParameter("@ios",tb1.Text),
};
SqlConnection conn = new SqlConnection(connStr);
SqlCommand cmd = new SqlCommand(sql, conn);
conn.Open();
cmd.Parameters.AddRange(param);
n = cmd.ExecuteNonQuery();
if (n == 0)
{
MessageBox.Show("添加失败!");
return;
}
else if (n > 0)
{
MessageBox.Show("添加成功");
}
conn.Close();
//调用refresh方法,在添加完成数据后,自动刷新,显示新数据
Refresh(true);
}
private void button4_Click(object sender, EventArgs e)
{
//在对数据进行修改前,对文本框的内容做一下检查,如果为空,则提示重新输入
if (tb1.Text.Trim() == "")
{
MessageBox.Show("文本框内容不能为空!");
return;
}
//使用SQL update更新语句
//获取文本框中输入的内容,通过ID进行更新(ID为当前鼠标点击行的ID)
string sqlUpdate = "update Table_2 set conn ='" + tb1.Text +
"'where conn='" + dgv1.ToString() + "'";
SqlConnection conn = new SqlConnection(connStr);
SqlCommand cmdUpdate = new SqlCommand(sqlUpdate, conn);
conn.Open();
int n = cmdUpdate.ExecuteNonQuery();
// if (n == 0)
// {
//提示失败
// MessageBox.Show("更新失败!");
// return;
// }
// else if (n > 0)
// {
//更新成功
MessageBox.Show("更新成功!");
// }
//完成更新后,关闭数据库,释放资源空间
conn.Close();
//刷新
Refresh();
}
public void Refresh(bool isAdded = false)
{
string sql = "select ios from Table_2";
SqlConnection conn = new SqlConnection(connStr);
SqlCommand cmd = new SqlCommand(sql, conn);
DataTable dt = new DataTable();
SqlDataAdapter sda = new SqlDataAdapter(cmd);
sda.Fill(dt);
dgv1.DataSource = dt;
if (isAdded)
{
if (dt.Rows.Count > 0) dgv1.Rows[0].Selected = false;
dgv1.Rows[dt.Rows.Count - 1].Selected = true;
}
}
private void tb2_TextChanged_1(object sender, EventArgs e)
{
}
}
}
if (tb1.Text.Trim() == "")
{
MessageBox.Show("无标签可删!");
return;
}
else if (dgv1.CurrentRow.Selected)
{
sql = sql + "and ID=" + Convert.ToInt32(dgv1.CurrentRow.Cells[0].Value.ToString());
}
else{
//todo 不写else,where 1=1 当然全删除咯
return;
}
第一句就是全删除,然后if 和else if ——具体内容不看,那么还有else,因此sql就是第一句的全删,照此执行肯定可以出现全删。
第一个if是判断textBox是否为空的,如果不是空就执行sql = sql + "and ID=" + Convert.ToInt32(dgv1.CurrentRow.Cells[0].Value.ToString());按理说执行了这条语句后
sql的语句应该变为sql=delete from Table_2 where 1=1+and ID,应该是选中的ID处删除啊
@程序猿新生儿: 你debug进去看啊!按理说是不管用的,debug可以看到到底后台是怎么处理的,如果走到
1 else if (dgv1.CurrentRow.Selected) 2 { 3 sql = sql + "and ID=" + Convert.ToInt32(dgv1.CurrentRow.Cells[0].Value.ToString()); 4 }
这里了,你看下sql是什么?然后再把这个完整的sql拿到数据库执行下,结果一目了然(别去delete 可以换成select)
@~扎克伯格: 哦哦,应该是else if()这个条件没有成立,直接就delete from where 1=1了,我在后面加了个else{sql = sql + "and ID=" + Convert.ToInt32(dgv1.CurrentRow.Cells[0].Value.ToString());}就好多了,谢谢哈
现在改了变成删除选中单元格的哪一行,是把选中单元格的那一行都给删掉了,怎么做才能只删掉选中的单元格的内容而不是整行都给删了啊?
@程序猿新生儿: 那你用update,delete干不了你说的那事,要用delete也是delete+insert。
@Daniel Cai:
这样?
string sqlUpdate = "update Table_2 set conn ='" + tb1.Text +
"'where conn='" + dgv1.ToString() + "'";
意思是用修改然后把原本单元格的内容改成“ ”?
@程序猿新生儿: 你更新的语句肯定是update tb set columnname=@value ... where [condition]
你现在要确认出选中单元格对应的columnname,对应的value按照你的意思就是更新为空字符串或者null,
条件按照我理解的意思应该是id=(你选择的当前行对应数据的id)。其次这里你需要额外做些工作去避免sql注入的风险。
另,印象中ado.net中的datatable啥的有方法可以直接回写数据到db(记不太清楚了)
@Daniel Cai: 哦哦,好的,我试试看,谢谢哈
小伙子,有前途,下次把代码改成truncate table更带劲。
T-T新手啊,求解释
@程序猿新生儿: 看清楚你的if else if,如果都不满足不就蛋疼了?
@Daniel Cai: 是哎,改完好多了,仅仅是好多了,没有删完整张表还特么剩下两个数值
不对不对,是把选中单元格的那一行都给删掉了,怎么做才能只删掉选中的单元格的内容而不是整行都给删了啊?
delete from Table_2 where 1=0
不行啊,如果改成where1=0,它就是false,点删除就会显示不存在的标签
如果你的限制条件为空,就可能执行delete * from table,就删除了所有数据