在我的程序中,我将重复使用SELECT命令(MySQL的)。每一次,我都必须建立连接和东西。我正在考虑制作一个方法,它接收一个SELECT命令字符串并返回该参数的等效DataReader。我认为这会帮助我减少每次产生的大量代码。C#和MySQL - 返回DataReader(或其内容)的方法
我想以这样的方式来使用它的是:
MySqlDataReader myReader = myObj.loadDataToReader("SELECT * FROM tblSample");
然后,我可以操纵myReader
像一个普通的了MySqlDataReader。然而,我担心在使用数据读取器时连接必须打开,当然,需要关闭连接(阅读器和连接)以及所有(传统的安全措施,我相信)。我一直在看互联网上的东西,我似乎无法找到如何做到这一点的暗示。
我想,我有下面的代码行:
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 */ }
但是,我收到一条消息,提示“读取器关闭时无效尝试读取!” 我该如何纠正这种情况并使之发挥作用?或者说,是否有更合适的方法来做到这一点?我怎样才能确保我的连接/阅读器在使用后关闭?
改为使用DataTable。将读取器载入数据表,即'var dt = new DataTable(); dt.Load(myReader);'然后将DataTable返回给调用者做它的东西。 – adaam 2014-09-04 17:43:13
'DataSet'或'DataTable'通常是比'DataReader'更好的选择。你也应该参数化你的SQL语句,而不是连接它们:http://en.wikipedia.org/wiki/SQL_injection – 2014-09-04 17:43:29
谢谢你的想法。我将使用DataTable来代替。 – Jill 2014-09-04 18:29:22