Ошибка функции Parameter.addwithvalue

#c# #sql #string #object #ado.net

#c# #sql #строка #объект #ado.net

Вопрос:

     public static bool dataMatch(string data, string tableName, string column)
    {
        SqlCommand cmd = new SqlCommand();
        cmd.Connection = new SqlConnection(CnnStr);//connection string has been applied to CnnStr


        cmd.CommandText = "SELECT * FROM [@tableName] WHERE [@column]=[@data]";
        cmd.Parameters.Add("@tableName",tableName);
        cmd.Parameters.AddWithValue("@column", (column as Object).ToString());
        cmd.Parameters.AddWithValue("@data", (data as Object).ToString());

        cmd.Connection.Open();
        SqlDataReader dr = cmd.ExecuteReader();
        if (dr.Read())
        {
            dr.Close();
            cmd.Connection.Close();
            return true;
        }
        dr.Close();
        cmd.Connection.Close();
        return false;
    }
  

здравствуйте

ошибка, которую я получаю, является:

Исключение SQLException не было обработано пользовательским кодом недопустимое имя объекта @tableName

я думаю, проблема в том, что аргументы 2-го параметра функции AddWithValue являются строками, и они должны быть типа object, поэтому я попытался преобразовать параметры 2-й строки функции addwithvalue в Object или object, но получаю те же ошибки

Комментарии:

1. Это не сработает с командой. Параметры. Скорее вы должны создать свой собственный запрос и установить для этой строки значение Command. Текстовое свойство

Ответ №1:

Вы не можете параметризовать имена столбцов или таблиц.

Вы только параметризуете свои значения. Вот почему вы не можете использовать @tableName and @column в качестве параметра. Вы можете исправить их, указав имя таблицы и имя столбца как часть SQL.

Ваш код является допустимым синтаксисом для C #, но он не является допустимым SQL.

Это плохое решение, но если вы действительно хотите их использовать, взгляните на динамический SQL.

Также используйте using оператор для удаления вашего SqlConnection , SqlCommand и SqlDataReader также.

 using(SqlConnection con = new SqlConnection(CnnStr))
using(SqlCommand cmd = con.CreateCommand())
{
    cmd.CommandText = "SELECT * FROM "   tableName   " WHERE "   column.ToString()   "=@data";
    cmd.Parameters.Add("@data", data.ToString());
    using(SqlDataReader dr = cmd.ExecuteReader())
    {
        //
    }
}
  

Комментарии:

1. Спасибо. я попытался выполнить событие — cmd. CommandText = «ВЫБРАТЬ * ИЗ [» имя_таблицы «], ГДЕ [» столбец «] = [@data]»; —- но я получаю ту же ошибку для @data

2. Могу ли я узнать, как лучше всего это сделать? (вместе с параметрами имени таблицы, столбца и данных)

3. Я почти уверен, что вам не нужны скобки вокруг ‘@data’. Добавляя скобки, Sql Server интерпретирует их как имя столбца, и поэтому вы получите ту же ошибку.

4. @user3215839 AFAIK, лучший способ использовать их как часть SQL, как я показал в своем примере. Вы не можете параметризовать имя своего столбца в именах таблиц. Иногда вам просто нужно изменить свою стратегию — это лучший способ.

Ответ №2:

Вы можете достичь этого следующим методом.

  public static bool dataMatch(string data, string tableName, string column)
    {
        SqlCommand cmd = new SqlCommand();
        cmd.Connection = new SqlConnection(CnnStr);//connection string has been applied to CnnStr


        cmd.CommandText = "SELECT * FROM '" tableName "' WHERE [@column]=[@data]";

        cmd.Parameters.AddWithValue("@column", (column as Object).ToString());
        cmd.Parameters.AddWithValue("@data", (data as Object).ToString());

        cmd.Connection.Open();
        SqlDataReader dr = cmd.ExecuteReader();
        if (dr.Read())
        {
            dr.Close();
            cmd.Connection.Close();
            return true;
        }
        dr.Close();
        cmd.Connection.Close();
        return false;
    }
  

Объедините имя таблицы в запросе вместо передачи как parmater.

Комментарии:

1. Есть две ошибки: 1. не заключайте имя таблицы в кавычки, 2. вам также нужно сделать столбец динамическим.