【发布时间】:2020-09-29 21:57:16
【问题描述】:
我正在使用以下代码对数据库进行 INSERT 查询,效果很好。
public int InsertPerson(Person person, out string errormsg)
{
SqlConnection dbConnection = new SqlConnection();
dbConnection.ConnectionString = @"Data Source=(localdb)\mssqllocaldb;Initial Catalog=PersonDB;Integrated Security=True";
String sqlstring = "INSERT INTO PersonTable ( FirstName, LastName ) VALUES ( @firstname, @lastname )";
SqlCommand dbCommand = new SqlCommand(sqlstring, dbConnection);
dbCommand.Parameters.Add("FirstName", SqlDbType.NVarChar, 30).Value = person.FirstName;
dbCommand.Parameters.Add("LastName", SqlDbType.NVarChar, 30).Value = person.LastName;
try
{
dbConnection.Open();
int i = 0;
i = dbCommand.ExecuteNonQuery();
if (i == 1)
{
errormsg = "";
}
else
{
errormsg = "Could not add person";
}
return i;
}
catch (Exception e)
{
errormsg = e.Message;
return 0;
}
finally
{
dbConnection.Close();
}
}
但是,当我尝试在 DELETE 查询中使用该逻辑时,它不会将 @firstname 和 @lastname 转换为传递给方法调用的参数值。
public int DeletePerson(Person person, out string errormsg)
{
SqlConnection dbConnection = new SqlConnection();
dbConnection.ConnectionString = @"Data Source=(localdb)\mssqllocaldb;Initial Catalog=PersonDB;Integrated Security=True";
String sqlstring = "DELETE FROM PersonTable WHERE FirstName = @firstname AND LastName = @lastname";
SqlCommand dbCommand = new SqlCommand(sqlstring, dbConnection);
dbCommand.Parameters.Add("FirstName", SqlDbType.NVarChar, 30).Value = person.FirstName;
dbCommand.Parameters.Add("LastName", SqlDbType.NVarChar, 30).Value = person.LastName;
try
{
dbConnection.Open();
int i = 0;
i = dbCommand.ExecuteNonQuery();
if (i == 1)
{
errormsg = "";
}
else
{
//errormsg = "Could not delete person";
errormsg = sqlstring;
}
return i;
}
catch (Exception e)
{
errormsg = e.Message;
return 0;
}
finally
{
dbConnection.Close();
}
}
从 DELETE 方法创建的查询类似于 DELETE FROM PersonTable WHERE FirstName = @firstname AND LastName = @lastname
当我硬编码 SQL 查询时它可以正常工作,但当我使用 Person 参数的属性作为查询的一部分时就不行了。..
【问题讨论】:
-
"从 DELETE 方法创建的查询如下所示" 你在哪里看到这个?除了可能在某些 SQL 日志中之外,您不会看到注入的值。您是否看到替换为 INSERT 查询的值?
-
i = dbCommand.ExecuteNonQuery();你是说 i = 0?还是有例外?如果硬编码版本有效,那么您必须使用调试器来查看有什么区别。虽然看起来可行,但我更喜欢匹配参数名称:dbCommand.Parameters.Add("FirstName"...应该是dbCommand.Parameters.Add("@firstname"...等。 -
你能确认
person对象不为NULL,并且它的名字和姓氏不超过30个字符吗? -
尝试在变量名中包含@符号并使用相同的大小写,如 dbCommand.Parameters.Add("@firstname",...
-
噢,对了@LarsTech 我的错误,如果成功它不会返回 1,它会返回受影响的行数或其他东西 - 当我将参数名称从“FirstName”更改为“@firstname”时它可以工作并返回被删除的帖子数量:D 你能解释一下原因吗?
标签: c# asp.net-core-mvc sqlcommand