删除查询将不起作用
Delete query won't work
我正在尝试从数据库中删除与在组合框中选择的 ART 相同的行。我以前让它工作,但是当我更改数据库时,它应该从数据库中删除它停止工作并给了我一个 error message。我确实根据数据库更改更改了数据库连接等。
错误信息(希望图片有效)
我不知道为什么它说 "conversion failed when converting the varchar value 'R06018' to data type int" 因为我在代码中的任何地方都没有 R06018 的值,也不是选定的行。
我在delete停止工作后尝试的代码,它只是delete,没有任何额外的东西(我知道它没有处理但是程序在尝试读取时崩溃了,它只是为了找到问题)
try
{
SqlCommand inkoopartdelete = new SqlCommand("delete from ART where ART=" + artnr.SelectedItem + "", Connectie.connMEVO);
drMEVO = inkoopartdelete.ExecuteReader();
MessageBox.Show(this.artnr.SelectedItem + " verwijderd.");
}
catch (Exception e) { MessageBox.Show("" + e); }
更改数据库连接后的旧代码(设置为注释,因为我尝试了少量代码进行删除)
//SqlCommand inkoopdelete = new SqlCommand("delete from ART where ART=@art", Connectie.connMEVO_ART);
//inkoopdelete.Parameters.Add("@art", SqlDbType.VarChar).Value = artnr.SelectedItem;
//drMEVO = inkoopdelete.ExecuteReader();
//try
//{
// while (drMEVO.Read())
// { }
// MessageBox.Show(this.artnr.SelectedItem + " verwijderd.");
//}
//catch (SqlException v)
//{
// MessageBox.Show("" + v);
//}
//inkoopdelete.Dispose();
我找不到问题,希望大家能帮帮我。
发现问题,查看接受的 awnser 测试代码中的错误,真正的错误似乎是我阅读了部分代码 -_- ...srry
如果 ART 字段是 nvarchar 类型,那么如果您真的想使用字符串连接,您应该将字符串值用单引号引起来并写成
SqlCommand inkoopartdelete = new SqlCommand(@"delete from ART
where ART='" + artnr.SelectedItem + "'", Connectie.connMEVO);
这是一个足够充分的理由,可以尽快恢复到最初使用的参数化查询。避免这种情况的其他原因是,如果您的值中嵌入了单引号,则整个文本在语法上会变得错误。最后,字符串连接为 Sql 注入攻击
敞开了大门
最后一点。如果您想执行 DELETE/INSERT 或 UPDATE 之类的查询,请不要使用 ExecuteReader。它可以工作,但没有必要为这种查询构建 SqlDataReader。只需使用
int affectedRows = inkoopartdelete.ExecuteNonQuery();
更改以下声明:
你必须给单引号。
SqlCommand inkoopartdelete = new SqlCommand("delete from ART where ART='" + artnr.SelectedItem + "'", Connectie.connMEVO);
我正在尝试从数据库中删除与在组合框中选择的 ART 相同的行。我以前让它工作,但是当我更改数据库时,它应该从数据库中删除它停止工作并给了我一个 error message。我确实根据数据库更改更改了数据库连接等。
错误信息(希望图片有效)
我在delete停止工作后尝试的代码,它只是delete,没有任何额外的东西(我知道它没有处理但是程序在尝试读取时崩溃了,它只是为了找到问题)
try
{
SqlCommand inkoopartdelete = new SqlCommand("delete from ART where ART=" + artnr.SelectedItem + "", Connectie.connMEVO);
drMEVO = inkoopartdelete.ExecuteReader();
MessageBox.Show(this.artnr.SelectedItem + " verwijderd.");
}
catch (Exception e) { MessageBox.Show("" + e); }
更改数据库连接后的旧代码(设置为注释,因为我尝试了少量代码进行删除)
//SqlCommand inkoopdelete = new SqlCommand("delete from ART where ART=@art", Connectie.connMEVO_ART);
//inkoopdelete.Parameters.Add("@art", SqlDbType.VarChar).Value = artnr.SelectedItem;
//drMEVO = inkoopdelete.ExecuteReader();
//try
//{
// while (drMEVO.Read())
// { }
// MessageBox.Show(this.artnr.SelectedItem + " verwijderd.");
//}
//catch (SqlException v)
//{
// MessageBox.Show("" + v);
//}
//inkoopdelete.Dispose();
我找不到问题,希望大家能帮帮我。
发现问题,查看接受的 awnser 测试代码中的错误,真正的错误似乎是我阅读了部分代码 -_- ...srry
如果 ART 字段是 nvarchar 类型,那么如果您真的想使用字符串连接,您应该将字符串值用单引号引起来并写成
SqlCommand inkoopartdelete = new SqlCommand(@"delete from ART
where ART='" + artnr.SelectedItem + "'", Connectie.connMEVO);
这是一个足够充分的理由,可以尽快恢复到最初使用的参数化查询。避免这种情况的其他原因是,如果您的值中嵌入了单引号,则整个文本在语法上会变得错误。最后,字符串连接为 Sql 注入攻击
敞开了大门最后一点。如果您想执行 DELETE/INSERT 或 UPDATE 之类的查询,请不要使用 ExecuteReader。它可以工作,但没有必要为这种查询构建 SqlDataReader。只需使用
int affectedRows = inkoopartdelete.ExecuteNonQuery();
更改以下声明: 你必须给单引号。
SqlCommand inkoopartdelete = new SqlCommand("delete from ART where ART='" + artnr.SelectedItem + "'", Connectie.connMEVO);