0

用户可以选择使用三个连接。

  1. 方镁石
  2. SQL 服务器
  3. MySQL

我目前有三种方法可以做同样的事情。我想做这样的事情

object obj;

if (connectionchosen == "Sqlite")
  obj = new SqlLiteConnection("connectiongstring);

if (connectionchosen == "MSSQL")
 ojb = new SqlConnection("connectionstring);

if (connectionchosen == "MySQL")
 obj = new MySqlConnection("connectionstring);

显然,上述操作无法完成,因为除非正确转换/转换,否则 obj 无法看到 Sqlite / SQL Server / Mysql 成员。

如何使用上述 IF 将上述 obj 转换为三个之一并能够使用成员?

例子:

public static bool LOGIN(string USERNAME, string PASSWORD,GLOBALFUNCTIONS.DBS DB)
{
   try
   {
      bool val = false;
      OPENDB(DB);
      object cmd;

      if (DB == GLOBALFUNCTIONS.DBS.SQLLOCAL)
      {
         _CN.SQLLITECMD = new SQLiteCommand("select * from users where        username='" + USERNAME + "' and password='" + _GLOBAL.GLOBALFUNCTIONS.GETMD5(PASSWORD + USERNAME) + "'",_CN.SQLLITELOCAL);
         _CN.SQLLITEREADER = _CN.SQLLITECMD.ExecuteReader();

         if (_CN.SQLLITEREADER.Read())
         {
            val = true;
                            _GLOBAL.GLOBALFUNCTIONS.LOGIN(_CN.SQLLITEREADER[0].ToString(), val, _CN.SQLLITEREADER[2].ToString(), GLOBALVARS.DATABASE);
         }
         else
                            _GLOBAL.GLOBALFUNCTIONS.LOGIN(_CN.SQLLITEREADER[0].ToString(), val, _CN.SQLLITEREADER[2].ToString(), GLOBALVARS.DATABASE);
                        _GLOBAL.GLOBALFUNCTIONS.AUDIT(USERNAME, _CN.SQLLITECMD.CommandText, GLOBALVARS.DATABASE);
    }
    CLOSEDB(DB);
    return val;
}
catch (Exception)
{
   CLOSEDB(DB);
   return false;
}

全部替换

_CN.SQLITECMD/_CN.SQLLITEREADER/_CN.SQLLITELOCAL 

_CN.MSSQLCMD/_CN.MSSQLREADER/_CN.MSSQLLOCAL 

相反,我希望对所有三个不同的连接简单地使用 CMD/READER/LOCAL。

我希望我足够清楚。

谢谢你。

4

1 回答 1

2

通过基于接口的代码,IDbConnection您可以抽象为具体的连接类型。

IDbConnection connection;

if (connectionchosen == "Sqlite")
  connection= new SqlLiteConnection("connectiongstring);

if (connectionchosen == "MSSQL")
  connection = new SqlConnection("connectionstring);

if (connectionchosen == "MySQL")
  connection = new MySqlConnection("connectionstring);

要创建命令,您必须使用IDbConnection.CreateCommand根据连接类型创建正确类型命令的方法。然后,您将仅限于使用IDbCommand而不是更具体SqlCommandSQLiteCommand等,这意味着您将无法访问提供商特定的功能。但如果您想对基础提供商不可知论,这就是要付出的代价。

您可以在 ADO.NET DbProviderFactories之上构建,而不是制作自己的工厂逻辑(如上所示)。这将允许您在实现中配置数据源App.config并避免使用任何提供程序特定的代码。

于 2013-04-12T07:43:23.917 回答