You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过OdbcConnection识别ODBC DSN的数据库驱动类型?

如何通过ODBC连接识别数据库驱动/类型

可以通过以下几种方式获取ODBC DSN的驱动类型或数据库类型,从而适配对应的日期时间函数:

1. 利用OdbcConnection.GetSchema获取驱动信息

连接打开后,调用GetSchema("Driver")可获取驱动的元数据,通过驱动名称判断数据库类型:

try
{
    using (var connection = new OdbcConnection("DSN=" + DSN))
    {
        connection.Open();
        // 获取驱动信息表
        DataTable driverTable = connection.GetSchema("Driver");
        string driverName = driverTable.Rows[0]["DRIVER_NAME"].ToString();
        
        // 根据驱动名称匹配数据库类型
        if (driverName.Contains("SQL Server"))
        {
            // SQL Server 适用 GETDATE()
            string insertSql = "INSERT INTO YourTable (CreateTime) VALUES (GETDATE())";
            // 执行SQL的逻辑
        }
        else if (driverName.Contains("MySQL"))
        {
            // MySQL 适用 NOW() 或 CURRENT_TIMESTAMP
            string insertSql = "INSERT INTO YourTable (CreateTime) VALUES (NOW())";
            // 执行SQL的逻辑
        }
        // 可扩展其他数据库(如Oracle、PostgreSQL等)的判断
    }
}
catch (Exception ex)
{
    Logger.WriteError(ex.Message);
}

2. 通过数据源信息获取数据库产品名称

使用GetSchema("DataSourceInformation")直接获取数据库的产品名称,判断更精准:

// 连接打开后执行
DataTable dsInfo = connection.GetSchema("DataSourceInformation");
string productName = dsInfo.Rows[0]["DBMS_NAME"].ToString();

switch (productName)
{
    case "Microsoft SQL Server":
        // 使用 GETDATE()
        break;
    case "MySQL":
        // 使用 NOW()
        break;
    // 其他数据库产品名称的判断
}

3. 读取Windows注册表获取DSN配置(无需打开连接)

针对Windows系统的DSN,可直接从注册表读取驱动路径,通过驱动文件名判断类型:

using Microsoft.Win32;
using System.IO;

string dsnName = "YourTargetDSN";
RegistryKey dsnRegistryKey = Registry.LocalMachine.OpenSubKey($"SOFTWARE\\ODBC\\ODBC.INI\\{dsnName}");
if (dsnRegistryKey != null)
{
    string driverPath = dsnRegistryKey.GetValue("Driver").ToString();
    string driverFileName = Path.GetFileName(driverPath);
    
    if (driverFileName.Equals("SQLSRV32.dll", StringComparison.OrdinalIgnoreCase))
    {
        // 对应SQL Server驱动
    }
    else if (driverFileName.Equals("myodbc8w.dll", StringComparison.OrdinalIgnoreCase))
    {
        // 对应MySQL驱动
    }
    dsnRegistryKey.Close();
}

注意事项

  • 驱动名称可能存在版本差异(如MySQL驱动可能显示为MySQL ODBC 8.0 Unicode Driver),使用Contains模糊匹配比精确匹配更可靠。
  • 不同ODBC驱动返回的元数据字段可能略有不同,测试时可先打印DataTable的所有内容确认字段名称。
  • 注册表读取方式仅适用于Windows系统,且程序需要具备访问注册表的权限。

内容的提问来源于stack exchange,提问作者Pradeep Patel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 10:17:25