【问题标题】:How do I solve error in ExecuteReader();?如何解决 ExecuteReader(); 中的错误?
【发布时间】:2020-11-01 08:00:20
【问题描述】:

我遇到了ExecuteReader() 的问题。当我写MySqlDataReader reader = cmd.ExecuteReader();时,cmd.ExecuteReader()下面有一条红线。我正在使用 Windows 窗体应用程序从 Microsoft SQL Server 读取数据库并使用 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");
            }

【问题讨论】:

  • 你能补充一下错误吗?
  • 看来您可能正在使用 System.Data.SqlClient.SqlCommand (Microsoft SQL Server),它返回 SqlDataReader 而不是 MySqlDataReader (对于 MySQL)。 Intellisense 错误可能表明了这一点。
  • 您在问题中说的是 SQL Server,但您还标记了 MySQL(这是一个不同的产品)——它是什么?

标签: c# mysql sql-server visual-studio oop


【解决方案1】:

问题是 SqlCommand.ExecuteReader 返回的是 SqlDataReader,而不是 MySqlDataReader。

这里:

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

您正在混合使用 ADO.NET 提供程序。要么使用 SQL Server 提供程序类(如果数据库是 SQL Server),要么使用 MySql 类(如果它是 MySql)。两者都不是。

【讨论】:

    【解决方案2】:

    您安装了 Dapper,那么您就不必浪费时间编写无聊的、卑微的数据阅读器代码了..

    使用 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 注入黑客攻击的风险 - 你的可以
    • 它是强类型的并且可以是异步的(注意,mysql 并没有为他们的数据库提供者实现异步,但是使用异步是一个很好的习惯)——你只需要创建一个名为 RentalInfo 的类并添加与其相关的名称属性;
    • 它不会调用 WHERE 子句中运算符左侧的函数。总是一个坏主意;不要在数百万行上调用函数,不要在常量上调用函数并且不理会表数据

    http://dapper-tutorial.net

    注意:我与 Dapper 或维护该教程网站的人没有任何关系

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-10-06
      • 2016-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-26
      • 1970-01-01
      • 2019-10-07
      相关资源
      最近更新 更多