通用数据库连接C#

时间:2014-02-11 14:57:34

标签: c# mysql sql database

我正在研究这个应用程序,它将从数据库传输另一个应用程序的数据。但我试图让数据库功能正常运行。

我需要能够将任何类型的数据库(Oracle,SQL等)连接到应用程序,因为我的用户群使用不同的数据库。

我正在关注http://www.splinter.com.au/using-generic-database-providers-with-c/上的教程,而且我无法将测试MySQL数据库连接到它。

以下是我的示例代码:

static void Main(string[] args)
{
    string connection = "SERVER=localhost;UID=root;PASSWORD=toor";
    string provider = "MySql.Data.MySqlClient";

    using (DbConnection conn = (DbConnection)Activator.CreateInstance(Type.GetType(provider), connection))
    {
        conn.Open();
        string sql = "SHOW DATABASES";
        using(DbCommand comm = conn.CreateCommand())
        {
            comm.CommandText = sql;
            using(DbDataReader reader = comm.ExecuteReader())
            {
                while(reader.Read())
                {
                    string owner = reader.GetString(0);
                    Console.WriteLine("{0}", owner);
                }
            }
        }
    }
    Console.ReadLine();
}

我得到的错误是ArgumentNullException,我可以在调试器中看到conn为null。我不确定为什么它不起作用。我在使用MySQL库的应用程序中使用了该连接字符串和提供程序。可能是我的连接字符串需要更改?如果是这样,我将其更改为什么?

另外,我不想将数据库添加到连接字符串中,这将在以后选择。

1 个答案:

答案 0 :(得分:1)

我猜Type.GetType(provider)会返回null,因为您指定了类型的全名

"MySql.Data.MySqlClient"

而不是AssemblyQualifiedName

"MySql.Data.MySqlClient, MySql.Data"

仅当类型位于当前正在执行的程序集或mscorlib中时,指定不带程序集名称的类型名称才有效。

如果您尝试从GAC加载程序集,则还必须包含Version,Culture和PublicKeyToken参数,即:

"MySql.Data.MySqlClient.MySqlConnection, MySql.Data, Version=6.5.4.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d"

这取决于驱动程序的版本。