#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-инъекциях.