Добавьте имя столбца и таблицы в качестве параметров в запросы SqlCommand, например «ВЫБЕРИТЕ @col из @таблицы» .

#c# #sql-server #distinct #sqldatareader #sqlcommand

Вопрос:

Я работаю над приложением, читаю таблицы в базе данных MS-SQL. Обычно такой способ работы подходит:

 sqlCommand.CommentText = $"SELECT {Col_Name} FROM {variable}";
sqlReader = sqlCommand.ExecuteReader();
while (sqlDataReader.Read())
{
    <retrieve> sqlDataReader.GetString(0); // this takes the value of Col_Name
}
 

Однако теперь я использую SELECT DISTINCT запрос, и все идет не так, как надо:

 for (int i = 0; i< dt_main.Columns.Count - 1; i  ) // dt_main is a DataTable, containing the columns.
                                                   // This is checked and working fine.
{
    string col_Name = dt_main.Columns[i].Caption; // This seems to be correct too.
    sqlCommand.CommandText = $"SELECT DISTINCT @col FROM {cmb_Table_Names.SelectedItem}"; 
                                   // cmb_Table_Names.SelectedItem contains the table name -> Ok.
    sqlCommand.Parameters.Clear(); // In the program, I'm always using the same 
                                   // sqlCommand object, so the parameters need to be cleared first.
    sqlCommand.Parameters.AddWithValue("col", col_Name);
    sqlDataReader = sqlCommand.ExecuteReader();
    string value_in_table = "";
    while (sqlDataReader.Read())
    { 
        value_in_table = sqlDataReader.GetString(0); // try read the distinct values.
                                                     // NOK: the column name is read instead.
    }
    sqlDataReader.Close();
}
 

Как вы можете видеть из комментариев, ошибка ( NOK ) означает , что заданы не значения внутри столбцов value_in_table , а имя столбца.
Примечание: Я попробовал SELECT DISTINCT запрос в среде MS-SQL management studio, и он работает правильно.
Замечание 2: Я также провел отчаянный эксперимент value_in_table = sqlDataReader.GetString(1); , который, очевидно, с треском провалился 🙂

Поскольку я новичок в SqlCommand этом и SqlDataReader в этом, и вчера я застрял на совершенно непредвиденной проблеме, я боюсь, что снова попадаю в какую-то странную ловушку.

Кто-нибудь знает, что мне нужно сделать, чтобы прочитать значения, а не имена столбцов?

Заранее спасибо

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

1. вы не можете передавать имена столбцов или таблиц в качестве параметра …

2. @Селвин. Ты прав. Я заменил свою командную строку SQL на $"SELECT DISTINCT {col_Name} FROM {cmb_Table_Names.SelectedItem}"; , и теперь она работает нормально. Пожалуйста, напишите это в качестве ответа, я приму его.

3. Normally this way of working is fine: Я очень удивлен, что это работает, учитывая, что вы передаете имя столбца в качестве параметра. Вы проверили, что это работает?

4. @mjwills: Вы правы, я соответствующим образом адаптировал свой вопрос.

5. Не используйте addwithvalue

Ответ №1:

вы не можете использовать имя столбца в качестве параметра команды, сделайте все это строкой sql

 sqlCommand.CommandText = $"SELECT DISTINCT {col_name} FROM {cmb_Table_Names.SelectedItem}"; 
 

Я уверен, что ПО знает о sql-инъекциях.