Dah*_*Sra 12 c# database odbc oledbconnection dsn
我开发了ac#应用程序,它连接到许多类型的数据库服务器,如Sql,Oracle,Mysql等.连接是使用ODBC建立的.
我需要找到建立连接的服务器类型(DBMS类型),因为用户只输入DSN名称.
经过几个小时的冲浪,我发现我的要求只能通过这个函数SQLGetInfo.但我不知道如何在C#中处理这个问题.
甚至已经检查过这个Link1.
从上面的链接,我发现ODBC API只提供DataBase名称和DataSource Name.但是我需要找到Datatbase类型,比如它是SQL连接还是Oracle连接或mySqlConnection.
是否可以从DSN名称获取DBMS类型..?
注意:我不想从注册表设置中读取它.我试过这个并且它可以工作,但我有权限问题..!
小智 5
这绝对能达到目的。这是我挂钩 OdbcConnection GetInfoStringUnhandled 函数的实现。天哪,我们热爱反思,我知道我是传奇;)
public enum SQL_INFO
{
DATA_SOURCE_NAME,
DRIVER_NAME,
DRIVER_VER,
ODBC_VER,
SERVER_NAME,
SEARCH_PATTERN_ESCAPE,
DBMS_NAME,
DBMS_VER,
IDENTIFIER_CASE,
IDENTIFIER_QUOTE_CHAR,
CATALOG_NAME_SEPARATOR,
DRIVER_ODBC_VER,
GROUP_BY,
KEYWORDS,
ORDER_BY_COLUMNS_IN_SELECT,
QUOTED_IDENTIFIER_CASE,
SQL_OJ_CAPABILITIES_30,
SQL_SQL92_RELATIONAL_JOIN_OPERATORS,
SQL_OJ_CAPABILITIES_20
}
public static string GetInfoStringUnhandled(OdbcConnection ocn, SQL_INFO info)
{
MethodInfo GetInfoStringUnhandled = ocn.GetType().GetMethods(BindingFlags.NonPublic | BindingFlags.Instance).First(c => c.Name == "GetInfoStringUnhandled");
ParameterInfo SQL_INFO =
GetInfoStringUnhandled.GetParameters()
.First(c => (c.ParameterType.ToString() == "System.Data.Odbc.ODBC32+SQL_INFO"));
Array EnumValues = SQL_INFO.ParameterType.GetEnumValues();
foreach (var enumval in EnumValues) {
if (enumval.ToString() == info.ToString()) {
return Convert.ToString(GetInfoStringUnhandled.Invoke(ocn, new object[] { enumval }));
}
}
return string.Empty;
}
private static void Main(string[] args)
{
OdbcConnection ocn = new OdbcConnection("DSN=GENESIS");
ocn.Open();
Console.WriteLine(GetInfoStringUnhandled(ocn, SQL_INFO.DBMS_VER) + " " +
GetInfoStringUnhandled(ocn, SQL_INFO.DBMS_NAME));
}
Run Code Online (Sandbox Code Playgroud)
我找到的最好的文档,解释了使用 SQLGetInfo 的 47 种可能性,位于https://mariadb.com/kb/en/sql-99/sqlgetinfo/
尽管如此,OdbcConnection 刚刚集成了一个具有 19 种可能性的枚举。以下是 System.Data.Odbc.ODBC32 的 SQL_INFO 的反汇编枚举:
public enum SQL_INFO : ushort
{
DATA_SOURCE_NAME = (ushort)2,
DRIVER_NAME = (ushort)6,
DRIVER_VER = (ushort)7,
ODBC_VER = (ushort)10,
SERVER_NAME = (ushort)13,
SEARCH_PATTERN_ESCAPE = (ushort)14,
DBMS_NAME = (ushort)17,
DBMS_VER = (ushort)18,
IDENTIFIER_CASE = (ushort)28,
IDENTIFIER_QUOTE_CHAR = (ushort)29,
CATALOG_NAME_SEPARATOR = (ushort)41,
DRIVER_ODBC_VER = (ushort)77,
GROUP_BY = (ushort)88,
KEYWORDS = (ushort)89,
ORDER_BY_COLUMNS_IN_SELECT = (ushort)90,
QUOTED_IDENTIFIER_CASE = (ushort)93,
SQL_OJ_CAPABILITIES_30 = (ushort)115,
SQL_SQL92_RELATIONAL_JOIN_OPERATORS = (ushort)161,
SQL_OJ_CAPABILITIES_20 = (ushort)65003
}
Run Code Online (Sandbox Code Playgroud)
如您所见,您可以简单地使用所需信息的(ushort)强制转换整数调用 GetInfoStringUnhandled 方法。这是一个例子:
public static string GetInfoStringUnhandled(OdbcConnection ocn, ushort info)
{
MethodInfo GetInfoStringUnhandled = ocn.GetType().GetMethods(BindingFlags.NonPublic | BindingFlags.Instance).First(c => c.Name == "GetInfoStringUnhandled");
return Convert.ToString(GetInfoStringUnhandled.Invoke(ocn, new object[] { (ushort)info }));
}
public static void Main(string[] args)
{
OdbcConnection ocn = new OdbcConnection("DSN=GENESIS");
ocn.Open();
Console.WriteLine(GetInfoStringUnhandled(ocn, (ushort)10003)); //SQL_CATALOG_NAME returns Y
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1782 次 |
| 最近记录: |