C# ADO.NET 参数化查询



我有一个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

所以什么都没有改变。

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

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

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

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

你不应该这样做。 而是做

Value = "%" + agentName + "%"

最新更新