首页 新闻 会员 周边

为什么删除一个数据把整张表都给删了?

0
[已解决问题] 解决于 2017-01-05 16:04

这是删除按钮的代码,本意是想在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();
}

c#
问题补充:

这是完整代码

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)
{

}

}
}

姚刘乐的主页 姚刘乐 | 初学一级 | 园豆:70
提问于:2016-11-08 15:10
< >
分享
最佳答案
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());
}

else{

//todo 不写else,where 1=1 当然全删除咯

return;

}

 

奖励园豆:5
czd890 | 专家六级 |园豆:14412 | 2016-11-08 17:29
其他回答(4)
0

第一句就是全删除,然后if 和else if ——具体内容不看,那么还有else,因此sql就是第一句的全删,照此执行肯定可以出现全删。 

花飘水流兮 | 园豆:13560 (专家六级) | 2016-11-08 15:15

第一个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处删除啊

支持(0) 反对(0) 姚刘乐 | 园豆:70 (初学一级) | 2016-11-08 15:19

@程序猿新生儿: 你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)

支持(0) 反对(0) ~扎克伯格 | 园豆:1923 (小虾三级) | 2016-11-08 15:32

@~扎克伯格: 哦哦,应该是else if()这个条件没有成立,直接就delete from where 1=1了,我在后面加了个else{sql = sql + "and ID=" + Convert.ToInt32(dgv1.CurrentRow.Cells[0].Value.ToString());}就好多了,谢谢哈

支持(0) 反对(0) 姚刘乐 | 园豆:70 (初学一级) | 2016-11-08 15:34

现在改了变成删除选中单元格的哪一行,是把选中单元格的那一行都给删掉了,怎么做才能只删掉选中的单元格的内容而不是整行都给删了啊?

支持(0) 反对(0) 姚刘乐 | 园豆:70 (初学一级) | 2016-11-08 15:40

@程序猿新生儿: 那你用update,delete干不了你说的那事,要用delete也是delete+insert。

支持(0) 反对(0) Daniel Cai | 园豆:10424 (专家六级) | 2016-11-08 15:44

@Daniel Cai: 

这样?

string sqlUpdate = "update Table_2 set conn ='" + tb1.Text +
"'where conn='" + dgv1.ToString() + "'";

意思是用修改然后把原本单元格的内容改成“  ”?

支持(0) 反对(0) 姚刘乐 | 园豆:70 (初学一级) | 2016-11-08 15:47

@程序猿新生儿: 你更新的语句肯定是update tb set columnname=@value ... where [condition]

你现在要确认出选中单元格对应的columnname,对应的value按照你的意思就是更新为空字符串或者null,

条件按照我理解的意思应该是id=(你选择的当前行对应数据的id)。其次这里你需要额外做些工作去避免sql注入的风险。

另,印象中ado.net中的datatable啥的有方法可以直接回写数据到db(记不太清楚了)

支持(0) 反对(0) Daniel Cai | 园豆:10424 (专家六级) | 2016-11-08 15:55

@Daniel Cai: 哦哦,好的,我试试看,谢谢哈

支持(0) 反对(0) 姚刘乐 | 园豆:70 (初学一级) | 2016-11-08 15:57
1

小伙子,有前途,下次把代码改成truncate table更带劲。

Daniel Cai | 园豆:10424 (专家六级) | 2016-11-08 15:17

T-T新手啊,求解释

支持(0) 反对(0) 姚刘乐 | 园豆:70 (初学一级) | 2016-11-08 15:20

@程序猿新生儿: 看清楚你的if else if,如果都不满足不就蛋疼了?

支持(0) 反对(0) Daniel Cai | 园豆:10424 (专家六级) | 2016-11-08 15:28

@Daniel Cai: 是哎,改完好多了,仅仅是好多了,没有删完整张表还特么剩下两个数值

支持(0) 反对(0) 姚刘乐 | 园豆:70 (初学一级) | 2016-11-08 15:37

不对不对,是把选中单元格的那一行都给删掉了,怎么做才能只删掉选中的单元格的内容而不是整行都给删了啊?

支持(0) 反对(0) 姚刘乐 | 园豆:70 (初学一级) | 2016-11-08 15:39
0

delete from Table_2 where 1=0

吴瑞祥 | 园豆:29449 (高人七级) | 2016-11-08 15:24

不行啊,如果改成where1=0,它就是false,点删除就会显示不存在的标签

支持(0) 反对(0) 姚刘乐 | 园豆:70 (初学一级) | 2016-11-08 15:28
0

如果你的限制条件为空,就可能执行delete * from table,就删除了所有数据

凯伦 | 园豆:186 (初学一级) | 2016-11-09 10:59
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册