【问题标题】:C# ADO.NET Parametrized queryC# ADO.NET 参数化查询
【发布时间】:2019-01-31 20:08:11
【问题描述】:

我有一个 T-SQL 和查询:

string queryString = @"SELECT AGENT.Number, PERSON.LoginName, AGENT.EnterpriseName FROM Agent AGENT INNER JOIN Person PERSON ON AGENT.PersonID = PERSON.PersonID WHERE LOWER(EnterpriseName) LIKE @entname";

string connStr = null;

try
{
    connStr = ConfigurationManager.ConnectionStrings["DB"].ConnectionString + ToInsecureString(Decrypt(ConfigurationManager.AppSettings["admin"])) + ";";
}
catch (Exception ex)
{
    Logs.WriteMessage("Error while making connStr " + ex.TargetSite + ex.StackTrace + ex.ToString());
}

try
{
    using (SqlConnection connection = new SqlConnection(connStr))
    {
        connection.Open();

        using (SqlCommand command = new SqlCommand(queryString, connection))
        {
            SqlParameter param = new SqlParameter
                    {
                        ParameterName = "@entname",
                        Value = "'%" + agentName + "%'"
                    };
            command.Parameters.Add(param);

            using (SqlDataReader reader = command.ExecuteReader())
            {
                while (reader.Read())
                {
                    login = (string)reader[1];
                    userID = (string)reader[0];
                }
            }
        }

        connection.Close();
    }
}

这行不通。我没有得到任何结果,但是当我在查询中使用值而不是 @parameter 时,我得到了正确的结果。

参数@entname 未替换为值,因此查询失败。请给我一个提示。

当我停在断点并查看查询时,它看起来:

SELECT AGENT.Number, PERSON.LoginName, AGENT.EnterpriseName 
FROM Agent AGENT 
INNER JOIN Person PERSON ON AGENT.PersonID = PERSON.PersonID 
WHERE LOWER(EnterpriseName) LIKE @entname

所以没有任何改变。

【问题讨论】:

  • 查询在调试器下看起来是一样的,它不是在做字符串替换。你怎么知道它失败了?
  • 因错误而失败?还是像空读者一样失败?去掉值中的那些单引号。
  • 因为我没有得到有效的结果,但是当我在查询中使用值而不是@parameter 我得到正确的结果
  • 不严格相关:如果连接字符串,您尝试捕获创建。如果有错误,你记录它(好的)并继续,因为什么都没发生(不好)。如果connstring 为空,下面的代码应该做什么?

标签: c# .net ado


【解决方案1】:

参数@entname 未替换为值,因此查询失败。

这不是参数的工作方式。 @entname 参数标记与匹配的参数值一起保留在发送到 SQL Server 的查询中。

因此,由于这种误解,您引用了参数值,就好像它要粘贴到 SQL 查询中一样:

Value = "'%" + agentName + "%'"

这是你不应该做的。而是这样做

Value = "%" + agentName + "%"

【讨论】:

  • 此外,您可能希望转义 agentName - public static string SqlLikeEscape(this string value) { if (string.IsNullOrEmpty(value)) { return value; } return Regex.Replace(value, @"(?<ch>%|_|\[)", @"[${ch}]"); } 否则 agentName 搜索在某些情况下会表现得很奇怪(例如,如果代理名称是 mjw%wills
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多