在运行时将对象转换为另一个类,但能够在运行时之前使用该成员

本文关键字:运行时 成员 对象 转换 另一个 | 更新日期: 2023-09-27 18:09:01

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

  1. Sqlite
  2. SQL Server 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将上面的对象转换为三个对象中的一个,并能够使用成员?

的例子:

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对所有三种不同的连接。

我希望我说得够清楚了。

谢谢。

在运行时将对象转换为另一个类,但能够在运行时之前使用该成员

通过基于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,而不是更具体的SqlCommand, SQLiteCommand等,这意味着您将无法访问提供商特定的功能。但如果你想要对底层提供者保持不可知论,这就是要付出的代价。

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