.NET MySQL Data Reader Выберите функцию?

Прошло много времени с тех пор, как я использовал .NET, но, к счастью, почти закончил писать инструмент для сравнения баз данных sqlite и mysql. Однако я столкнулся с проблемой при попытке написать функцию для моей оболочки, которая будет обрабатывать вызовы SELECT, поскольку я не могу полностью понять устройство чтения данных.

Насколько я понимаю, каждая итерация цикла в считывателе - это следующая строка, а GetString(x) возвращает значение столбца для "x" в качестве индекса. Все примеры, которые я нашел, вошли в него, зная имена строк/столбцов, которые им нужны. Как я могу сделать это с помощью вызова «SELECT * FROM» и сохранить имена/значения столбцов для последующего доступа? Кажется, у Microsoft есть функция «FieldCount», но я не могу найти ее в MySQL Connector.

Спасибо!

public void Query(string query, string tableName)
{
    //Open connection
    if (this.OpenConnection() == true)
    {
        //Create Command
        MySqlCommand cmd = new MySqlCommand(query, connection);
        MySqlDataReader dataReader = cmd.ExecuteReader();

        //Read the data and store them in the list
        while (dataReader.Read())
        {
            int count = Count(tableName);

            for (int x = 0; x < count; x++)
            {
                Console.WriteLine(dataReader.GetString(count));
            }
        }

        //close Data Reader
        dataReader.Close();

        //close Connection
        this.CloseConnection();
    }
}

person Community    schedule 13.02.2013    source источник


Ответы (2)


Можно использовать DbDataReader.GetName для имя столбца с его порядковым номером x.

person Jon    schedule 13.02.2013
comment
Спасибо вам за помощь. Я думаю, что я немного запутался в своем вопросе. Я скорее спрашивал, как лучше всего хранить эти данные (список/словарь/2D-массив/и т. д.) для удобства? - person ; 13.02.2013
comment
@BrettPowell: Какие именно данные? Имена столбцов? - person Jon; 13.02.2013
comment
Только имена столбцов и значения для каждой строки. В основном мне нужно взять значение из sqlite и проверить, соответствует ли оно каким-либо значениям в определенном столбце из mysql. - person ; 13.02.2013
comment
@BrettPowell: я действительно не знаю, это зависит от многих вещей. В общем, извлечение всех данных из памяти может быть не очень хорошей идеей, если набор данных большой. В противном случае вы можете просто поместить их, например. List<object[]>, так как есть метод GetValues, который дает object[]. - person Jon; 13.02.2013

используйте «соединитель mysql» для доступа к данным в MySql, это проще, чем писать запросы самостоятельно: http://dev.mysql.com/downloads/connector/net/

Затем используйте EntityFramework для доступа к данным через этот соединитель. Также вы можете автоматически генерировать модель *.edmx из существующей базы данных в mysql, это позволит вам быстро получать доступ и работать с данными в вашей базе данных. Вот информация о добавлении модели *.edmx из существующей БД: http://msdn.microsoft.com/en-us/library/vstudio/cc716703(v=vs.100).aspx

Запрос, который выберет все данные из таблицы, например - "Товары", будет выглядеть так:

Список продуктов = dbContext.Products.Where(e=>e.ProductId!=-1).ToList();

это вернет весь список продуктов в вашей базе данных в таблице Products.

тогда вы можете работать с продуктами, как вы хотите. например, использование столбца «Имя» для первого продукта в «продуктах» будет выглядеть так:

Строка firstProductName = products[0].name;

Я надеюсь, что это помогает.

person Maris    schedule 13.02.2013
comment
Спасибо, хотя этот проект уже почти завершен, и переход на него кажется довольно сложным. Хотя ответ отличный :) - person ; 13.02.2013
comment
Без проблем. Я хочу сказать еще одну вещь. Когда я начал использовать C# и .NET, я также писал sql-запросы руками и использовал DataReader для перевода в работоспособные объекты в .NET, но в один прекрасный день я нашел для себя EntityFramework и Linq. Теперь я даже не могу представить свою жизнь без этих технологий. Вы должны попробовать это один раз. В любом случае, я рад, что вам понравился мой ответ. - person Maris; 13.02.2013