Исключение соединения IBMDB2 OLeDB "Попытка чтения или записи защищенной памяти. Это часто указывает на повреждение другой памяти" - PullRequest
0 голосов
/ 06 сентября 2018

С очень странной проблемой при запуске программы ниже целевой платформы x64 . это абсолютно нормально работает на x86.

Шаги для воспроизведения:

  1. сервер db2 установлен на удаленном компьютере
  2. Клиент db2 установлен на локальном компьютере
  3. теперь запускайте эту программу (только после изменения платформы AnyCpu на x64). затем проблема возникает в OleDbCommand.ExecuteReader ();

СТРАННОЕ ПОВЕДЕНИЕ: с платформой x86. эта программа работает нормально.

P.S .: Я проверил эту программу. он работает со всеми серверами, такими как SQL, MySQL, Oracle и т. д., только с сервером IBMDB2

using System;
using System.Threading;

namespace OledbAndOdbc
{
 public class Program
{
    static string odbcstr = "Driver={IBM DB2 ODBC DRIVER};Database=xxxx;Hostname=xxxx;Port=50000;Protocol=TCPIP;Uid=xxxx;Pwd=xxxx;";
    static string oledbStr = "Provider=IBMDADB2;Database=xxxx;Hostname=xxxx;Protocol=TCPIP;Port=50000;Uid=xxxx;Pwd=xxxx;";

    static string strSQLODBC = "select  * from CUSTOMERS ;";
    static string strOLedb = "select * from CUSTOMERS ;";
    public static void ConnectionCallback(object callback)
    {
        int[] array = callback as int[];
        if (0 == Convert.ToInt32(array[1])) // ODBC connection
        {
            System.Data.Odbc.OdbcConnection odbcConnection = new System.Data.Odbc.OdbcConnection(odbcstr);
            odbcConnection.Open();
            System.Data.Odbc.OdbcCommand ODBCCommand = new System.Data.Odbc.OdbcCommand(strSQLODBC, odbcConnection);
            ODBCCommand.CommandTimeout = 120;
            System.Data.Common.DbDataReader dataReader = ODBCCommand.ExecuteReader();
            while (dataReader.Read())
            {
               // Todo
            }
        }
        if (1 == Convert.ToInt32(array[0])) // OLeDB connection
        {
            System.Data.OleDb.OleDbConnection oleDbConnection = new System.Data.OleDb.OleDbConnection(oledbStr);
            oleDbConnection.Open();
            System.Data.OleDb.OleDbCommand OleDbCommand = new System.Data.OleDb.OleDbCommand(strOLedb, oleDbConnection);
            OleDbCommand.CommandTimeout = 120;
            System.Data.Common.DbDataReader dataReader = OleDbCommand.ExecuteReader();
            while (dataReader.Read())
            {
               //to do
            }
        }
    }
    static void Main(string[] args)
    {
        for (int i = 0; i < 10; i++)
        {
            ThreadPool.QueueUserWorkItem(Program.ConnectionCallback, new int[] { 1, 0 });
        }
        Thread.CurrentThread.Join();
    }
}

}

...