我只是想在 C# .NET 4.0 中编写一个通用函数,在那里我可以向它发送一个数据库字符串、一个查询字符串,然后取回我的结果。
由于不是那么精通 C# 并且它是各种不同的对象,我不确定返回此信息的最佳选择可能是什么。
我知道有DataTable
, DataSet
, 就是这样。我正在寻找的是一个相当高效的对象,并且我可以轻松地访问它的数据成员。我确信自己编写不会有问题,但我知道 .NET 4.0 中必须有其他一些我可以访问的对象。
我只是想在 C# .NET 4.0 中编写一个通用函数,在那里我可以向它发送一个数据库字符串、一个查询字符串,然后取回我的结果。
由于不是那么精通 C# 并且它是各种不同的对象,我不确定返回此信息的最佳选择可能是什么。
我知道有DataTable
, DataSet
, 就是这样。我正在寻找的是一个相当高效的对象,并且我可以轻松地访问它的数据成员。我确信自己编写不会有问题,但我知道 .NET 4.0 中必须有其他一些我可以访问的对象。
这种设计的问题是很难使用最佳实践来保证安全和防止 SQL 注入。将纯 SQL 语句传递给函数几乎消除了防御 SQL 注入的能力,除非您仔细执行此操作。
作为一般规则,如果您接收任何用户输入,您需要确保您使用的是参数化存储过程或参数化查询。推荐的模式是传入一个语句和一个包含正确数量的参数值的类型对象数组,并在您的函数中构建参数集合。
我们使用他们的模式和实践库中的Microsoft 数据应用程序块,其中包含真正使这变得更容易的功能。
在使用它时,ConnectionString 存储在 app.config 或 web.config 中,并且您传入连接字符串的名称,数据应用程序块代码负责查找它、创建命令、连接并执行询问。
使用此模式时,我们的代码如下所示:
public static DataSet ExecuteDataset(string CallingApp, string ConnectionStringName, string StoredProcName, object[] ParameterValues)
{
DataSet ReturnValue = new DataSet();
Microsoft.Practices.EnterpriseLibrary.Data.Database db = Microsoft.Practices.EnterpriseLibrary.Data.DatabaseFactory.CreateDatabase(ConnectionStringName);
try
{
ReturnValue = db.ExecuteDataSet(StoredProcName, ParameterValues);
}
catch (Exception ex)
{
// a bunch of code for exception handling removed
}
return ReturnValue;
}
这是获取数据集的代码。还有许多其他功能可用,并且此代码可能不适用于最新版本的数据访问库。我们使用的是稍旧的版本,但这应该让您了解它的易用性。
新的和改进的方法不是这样做,而是有一种方法来获取你想要的数据。
例如定义一个CustomerOrder
类。有一个数据库模块,其函数名为 say:
GetOpenOrdersForCustomer(int argCustomerID)
这将返回您的集合。
查找实体框架 POCO 等。
DataSet
并且DataTable
是这类东西的早期化身,它们相当沉重,有很多包袱。
如果你想/需要做更多的手工编码。IDataReader
, , 之类的接口IDbCommand
IDbConnection
将使您与代码中的许多实现细节隔离开来,例如您的后端是否是 SQL Server、MySql 等。
即使这样,您最好不要在应用程序代码中传递诸如DataTable
, SqlCommand
about 之类的东西。
太多的机会在整个代码中涂抹数据库模式,给您留下巨大且即将实现的技术债务潜力。
全部隐藏。在 Code First POCO 中,它实际上是不可见的。
你可能想要这样的东西:
public static DbDataReader Query(
string connectionString, string selectCommand,
params KeyValuePair<string, object>[] parameters)
{
var connection = new OleDbConnection(connectionString);
var command = new OleDbCommand(selectCommand, connection);
foreach (var p in parameters)
command.Parameters.Add(new OleDbParameter(p.Key, p.Value));
var result = command.ExecuteReader();
return result;
}
以 OleDb 为例。
你有没有想过使用像 NHibernate 这样的 ORM:http: //nhforge.org/Default.aspx
它将完成与数据库相关的所有工作,并且您将使用漂亮的对象类。
在其他情况下,您的函数可以返回 Datatable,您可以编写另一个函数来获取 DataTable 并将数据提取到对象类中。例如。这个新功能就像,
公共对象 PopulateData(DataTable table, Enum ClassType); //或者类似的东西
然后,您可以使用反射来映射 DataTable 列和类对象。
但我建议使用 ORM。
这取决于您要涵盖的场景。例如,在 MVC 应用程序中,部署基于实体框架的数据层是相当可维护的,因为它易于测试,并且通过简单的对象与数据库的通信非常简单。
另一种方法可能是使用已经开发的组件,例如企业库中的数据应用程序块,或者可能开发您的自定义数据库工厂......这取决于您的开发目的。
您能否详细说明我们正在谈论的应用程序类型?它是现有数据库还是新数据库?
另一个问题。您到底希望通过查询字符串传递什么?如果你介意通过 sql 语句,我会告诉你,这是一种非常糟糕和危险的做法,你应该避免。
此致。