C#中的SQL参数未按预期工作

时间:2013-06-09 10:43:07

标签: c# sql sql-server parameters

我认为我在这里某处犯了一个相当业余的错误,但我无法让SQL参数在C#中可靠地工作。请考虑以下代码:

        protected string[] Query(string dataToFind, string tableName, string fieldToCheck, string fieldToReturn)
    {
        SqlConnection connection = new SqlConnection(ConfigurationSettings.AppSettings["ConnectionString"]);

        SqlDataReader dataReader = null;
        SqlCommand command = connection.CreateCommand();

        command.CommandText = "SELECT " + fieldToReturn + " FROM " + tableName + " WHERE " + fieldToCheck " = '" + dataToFind "'";

        try
        {
            connection.Open();
            dataReader = command.ExecuteReader();
etc...

这将按照您的预期执行,从表fieldToReturn返回tableName。但是,据我所知,这对于SQL注入来说是不可避免的,并且避免这种情况的正确方法是使用参数。所以我将代码更改为以下内容:

protected string[] Query(string dataToFind, string tableName, string fieldToCheck, string fieldToReturn)
    {
        SqlConnection connection = new SqlConnection(ConfigurationSettings.AppSettings["ConnectionString"]);

        SqlParameter[] parameters = new SqlParameter[4];
        parameters[0] = new SqlParameter("@dataToFind", dataToFind);
        parameters[1] = new SqlParameter("@name", tableName);
        parameters[2] = new SqlParameter("@fieldToCheck", fieldToCheck);
        parameters[3] = new SqlParameter("@fieldToReturn", fieldToReturn);

        SqlDataReader dataReader = null;
        SqlCommand command = connection.CreateCommand();
        command.Parameters.AddRange(parameters);

        command.CommandText = "SELECT @fieldToReturn FROM @tableName WHERE @fieldToCheck = @dataToReturn";

        try
        {
            connection.Open();
            dataReader = command.ExecuteReader();
etc...

如果我的数据库中有3个匹配项,则第一个代码示例将返回3个匹配项。第二个代码返回0结果?!

我是愚蠢的,错过了一些明显的东西吗?

1 个答案:

答案 0 :(得分:0)

您的参数是:

@dataToFind
@name
@fieldToCheck
@fieldToReturn

您的查询的CommandText具有:

@fieldToReturn
@tableName
@fieldToCheck
@dataToReturn

这些不匹配。它们必须匹配才能正确应用。