首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法将dbconnection转换为sqlconnection。

无法将dbconnection转换为sqlconnection。
EN

Stack Overflow用户
提问于 2017-05-16 12:30:21
回答 1查看 2.5K关注 0票数 0

我已经创建了一个通用方法,它将与所有数据库(如sql服务器、mysql和oracle )一起工作,并执行我的sql查询并返回datatable。

代码语言:javascript
复制
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());
    }
}

这一行的错误:

代码语言:javascript
复制
SqlCommand cmd = new SqlCommand(sqlQuery, connection); //Error : Cannot convert dbconnection to sqlconnection

我甚至试过这样做:

代码语言:javascript
复制
DbCommand cmd1 = new DbCommand(sqlQuery, connection);

但是,由于Dbcommand是抽象类,所以我不能在上面这样做。

那么如何使我的ExecuteSqlquery方法与所有的sql server、mysql和oracle一起工作呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-05-16 12:35:05

基本上,当您调用new SqlCommand()时,这将只适用于一个SqlConnection。它不适用于MySqlConnection,也不适用于甲骨文等方面的任何内容。SqlCommandSqlConnection紧密耦合。

因此,您也需要一个Func<string, T, DbCommand> (即调用SqlCommand构造函数或类似的方法),或者只需要将方法分离出来而不是泛型的--有单独的ExecuteSqlQueryExecuteOracleQuery等方法。

或者,只需将命令类型设置为另一个泛型类型参数,并具有:

代码语言:javascript
复制
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());
    }
}

那你就用:

代码语言:javascript
复制
return ExecuteSqlQuery<SqlConnection, SqlCommand>(connectionString, query);

(等)

或者,看看DbProviderFactory,据我所知,它是为这种场景设计的。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44001542

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档