有哪些.NET方法可用于创建通用SQL Server查询?

时间:2012-04-30 15:28:55

标签: c# asp.net .net sql-server

我只是想在C#.NET 4.0中编写一个泛型函数,我可以在其中发送数据库字符串,查询字符串,然后返回结果。

不是那么精通C#并且它是各种不同的对象,我不确定返回这些信息的最佳选择是什么。

我知道有DataTableDataSet,这就是它的真实含义。我正在寻找的是一个相当高效的对象,我可以轻松访问它的数据成员。我确信编写自己的文件不会有问题,但我知道.NET 4.0中还有其他一些我可以访问的对象。

5 个答案:

答案 0 :(得分:4)

这种设计的问题在于,使用最佳实践来确保安全性并防止SQL注入非常困难。将纯SQL语句传递给函数几乎消除了防止SQL注入的能力,除非你仔细地执行它。

作为一般规则,如果您正在接收任何用户输入,则需要确保使用parameterized stored proceduresparameterized queries。建议的模式是传入一个语句和一个包含正确数量的参数值的类型对象数组,并在函数中构建参数集合。

我们使用他们的模式和实践库中的Microsoft data Application Blocks,其中包含真正使这更容易的功能。

在使用它时,ConnectionString存储在app.config或web.config中,并传入连接字符串的NAME,数据应用程序块代码负责查找,创建命令,连接,并执行查询。

使用此模式时,我们的代码如下所示:

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;
 }

这是获取DataSet的代码。还有许多其他可用的功能,这些代码可能不适用于最新版本的数据访问库。我们使用的是较旧的版本,但这应该可以让您了解它的使用方式。

答案 1 :(得分:2)

新的和改进的方法不是要这样做,而是要有一种方法来获取你想要的数据。

E.g定义一个CustomerOrder类。拥有一个名为say:

的函数的数据库模块
GetOpenOrdersForCustomer(int argCustomerID) 

返回它们的集合。

查找实体框架POCO等。

DataSetDataTable是这类事情的早期化身,它们非常沉重,带着很多包袱。

如果你想/需要做更多的手动编码。像IDataReaderIDbCommand IDbConnection这样的接口会将您与代码中的许多实现细节隔离开来,例如您的后端是SQL Server,MySql等。

即便如此,您仍然最好不要在应用程序代码中传递DataTableSqlCommand等内容。

在整个代码中抹掉数据库架构的机会太多,这给你留下了巨大的,很快就会发现的技术债务潜力。

隐藏一切。在Code First POCO中,它实际上是不可见的。

答案 2 :(得分:1)

您是否考虑过使用像NHibernate这样的ORM:http://nhforge.org/Default.aspx

它将执行与数据库相关的所有操作,您将使用漂亮的对象类。

在其他情况下,您的函数可以返回Datatable,您可以编写另一个函数来获取DataTable并将数据提取到对象类中。例如。这个新功能就像,

public object PopulateData(DataTable table,Enum ClassType); //或类似的东西

然后,您可以使用反射来映射DataTable列和类对象。

但我建议使用ORM。

答案 3 :(得分:1)

这取决于您想要涵盖的方案。 例如,在MVC应用程序中,基于实体框架部署数据层是相当可维护的,因为它可以通过简单的对象轻松地进行测试并与数据库进行通信非常简单。

另一种方法可能是使用已经开发的组件,例如来自企业库的数据应用程序块,或者可能开发您的自定义数据库工厂......这只取决于您的开发目的。

您能否详细说明我们正在讨论的应用程序类型?它是现有数据库还是新数据库?

另一个问题。您希望通过查询字符串传递什么?如果你介意传递sql句子,我会告诉你,这是一个非常糟糕和危险的做法,你应该避免。

最诚挚的问候。

答案 4 :(得分:1)

您可能需要以下内容:

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为例。