根据 StackOverflow 站点周围的链接(以下参考资料),我想出了这段代码来执行从我的 C# 应用程序到 MySQL 数据库的查询。
using (var dbConn = new MySqlConnection(config.DatabaseConnection))
{
using (var cmd = dbConn.CreateCommand())
{
dbConn.Open();
cmd.CommandType = CommandType.Text;
cmd.CommandText = "SELECT version() as Version";
using (IDataReader reader = cmd.ExecuteReader())
{
if (reader.Read())
{
Console.WriteLine("Database Version: " + reader.GetString(reader.GetOrdinal("Version")));
}
}
}
}
我遇到的问题是,每次我要进行一组查询时,我都必须构建这个庞大的代码块,因为我不会(也不应该)在应用程序的生命周期内保持连接打开.
是否有更有效的方法来构建支持结构(嵌套using
的 s、打开连接等),而是传递我的连接字符串和我想要运行的查询并返回结果?
参考问题:
- 使用 C# 和 MySql 的连接- 特别是 tsells 的答案
- Mysql选择位置和C#
- 使用 C# 更新 mysql 表
这是我看过的三个。还有一些,但我的 Google-fu 现在无法重新找到它们。所有这些都为如何执行单个查询提供了答案。我想执行单独的业务逻辑查询——其中一些是重复的——并且不想重复不需要的代码。
我试过的:根据nawfal的评论,我有这两种方法:
private MySqlDataReader RunSqlQuery(string query)
{
Dictionary<string, string> queryParms = new Dictionary<string, string>();
MySqlDataReader QueryResult = RunSqlQuery(query, queryParms);
return QueryResult;
}
private MySqlDataReader RunSqlQuery(string query, Dictionary<string, string> queryParms)
{
MySqlDataReader reader = null;
if (queryParms.Count > 0)
{
// Assign parameters
}
try
{
using (var dbConn = new MySqlConnection(config.DatabaseConnection))
{
using (var cmd = dbConn.CreateCommand())
{
dbConn.Open();
cmd.CommandType = CommandType.Text;
cmd.CommandText = query;
using (reader = cmd.ExecuteReader())
{
return reader;
}
}
}
}
catch (MySqlException ex)
{
// Oops.
}
return reader;
}
这种尝试的问题是reader
当它从方法返回时关闭。