Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 无法将dbconnection转换为sqlconnection_C#_Ado.net - Fatal编程技术网

C# 无法将dbconnection转换为sqlconnection

C# 无法将dbconnection转换为sqlconnection,c#,ado.net,C#,Ado.net,我已经创建了一个通用方法,它将与所有数据库(如SQLServer、mysql和oracle)一起工作,并执行我的sql查询和返回datatable private Datatable GetData(string connectionString,string query { if (model.RdbmsType =="Mysql") { return ExecuteSqlQuery<MySqlConnection>(connectionStrin

我已经创建了一个通用方法,它将与所有数据库(如SQLServer、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());
    }
}
我甚至试过如下方式:

DbCommand cmd1 = new DbCommand(sqlQuery, connection);
但由于Dbcommand是抽象类,我无法在上面这样做


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

基本上,当您调用
new SqlCommand()
时,它只会与
SqlConnection
一起工作。它不适用于
MySqlConnection
,也不适用于来自Oracle等的任何东西。
SqlCommand
SqlConnection
紧密耦合

因此,您也需要一个
Func
(它将调用
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());
    }
}
私有数据表ExecuteSqlQuery(字符串连接字符串,字符串sqlQuery)
其中TConnection:DbConnection,new()
其中TCommand:DbCommand,new()
{
使用(DbConnection=new TConnection())
{
connection.ConnectionString=ConnectionString;
connection.Open();
TCommand cmd=新的TCommand();
cmd.CommandText=sqlQuery;
cmd.Connection=连接;
var queryData.Load(cmd.ExecuteReader());
}
}
然后,你可以用以下方式来称呼它:

return ExecuteSqlQuery<SqlConnection, SqlCommand>(connectionString, query);
返回ExecuteSqlQuery(connectionString,query);
(等等)


或者,看看,据我所知,它是为这种情况而设计的。

基本上,当您调用
new SqlCommand()
时,它只适用于
SqlConnection
。它不适用于
MySqlConnection
,也不适用于来自Oracle等的任何东西。
SqlCommand
SqlConnection
紧密耦合

因此,您也需要一个
Func
(它将调用
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());
    }
}
私有数据表ExecuteSqlQuery(字符串连接字符串,字符串sqlQuery)
其中TConnection:DbConnection,new()
其中TCommand:DbCommand,new()
{
使用(DbConnection=new TConnection())
{
connection.ConnectionString=ConnectionString;
connection.Open();
TCommand cmd=新的TCommand();
cmd.CommandText=sqlQuery;
cmd.Connection=连接;
var queryData.Load(cmd.ExecuteReader());
}
}
然后,你可以用以下方式来称呼它:

return ExecuteSqlQuery<SqlConnection, SqlCommand>(connectionString, query);
返回ExecuteSqlQuery(connectionString,query);
(等等)


或者,看看,据我所知,它是为这种情况而设计的。

请在格式化您的帖子方面投入更多的精力-您已经写了250多篇帖子,所以现在我相信您知道如何使用预览,以及适当的取消登录代码等等。。。请尊重其他人的时间,不厌其烦地把你的问题尽量写清楚。@JonSkeet:如果是这样的话,我真的很抱歉,但我已经使用ctrl+k格式化了我的代码,但我不知道如何进行缩进,那么你应该现在就了解它。阅读帮助。如果没有别的,我假设你知道如何使用空格和删除键——它们是你真正需要的。但是如果你突出显示一个已经缩进的文本块,然后按ctrl-k键,这将使它失效。请在格式化你的帖子上花更多的精力-你已经写了250多篇帖子,所以现在我相信你知道如何使用预览,以及适当地取消缩进的代码等等。。。请尊重其他人的时间,不厌其烦地把你的问题尽量写清楚。@JonSkeet:如果是这样的话,我真的很抱歉,但我已经使用ctrl+k格式化了我的代码,但我不知道如何进行缩进,那么你应该现在就了解它。阅读帮助。如果没有别的,我假设你知道如何使用空格和删除键——它们是你真正需要的。但是如果你突出显示一个已经缩进的文本块,然后按ctrl-k键,它就会消失。我对你为帮助我所做的努力投了赞成票,但是将我的方法分别用于每种数据库类型(sql server、mysql)是不是一个好主意,但这会导致代码重复。不是吗?@Learning:我给了你三种选择。。。(提供委托以从连接和查询构造命令,或使用
DbProviderFactory
,或使用单独的方法)。这是一个与不同的提供者一起使用DbProviderFactory的例子:非常感谢主席先生的回答:)我对您帮助我的努力表示赞赏,但将我的方法与每种数据库类型(sql server、mysql)分开是否是一个好主意但这会导致代码重复。不是吗?@Learning:我给了你三种选择。。。(提供委托以从连接和查询构造命令,或使用
DbProviderFactory
,或使用单独的方法)。这取决于您权衡您认为哪一个最适合您。下面是一个与不同提供商一起使用DbProviderFactory的示例:非常感谢先生的回答:)