1

Я пишу этот кусок кода в Compact Framework 3.5 под Windows CE 5.0 для обработки двух различных баз данных:SqlConnection DBConnection WindowsCE

using System.Data; 
using System.Data.SqlClient; 
using System.Data.SqlServerCe; 
using System.Data.Common; 

public myClass 
{ 
    private DbConnection dbCn; 
    private DbCommand dbCmd; 
    public void myClass(bool ce) 
    { 
     if (ce) 
     { 
      dbCn = new SqlCeConnection(); 
      dbCmd = new SqlCeCommand(); 
     } 
     else 
     { 
      dbCn = new SqlConnection(); // COMPILER ERROR Cannot implicitly convert type 'System.Data.SqlClient.SqlConnection' to 'System.Data.Common.DbConnection' 
      dbCmd = new SqlCommand();// COMPILER ERROR Cannot implicitly convert type 'System.Data.SqlClient.SqlCommand' to 'System.Data.Common.DbCommand' 
     } 
    } 

Почему он не может преобразовать SqlXX в DbXX ??? из MSDN SqlXX - это дети DbXX! Btw, никаких проблем с SqlCeXX. Я не могу использовать DbPoviderfactory, которого нет в cf.

Благодаря

ответ

1

Что вы пытаетесь сделать, это Covariance and Contravariance in Generics, но не вышли, пока .NET 4.0.

[Update] Оказывается, что литье из [DbConnection] в [SqlConnection] может оставить из нескольких параметров, так что Microsoft не позволяет простые забросы.

Если вы действительно хотите, чтобы сделать это, проверить эту нить на SO с некоторыми хорошо, как код:

C# DbConnection cast to SqlConnection

+0

К сожалению, я не понимаю, SqlConnection наследует от DbConnection, почему я могу» t написать: DbConnection dbCn = new SqlConnection() ??????? – Beorne

+0

Извините, теперь я понял, проблема в том, что компилятор не знает во время компиляции, что такое правильный объект. Некоторая идея получить желаемый результат (т. Е. Что-то вроде DbPoviderfactory)? Благодарю. – Beorne

+0

Хорошо, используя интерфейсы, такие как IDbConnection. – Beorne