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

所以什么都没有改变。


呼唤远方
浏览 222回答 1
1回答

慕虎7371278

参数@entname不会替换为值,因此查询失败。这不是参数的工作方式。参数标记与匹配的参数值一起保留在发送到 SQL Server 的查询中。@entname因此,由于存在这种误解,您正在引用参数值,就好像它将要粘贴到SQL查询中一样:Value = "'%" + agentName + "%'"你不应该这样做。相反,做Value = "%" + agentName + "%"
打开App,查看更多内容
随时随地看视频慕课网APP