C# 可重用数据库类
我有以下代码来查询数据库、获取数据、设置对象的每个属性,然后返回该对象。在这种情况下,它是具有属性C# 可重用数据库类,c#,sql,sql-server,database,class,C#,Sql,Sql Server,Database,Class,我有以下代码来查询数据库、获取数据、设置对象的每个属性,然后返回该对象。在这种情况下,它是具有属性FinancialImpactId和EffectiveDate的影响对象。 在整个项目中,我使用数据库中具有关联属性名称的对象多次查询数据库,如下面的示例所示 有没有一种方法可以创建一个通用的可重用类,该类将接受以下参数:要返回的对象或类型、连接和查询文本 然后,它将返回对象并设置每个属性,如下所示,但是是动态的,并且是可重用的 try { using (var conn = new Sql
FinancialImpactId
和EffectiveDate
的影响对象。
在整个项目中,我使用数据库中具有关联属性名称的对象多次查询数据库,如下面的示例所示
有没有一种方法可以创建一个通用的可重用类,该类将接受以下参数:要返回的对象或类型、连接和查询文本
然后,它将返回对象并设置每个属性,如下所示,但是是动态的,并且是可重用的
try
{
using (var conn = new SqlConnection())
{
conn.ConnectionString = connection.ConnectionString;
conn.Open();
using (var cmd = new SqlCommand())
{
cmd.Connection = conn;
cmd.CommandType = CommandType.Text;
cmd.CommandText = " SELECT TOP 1 fi.financialimpactid,
fi.effectivedate " +
" FROM FinancialImpact fi " +
" INNER JOIN [Case] c ON c.caseid =
fi.caseid " +
" WHERE fi.isDeleted = 0 AND
c.IsDeleted = 0";
var reader = cmd.ExecuteReader();
if (reader.HasRows)
{
reader.Read();
impact.FinancialImpactId = reader.GetInt32(0);
impact.EffectiveDate = reader.GetDateTime(1);
}
}
}
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
在这里,类ORM当然是更好的选择,但是您完全可以创建一个类,以这种方式查询数据库。您不会有参数化的查询或事务,而且在可重用性方面也不会节省那么多,因为每次调用它时,您都需要提供大量代码,以使其首先发挥作用
举个例子。以查询类为例:
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
namespace QueryExample {
public class Query {
private readonly SqlConnection _connection;
public Query(SqlConnection connection) {
_connection = connection;
}
public IEnumerable<T> Run<T>(string text, Func<SqlDataReader, T> builder) {
var results = new List<T>();
try {
_connection.Open();
using (var command = new SqlCommand()) {
command.Connection = _connection;
command.CommandType = CommandType.Text;
command.CommandText = text;
var reader = command.ExecuteReader();
if (reader.HasRows)
while (reader.Read())
results.Add(builder(reader));
}
_connection.Close();
} catch (Exception e) {
Console.WriteLine(e.Message);
}
return results;
}
}
}
您可以看到,运行该类并没有给您带来多少可用性,特别是因为您总是需要返回一个结果(使插入到,更新和删除“结果构建器”更难定义),而且它总是必须是一个列表(问题没那么大,但总是要做一个空检查,访问第一条记录可能很快就会过时)
这就是你现在使用ORM的原因之一。它们不仅简化了查询创建,而且使参数化变得不必要。你考虑过使用ORM吗?例如实体框架?不要再发明轮子:)@DaleBurrell还没有。我会调查的。谢谢来自微软的一组文档,强调了做同样事情的各种方法,你可以尝试linqtosql,因为轻量级的ORMLinqtosql已经不存在了
using System;
using System.Data.SqlClient;
namespace QueryExample {
public class Example {
public static void Run() {
using (var connection = new SqlConnection(string.Empty)) {
var query = new Query(connection);
const string text = "SELECT TOP 1 fi.financialimpactid, " +
"fi.effectivedate " +
" FROM FinancialImpact fi " +
" INNER JOIN [Case] c ON c.caseid = " +
"fi.caseid " +
" WHERE fi.isDeleted = 0 AND " +
"c.IsDeleted = 0";
var results = query.Run(text, GetData);
// do something with the results
}
}
private static Data GetData(SqlDataReader reader) => new Data {
FinancialImpactId = reader.GetInt32(0),
EffectiveDate = reader.GetDateTime(1)
};
}
internal class Data {
public int FinancialImpactId { get; set; }
public DateTime EffectiveDate { get; set; }
}
}