Как исправить ошибку в ExecuteReader () ;? - PullRequest
0 голосов
/ 11 июля 2020

У меня проблема с ExecuteReader(). Когда я пишу MySqlDataReader reader = cmd.ExecuteReader();, у меня появляется красная линия под cmd.ExecuteReader(). Я использую приложение Windows Form для чтения базы данных с сервера Microsoft SQL и использую C# и OOP.

SqlConnection con = new SqlConnection(constring);
            con.Open();
            if (con.State == System.Data.ConnectionState.Open)
            {
                string q = "SELECT * from BuildingA30 where CONVERT(VARCHAR, FlatNo) = N'" + a11 + "' ";
                Console.WriteLine("Read all");
                Console.WriteLine(q);
                SqlCommand cmd = new SqlCommand(q, con);
                
                MySqlDataReader reader = cmd.ExecuteReader();
            
                while (reader.Read())
                {
                    textBox1.Text = reader.GetString("tenantname");
                    textBox2.Text = reader.GetString("FlatNo");
                }
                textBox1.Text = q.ToString();
                MessageBox.Show("Connection success");
            }

Ответы [ 2 ]

1 голос
/ 11 июля 2020

Проблема в том, что SqlCommand.ExecuteReader возвращает SqlDataReader, а не MySqlDataReader.

Здесь:

SqlCommand cmd = new SqlCommand(q, con);
MySqlDataReader reader = cmd.ExecuteReader();

Вы смешиваете поставщиков ADO. NET. Либо используйте классы провайдеров SQL Server (если база данных - SQL Server), либо MySql, если это MySql. Не оба.

0 голосов
/ 11 июля 2020

Вы устанавливаете Dapper, и вам не нужно тратить свою жизнь на написание скучного, грязного кода для чтения данных .. например, `

using(var con = new MySqlConnection(...)){
    var rental = con.Query<RentalInfo>(
      "SELECT * FROM BuildingA30 WHERE flatNo = @f",
      new { f = all }
    };

    //use your rental object 

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

  • это просто, быстро писать, легко читать и отлаживать
  • он использует параметры и не страдает от sql рисков взлома инъекций - ваш делает
  • он строго типизирован и может быть асинхронным c (обратите внимание, mysql не реализовал asyn c для своего поставщика db, очевидно, но использование asyn c - хорошая привычка) - вам просто нужно создать класс с именем RentalInfo и добавить к нему соответствующие свойства имен;
  • он не вызывает функции в левой части оператора в предложении WHERE. Всегда плохая идея; не вызывайте функции для миллионов строк, вызывайте функции для констант и оставляйте данные таблицы в покое

http://dapper-tutorial.net

Примечание: я не имею отношения к Даппер или ребята, которые поддерживают этот учебный сайт

...