【发布时间】:2012-10-30 09:30:11
【问题描述】:
根据 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")));
}
}
}
}
我遇到的问题是,每次我要进行一组查询时,我都必须构建这个庞大的代码块,因为我不(也不应该)终生保持连接打开的应用程序。
有没有更有效的方法来构建支持结构(嵌套的usings、打开连接等),而不是传递我的连接字符串和我想要运行的查询并返回结果?
参考问题:
- Use of connections with C# and MySql - 具体答案 通过 tsells
- Mysql select where and C#
- Update a mysql table using C#
这是我看过的三个。还有一些,但我的 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 在从方法返回时关闭。
【问题讨论】:
-
您可以使用自己的帮助类来执行一些简单的任务,这些样板代码只需编写一次。那很干。参考见stackoverflow.com/questions/13133804/…
-
@nawfal,我尝试编写一些样板代码。我将其添加到原始问题中。它与您链接的问题不同,并且有自己的问题 - 主要是读者在返回后关闭。
-
弗兰克,阅读器已关闭,但只是因为已填充了整个数据。否则尝试
yield return方式,我已经在那篇文章中更新了..
标签: c# mysql datareader mysqldatareader