SQLGetInfo - 如何使用此函数

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)