С очень странной проблемой при запуске программы ниже целевой платформы x64 . это абсолютно нормально работает на x86.
Шаги для воспроизведения:
- сервер db2 установлен на удаленном компьютере
- Клиент db2 установлен на локальном компьютере
- теперь запускайте эту программу (только после изменения платформы 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();
}
}
}