【问题标题】:SqlCommand.Parameters.Add not converting parameters when trying to do DELETE statementSqlCommand.Parameters.Add 在尝试执行 DELETE 语句时不转换参数
【发布时间】: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


【解决方案1】:

您可能会误解参数的工作原理。 SQL 语句中的值未“替换”。 SQL 语句按原样发送,并带有单独提供的参数值。因此,您不会在客户端看到已替换值的 SQL 字符串。

换句话说,sqlstring 的值不会改变。如果这就是你正在看的,那么它不会告诉你任何事情。还有其他问题 - 在数据库中找不到该名称组合,或者在大小写、空格等方面存在一些差异。

【讨论】:

  • 哦,好吧,我的错 :) 感谢您的澄清!
猜你喜欢
  • 1970-01-01
  • 2017-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-21
  • 2022-11-06
相关资源
最近更新 更多