我正在研究这个应用程序,它将从数据库传输另一个应用程序的数据。但我试图让数据库功能正常运行。
我需要能够将任何类型的数据库(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库的应用程序中使用了该连接字符串和提供程序。可能是我的连接字符串需要更改?如果是这样,我将其更改为什么?
另外,我不想将数据库添加到连接字符串中,这将在以后选择。
答案 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"
这取决于驱动程序的版本。