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

Win11下C#通过ODBC查询Oracle无报错但DataTable填充为空

问题背景
  • 运行环境:新切换至Windows 11系统,已同时安装32位、64位版本Oracle ODBC驱动
  • 异常现象:编写C#程序通过ODBC连接Oracle数据库取数,相同代码在Windows 10设备可正常运行;当前环境下查询语句复制到Toad执行可正常返回结果,但程序运行时OdbcDataAdapter.Fill()方法执行后无任何异常抛出,目标DataTable始终为空
  • 相关实现代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using System.Data.Odbc;
using System.Data;
using System.Data.SqlClient; 
 
namespace ApexAutoEmailConsol
{
    static class ServiceLog
    {
        static String connectionString = "Dsn=Prod21_32;uid=ebseb;pwd=ebseb";
        static string strQuery = string.Empty;
         
        public static string OutstandingInvoices()
        {
            try
            {
                OdbcConnection oCon = new OdbcConnection();
                oCon.ConnectionString = connectionString;
                oCon.Open();

                DataTable dtSales = new DataTable();

                strQuery = "SELECT * from apps.org_organization_definitions HO";
               // if I run above query in Toad it's giving result.
                OdbcDataAdapter myAdp = new OdbcDataAdapter(strQuery, oCon);
                myAdp.Fill(dtSales);
                
                //Adapter not filling data to the datatable.
                if (dtSales.Rows.Count <= 0)
                {
                    return "";
                }
 
                return strReturn;
            }
            catch (Exception Ex)
            {
                WriteErrorLog(Ex.ToString());
                return "";
            }
        }    
}
问题诱因
  • 首要原因是程序运行架构与ODBC驱动、DSN架构不匹配,这也是Win10升级Win11后ODBC类问题最常见的触发点:你使用的Prod21_32属于32位ODBC数据源,Windows 11的ODBC子系统相比Windows 10收紧了跨架构调用的校验逻辑——旧版Windows会自动在32/64位ODBC层做请求重定向,Win11下如果C#项目编译为x64、或使用Any CPU配置默认运行在64位模式,加载64位ODBC运行时访问32位DSN时,不会抛出显性连接错误,只会静默返回空结果集。
  • 其次是DSN配置与会话上下文不匹配:你在Toad中执行查询时,登录会话默认绑定了APPS schema,而ODBC连接如果没有显式指定默认Schema,部分版本Oracle ODBC驱动在Win11权限隔离机制下,遇到Schema不匹配、对象无权限的场景时,不会抛出"表或视图不存在"的常规错误,会直接返回空结构。
  • 最后是ODBC连接池兼容问题:Win11默认开启的ODBC连接池和旧版Oracle ODBC驱动存在句柄缓存兼容问题,连接建立后实际处于未正常初始化的状态,执行查询时不会向服务端发送实际请求,直接返回空DataTable。
解决步骤

按优先级依次操作即可:

  1. 强制对齐程序与驱动的架构
    • 打开项目属性-生成页,确认平台目标:如果要使用已有的32位Prod21_32数据源,直接将平台目标固定为x86,取消"首选32位"的自动勾选;如果要使用64位驱动,打开64位ODBC管理器(路径C:\Windows\System32\odbcad32.exe)新建同名64位DSN,将项目平台目标固定为x64。禁止使用Any CPU配置运行涉及ODBC调用的程序。
    • 注意不要混淆两个ODBC管理器入口:32位ODBC管理器路径为C:\Windows\SysWOW64\odbcad32.exe,两个管理器中配置的DSN完全独立、不互通。
  2. 补全连接字符串参数,绕开隐式配置问题
    不要完全依赖DSN中存储的配置,在连接字符串中显式指定服务名、默认Schema,同时关闭驱动侧语句缓存避免兼容问题:
    static String connectionString = "Dsn=Prod21_32;uid=ebseb;pwd=ebseb;Dbq=你的Oracle实例服务名;CurrentSchema=APPS;StmtCacheSize=0;";
    
  3. 清理ODBC连接池缓存
    打开对应架构的ODBC数据源管理器,进入连接池选项卡,找到你安装的Oracle ODBC驱动,将连接池等待超时设置为0,保存后重启开发环境或部署机器再测试。代码层面可以在调用Fill方法前,增加一行连接活性校验:
    oCon.Open();
    // 新增校验:确认连接可正常读取元数据
    DataTable schemaCheck = oCon.GetSchema("Tables", new string[] { null, "APPS", "ORG_ORGANIZATION_DEFINITIONS", null });
    if (schemaCheck.Rows.Count == 0) throw new Exception("连接元数据读取异常,请检查驱动和DSN配置");
    
  4. 配置程序兼容模式绕过Win11权限拦截
    如果以上操作后仍返回空结果,右键点击生成的程序exe,打开属性-兼容性页,勾选"以Windows 10兼容模式运行"、"以管理员身份运行此程序",保存后重新启动测试。Win11默认对无微软签名的第三方ODBC驱动做进程会话隔离,普通权限进程调用驱动时可能被静默拦截返回空结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 06:03:26