在我的程序中,我将反复使用SELECT命令(MySQL的)。每次,我都要建立联系。我正在考虑创建一个方法,它接收一个SELECT命令字符串并返回参数的等效数据读取器。我认为这将帮助我减少每次生成的大量代码。我想用这种方式:MySqlDataReader myReader = myObj.loadDataToReader("SELECT * FROM tblSample");然后,我可以像普通的MySqlDataReader一样操作myReader。不过,我担心的是,在使用数据读取器时,连接必须是开放的,当然,它的内容(读取器和连接)也需要关闭和全部关闭(我相信这是一种传统的安全措施)。我一直在看网上的东西,我似乎找不到一点线索,如何做到这一点。我正在尝试,我有以下代码行:public MySqlDataReader loadDataToReader(string selectCommand){ MySqlDataReader myReader = null; string myConnectionString = "Data Source = " + server + "; User = " + user + "; Port = 3306; Password = " + password + ";"; string useDataBaseCommand = "USE " + dbName + ";"; using (MySqlConnection myConnection = new MySqlConnection(myConnectionString)) { using (MySqlCommand myCommand = new MySqlCommand(useDataBaseCommand + selectCommand, myConnection)) { try { myConnection.Open(); myReader = myCommand.ExecuteReader(CommandBehavior.CloseConnection); } catch (Exception ex) { myConnection.Close(); MessageBox.Show(ex.Message, "Error!", MessageBoxButtons.OK, MessageBoxIcon.Error); } return myReader; } }}在另一个类的方法中,我创建了一个对象,以便能够使用上面定义的方法,其方式如下:string selectTableCommand = "SELECT * FROM tblusers WHERE Username = \'" + txtID.Text + "\' AND Password = \'" + txtPassword.Text + "\';";MySQLOperations objSQLOperations = new MySQLOperations("localhost", "root", "mypass", "mydatabase");MySqlDataReader myDataReader = objSQLOperations.loadDataToReader(selectTableCommand);if (myDataReader.Read() && txtPassword.Text.Equals(myDataReader["Password"].ToString())) { /* do something */ }else { /* do something */ }但是,我收到一条消息,说“当读卡器关闭时尝试读取无效!”我怎样才能纠正这一点并使之发挥作用?或者更确切地说,有没有更合适的方法来做到这一点?如何确保使用后连接/读卡器已关闭? 最佳答案 您可以使方法成为泛型并插入一个函数以在读取器上工作,然后返回函数的输出而不是读取器:public T LoadDataToReader<T>(string selectCommand, Func<IDataReader,T> ProcessResults){ string myConnectionString = "Data Source = " + server + "; User = " + user + "; Port = 3306; Password = " + password + ";"; string useDataBaseCommand = "USE " + dbName + ";"; using (var myConnection = new MySqlConnection(myConnectionString)) { myConnection.Open(); using (var myCommand = myConnection.CreateCommand()) { myCommand.CommandText = useDataBaseCommand + selectCommand; using(var myReader = myCommand.ExecuteReader(CommandBehavior.CloseConnection)) { return ProcessResults(myReader); } } }}我还做了一些其他更改:IDataReader实现了IDisposable,因此我为读取器添加了using语句我使用ADO.NET接口方法创建命令,而不是构造函数我删除了catch块,因为当您离开using块时,连接会自动关闭,并且UI代码(例如MessageBox)不属于DAL代码。这应该作为调用此方法的try/catch来完成。我将函数的第一个字母大写,使其与.NET编码标准一致然后,您只需按如下方式使用它:public static string GetStringData(IDataReader reader){ var ord_name = reader.GetOrdinal("Name"); if(reader.Read()) return reader.GetString(ord_name); return null;}public static IEnumerable<Foo> GetFoos(IDataReader reader){ var ord_name = reader.GetOrdinal("Name"); var foos = new List<Foo>(); while(reader.Read()) foos.Add(new Foo {Name = reader.GetString(ord_name)}); return foos;}static void Main(string[] args){ var program = new Program(); try { var name = program.LoadDataToReader("SELECT name FROM thename", GetStringData); } catch(Exception ex) { MessageBox.Show(ex.Message, "Error!", MessageBoxButtons.OK, MessageBoxIcon.Error); } try { var foos = program.LoadDataToReader("SELECT foos FROM footable", GetFoos); } catch(Exception ex) { MessageBox.Show(ex.Message, "Error!", MessageBoxButtons.OK, MessageBoxIcon.Error); }}此外,您可能应该传入连接字符串,而不是从字段构建它。或者,您可以为整个连接字符串(只构建一次而不是每次执行)设置一个字段并使用它。此外,数据库可以在连接字符串中设置为Initial Catalog或Database,这最好是用子句对SELECT语句进行预处理。关于c# - C#和MySQL-返回DataReader(或其内容)的方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25671725/ 10-12 12:18