基本上这是我的插入函数,它将字符串插入到sql表中
[System.Web.Services.WebMethod]
public static string InsertData(string ID)
{
string connectionString = ConfigurationManager.ConnectionStrings["SimpleDB"].ToString();
using (SqlConnection con = new SqlConnection(connectionString))
{
using (SqlCommand cmd = new SqlCommand("Insert into Book (Name) values(@Name)", con))
{
con.Open();
cmd.Parameters.AddWithValue("@Name", ID);
cmd.ExecuteNonQuery();
con.Close();
return "True";
}
}
}
现在我想从这个表中删除一行,如果存在,我尝试了这个,但我似乎在执行查询时遇到错误。
[System.Web.Services.WebMethod]
public static string DeleteData(string ID)
{
string connectionString = ConfigurationManager.ConnectionStrings["SimpleDB"].ToString();
using (SqlConnection con = new SqlConnection(connectionString))
{
using (SqlCommand cmd = new SqlCommand
(
"Delete from Book Where Name = "+ID.ToString()
, con))
{
con.Open();
cmd.ExecuteNonQuery();
con.Close();
return "True";
}
}
}
答案 0 :(得分:2)
注意传递给方法的ID变量是一个字符串?
这意味着WHERE子句中使用的Name
字段期望字符串找到要删除的行。当用作Sql WHERE中的值时,字符串用单引号括起来。
例如,如果直接在Sql Server Management Studio中编写查询:
DELETE FROM Book WHERE Name = 'xyz'
如果没有引号,您会收到错误,这可能是您现在的问题。
解决方案就是按照插入新行时使用的相同步骤进行操作。 参数化查询,您不必担心引用字符串或更糟糕的Sql Injections
[System.Web.Services.WebMethod]
public static string DeleteData(string ID)
{
string connectionString = ConfigurationManager.ConnectionStrings["SimpleDB"].ToString();
using (SqlConnection con = new SqlConnection(connectionString))
{
using (SqlCommand cmd = new SqlCommand(@"Delete from Book
Where Name = @ID" , con))
{
con.Open();
cmd.Parameters.AddWithValue("@ID", ID);
cmd.ExecuteNonQuery();
con.Close();
return "True";
}
}
}
删除操作是安全的,因为如果记录不存在,则WHERE子句找不到要删除的任何行。但是,如果您需要用于其他目的检查是否存在记录,您可以编写类似这样的内容
public static bool Exists(string ID)
{
string connectionString = ConfigurationManager.ConnectionStrings["SimpleDB"].ToString();
using (SqlConnection con = new SqlConnection(connectionString))
using (SqlCommand cmd = new SqlCommand(@"
IF EXISTS(SELECT 1 FROM Book Where Name = @ID)
SELECT 1 ELSE SELECT 0" , con))
{
con.Open();
cmd.Parameters.AddWithValue("@ID", ID);
int result = Convert.ToInt32(cmd.ExecuteScalar());
return (result == 1);
}
}