C# 在Red Hat Linux上使用ODBC和Mono时,无法打开连接池错误

C# 在Red Hat Linux上使用ODBC和Mono时,无法打开连接池错误,c#,linux,mono,openedge,C#,Linux,Mono,Openedge,我们正在使用RedHat 6.5中的Mono。我们正在尝试使用ODBC连接到本地数据库。当我们尝试连接时,会收到一条错误消息错误-无法启用连接池。我试图通过设置pooling=false来禁用池;在连接字符串中 完全相同的代码在Windows7上运行良好。任何帮助都将不胜感激。使用PHP,我们可以连接到数据库而不会出现任何问题。这是一个Progress OpenEdge数据库,如果这有什么不同的话 这是我们的设置 odbcinst.ini的设置如下: [Progress]

我们正在使用RedHat 6.5中的Mono。我们正在尝试使用ODBC连接到本地数据库。当我们尝试连接时,会收到一条错误消息错误-无法启用连接池。我试图通过设置pooling=false来禁用池;在连接字符串中

完全相同的代码在Windows7上运行良好。任何帮助都将不胜感激。使用PHP,我们可以连接到数据库而不会出现任何问题。这是一个Progress OpenEdge数据库,如果这有什么不同的话

这是我们的设置

odbcinst.ini的设置如下:

[Progress]                                                                      
Description     = ODBC for Progress                                             
Driver          = /usr/dlc64Bit/odbc/lib/pgoe27.so                              
FileUsage       = 1                                                             

[ODBC]                                                                          
Pooling         = True                                                          
Trace           = Yes                                                           
TraceFile               = /home/rr/progress/trace.log                           
UseCursorLib            = 1                                                     
UsageCount              = 2 
[my_progress]                                                                   
Driver=Progress                                                                 
Description=Test to Progress                                                    
DatabaseName=pt                                                                 
PortNumber=9003                                                                 
HostName=localhost                                                          
LoginID=                                                                        
Password=                                                                       
APILevel=1                                                                      
ConnectFunctions=YYN                                                            
CPTimeout=60                                                                    
DriverODBCVer=03.60                                                             
FileUsage=0                                                                     
SQLLevel=0                                                                      
UsageCount=1                                                                    
ArraySize=50                                                                    
DefaultLongDataBuffLen=2048                                                     
DefaultIsolationLevel=REPEATABLE READ                                           
StaticCursorLongColBuffLen=4096 
odbc.ini的设置如下所示:

[Progress]                                                                      
Description     = ODBC for Progress                                             
Driver          = /usr/dlc64Bit/odbc/lib/pgoe27.so                              
FileUsage       = 1                                                             

[ODBC]                                                                          
Pooling         = True                                                          
Trace           = Yes                                                           
TraceFile               = /home/rr/progress/trace.log                           
UseCursorLib            = 1                                                     
UsageCount              = 2 
[my_progress]                                                                   
Driver=Progress                                                                 
Description=Test to Progress                                                    
DatabaseName=pt                                                                 
PortNumber=9003                                                                 
HostName=localhost                                                          
LoginID=                                                                        
Password=                                                                       
APILevel=1                                                                      
ConnectFunctions=YYN                                                            
CPTimeout=60                                                                    
DriverODBCVer=03.60                                                             
FileUsage=0                                                                     
SQLLevel=0                                                                      
UsageCount=1                                                                    
ArraySize=50                                                                    
DefaultLongDataBuffLen=2048                                                     
DefaultIsolationLevel=REPEATABLE READ                                           
StaticCursorLongColBuffLen=4096 
ODBC使用PHP工作得很好

以下是Mono程序:

using System;                                                                   
using System.Data;                                                              
using System.Data.Odbc;                                                         

public class Test                                                               
{                                                                               
    string connectionString, sql;                                           

    public void testProgress()                                              
    {                                                                       
        System.Console.WriteLine("Testing Progress");                   
        connectionString =                                              
            "DSN=my_progress;" +                                    
            "UID=root;" +                                           
            "PWD=root;" + 
            "Pooling=false";                                             
        sql =                                                        
            "SELECT productcode, prodtype FROM pub.locations";      

    }                                                                       
    public void testConnection()                                            
    {                                                                       
        try
        {                                                               
            IDbConnection dbcon;                                    
            dbcon = new OdbcConnection(connectionString);           
            dbcon.Open();                                           
            IDbCommand dbcmd = dbcon.CreateCommand();               
            dbcmd.CommandText = sql;                                
            IDataReader reader = dbcmd.ExecuteReader();             
            while(reader.Read()) {                                  
                string product = (string) reader["productcode"];

                string producttype = (string) reader["prodtype"];                                                                               
                Console.WriteLine(product + " " + producttype); 
            }                                                       
            // clean up                                             
            reader.Close();                                         
            reader = null;                                          
            dbcmd.Dispose();                                        
            dbcmd = null;                                           
            dbcon.Close();                                          
            dbcon = null;                                           
        }                                                               
        catch(Exception ex)
        {                                                               
            System.Console.WriteLine("Error: " + ex.Message);       
        }                                                               
    }                                                                       

    public static void Main(string[] args)                                  
    {                                                                       
        Test test = new Test();                                         
        test.testProgress();                                            
        test.testConnection();                                          
    }                                                                       
}
编译后运行程序时,出现以下错误:


错误-无法启用连接池

Progress OpenEdge Wire协议驱动程序不支持连接池。见文件:

UNIX/Linux上的ODBC连接池未在ODBC驱动程序管理器中实现。 相反,它是在(某些)DataDirect ODBC驱动程序中实现的

但在.NET/Mono中,它看起来是默认使用的:

…/mono-4.2.3/external/referencesource/System.Data/System/Data/Odbc/OdbcEnvironmentHandle.cs

 ...
 //Turn on connection pooling
 //Note: the env handle controls pooling.  Only those connections created under that
 //handle are pooled.  So we have to keep it alive and not create a new environment
 //for   every connection.
 //
 retcode = UnsafeNativeMethods.SQLSetEnvAttr(
            this,
            ODBC32.SQL_ATTR.CONNECTION_POOLING,
            ODBC32.SQL_CP_ONE_PER_HENV,
            ODBC32.SQL_IS.INTEGER);

        switch(retcode) {
        case ODBC32.RetCode.SUCCESS:
        case ODBC32.RetCode.SUCCESS_WITH_INFO:
            break;
        default:
            Dispose();
            throw ODBC.CantEnableConnectionpooling(retcode);
        }
 ...
我得到了以下异常(使用您的示例代码调整到我的环境-Linux、Ubuntu 14.04、Mono JIT编译器版本4.2.3(Stable 4.2.3.4/832de4b Wed Mar 16 13:19:08 UTC 2016)):

[ERROR]未处理的致命异常:
System.InvalidOperationException:错误-无法启用连接池。。。

在System.Data.Odbc.OdbcEnvironmentHandle,考虑提供一些代码和连接字符串。