我已经创建了一个通用方法,它将与所有数据库(如sql服务器、mysql和oracle )一起工作,并执行我的sql查询并返回datatable。
private Datatable GetData(string connectionString,string query
{
if (model.RdbmsType =="Mysql")
{
return ExecuteSqlQuery<MySqlConnection>(connectionString,query);
}
else if(model.RdbmsType == "SqlServer")
{
return ExecuteSqlQuery<SqlConnection>(connectionString,query);
}
else // for oracle
{
// code for oracle
}
}
private Datatable ExecuteSqlQuery<T>(string connectionString, string sqlQuery) where T : DbConnection, new()
{
using (DbConnection connection = new T())
{
var dt = new DataTable();
connection.ConnectionString = connectionString;
connection.Open();
SqlCommand cmd = new SqlCommand(sqlQuery, connection); //Error : Cannot convert dbconnection to sqlconnection
var queryData.Load(cmd.ExecuteReader());
}
}这一行的错误:
SqlCommand cmd = new SqlCommand(sqlQuery, connection); //Error : Cannot convert dbconnection to sqlconnection我甚至试过这样做:
DbCommand cmd1 = new DbCommand(sqlQuery, connection);但是,由于Dbcommand是抽象类,所以我不能在上面这样做。
那么如何使我的ExecuteSqlquery方法与所有的sql server、mysql和oracle一起工作呢?
发布于 2017-05-16 12:35:05
基本上,当您调用new SqlCommand()时,这将只适用于一个SqlConnection。它不适用于MySqlConnection,也不适用于甲骨文等方面的任何内容。SqlCommand与SqlConnection紧密耦合。
因此,您也需要一个Func<string, T, DbCommand> (即调用SqlCommand构造函数或类似的方法),或者只需要将方法分离出来而不是泛型的--有单独的ExecuteSqlQuery、ExecuteOracleQuery等方法。
或者,只需将命令类型设置为另一个泛型类型参数,并具有:
private Datatable ExecuteSqlQuery<TConnection, TCommand>(string connectionString, string sqlQuery)
where TConnection : DbConnection, new()
where TCommand : DbCommand, new()
{
using (DbConnection connection = new TConnection())
{
connection.ConnectionString = connectionString;
connection.Open();
TCommand cmd = new TCommand();
cmd.CommandText = sqlQuery;
cmd.Connection = connection;
var queryData.Load(cmd.ExecuteReader());
}
}那你就用:
return ExecuteSqlQuery<SqlConnection, SqlCommand>(connectionString, query);(等)
或者,看看DbProviderFactory,据我所知,它是为这种场景设计的。
https://stackoverflow.com/questions/44001542
复制相似问题