Green Blanket Ответов: 3

Как я предполагаю выбирать записи из базы данных, используя список идентификаторов внутри массива


Я хотел получить записи базы данных о каждом идентификаторе внутри
list<int> list_of_id = new list<int>();

затем сохраните всю собранную запись каждого идентификатора, который находится внутри
list<int> list_of_id = new list<int>();
в
DataTable dt = new DataTable();


Я с нетерпением жду ваших предложений и ответов.

Что я уже пробовал:

Вот что я сделал:
Я уже закончил с первым требованием, которое заключается в извлечении всех идентификаторов нечленов из user_register_table и хранении их всех в
list<int> list_of_id = new list<int>();


using(MySqlConnection con = new MySqlConnection(connectionstring))
          {
           con.Open();
            using(MySqlCommand com = new MySqlCommand("SELECT * FROM 
                  user_register_table WHERE user_status='none-member'",con))
                  {
                    MySqlDataReader reader = com.ExecuteReader();
                    while (reader.Read())
                    {
                       list_of_id.Add((int)reader["register_id"]);
                    }
                    reader.Dispose();
                  }


Я преобразовал элементы списка<int> В массив;
int[] ints = all_joined_group_id.ToArray();


Последнее, что нужно заполнить
DataTable dt = new DataTable();
с записями от
MySqlDataAdapter adp = new MySqlDataAdapter(com)


using (MySqlCommand com = new MySqlCommand("SELECT * FROM clientdebt_table WHERE 
            clientdebt_id IN (@unique_ids)", con))
            {
             com.Parameters.AddWithValue("@unique_ids",ints);
                    using (MySqlDataAdapter adp = new MySqlDataAdapter(com))
                    {
                        adp.Fill(dt);
                       //here is the problem: dt is supposed to have records of every
                       //id inside the ints array;
                    }
            }
      }//end of connection

3 Ответов

Рейтинг:
27

OriginalGriff

Объединение идентификаторов в строку - плохая идея, она поощряет SQL-инъекцию.
Лучшим методом является передача параметра Table Values: Использование табличных параметров в SQL Server и .NET[^] Если вы посмотрите на раздел:

Цитата:
Передача Табличнозначных параметров из ADO .NET
Он показывает, как это сделать.


Green Blanket

Эй, большое вам спасибо за ссылку, которую вы мне дали!

OriginalGriff

Всегда пожалуйста!
(Извините, если вы подумали, что я чувствую, что вы высокомерны - это не было намерением, и если я оскорбил вас, я приношу свои глубокие извинения!)

Но вы должны следить за SQL - инъекцией - когда вы объединяете строки, чтобы сформировать команду SQL, вы открываете свою БД для того, кто ввел строковые данные, и если это пользователь, вы настраиваете себя на мир боли!

Когда вы объединяете строки, вы вызываете проблемы, потому что SQL получает такие команды, как:

SELECT * FROM MyTable WHERE StreetAddress = 'Baker's Wood'
Цитата, добавленная пользователем, завершает строку в том, что касается SQL, и вы получаете проблемы. Но могло быть и хуже. Если я приду и наберу вместо этого: "x';DROP TABLE MyTable;--", то SQL получит совсем другую команду:
SELECT * FROM MyTable WHERE StreetAddress = 'x';DROP TABLE MyTable;--'
Которые SQL видит как три отдельные команды:
SELECT * FROM MyTable WHERE StreetAddress = 'x';
Совершенно правильный выбор
DROP TABLE MyTable;
Вполне допустимая команда "удалить таблицу"
--'
А все остальное-это комментарии.
Так оно и происходит: выбирает любые совпадающие строки, удаляет таблицу из базы данных и игнорирует все остальное.

Поэтому всегда используйте параметризованные запросы! Или будьте готовы часто восстанавливать свою БД из резервной копии. Вы ведь регулярно делаете резервные копии, не так ли?
Вот почему я упомянул об этом - решение Майкрофта сработает, но оно создает опасный прецедент, и его следует избегать.

Green Blanket

Огромное спасибо. Я также записываю ваш последний ответ. Это действительно удивительно, что я получил очень содержательный ответ. Это первый раз, так что большое вам спасибо.

OriginalGriff

Всегда пожалуйста!

Рейтинг:
2

Richard Deeming

Конечно, вам лучше использовать один запрос вместо двух?

SELECT 
    * 
FROM 
    clientdebt_table 
WHERE 
    clientdebt_id IN 
    (
        SELECT register_id 
        FROM user_register_table 
        WHERE user_status = 'none-member'
    )

Или:
SELECT 
    clientdebt_table.* 
FROM 
    clientdebt_table 
    INNER JOIN user_register_table 
    ON user_register_table.register_id = clientdebt_table.clientdebt_id 
WHERE 
    user_register_table.user_status = 'none-member'


Maciej Los

5ed!

Рейтинг:
1

Mycroft Holmes

Преобразуйте Unique_IDs в строку, разделенную запятыми, и измените тип данных параметра на VARCHAR.

Я почти уверен ints не является допустимым типом данных в MySQL


Green Blanket

Я сделал эту строку ids = string.Join(",",ints.Выберите(x=>x.ToString()).Метод toArray());
это сработало, но только первый идентификатор получает возможность вставить в таблицу в отличие от объявления в(1,2,3,4), где все это было вставлено в таблицу