C# IBMDB2 OLeDB连接异常;试图读取或写入受保护的内存。这通常表示其他内存已损坏;
在平台目标x64上运行程序时遇到非常奇怪的问题。它在x86上绝对可以正常工作 复制步骤:C# IBMDB2 OLeDB连接异常;试图读取或写入受保护的内存。这通常表示其他内存已损坏;,c#,.net,exception-handling,db2,oledbdatareader,C#,.net,Exception Handling,Db2,Oledbdatareader,在平台目标x64上运行程序时遇到非常奇怪的问题。它在x86上绝对可以正常工作 复制步骤: 安装在远程计算机上的db2服务器 安装在本地计算机上的db2客户机 现在运行此程序(仅在将平台目标AnyCpu更改为x64之后)。 然后问题出现在OleDbCommand.ExecuteReader()上 奇怪的行为:使用x86平台。此程序运行正常。 附言:我已经验证了这个程序。它适用于所有服务器,如SQL、MySQL、Oracle等。问题仅限于IBMDB2服务器 using System; using S
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();
}
}
使用系统;
使用系统线程;
名称空间ODBC
{
公共课程
{
静态字符串odbcstr=“Driver={IBM DB2 ODBC Driver};数据库=xxxx;主机名=xxxx;端口=50000;协议=TCPIP;Uid=xxxx;Pwd=xxxx;”;
静态字符串oledbStr=“Provider=IBMDADB2;Database=xxxx;Hostname=xxxx;Protocol=TCPIP;Port=50000;Uid=xxxx;Pwd=xxxx;”;
静态字符串strSQLODBC=“select*from CUSTOMERS;”;
静态字符串strOLedb=“选择*来自客户;”;
公共静态void ConnectionCallback(对象回调)
{
int[]数组=回调为int[];
if(0==Convert.ToInt32(数组[1])//ODBC连接
{
System.Data.Odbc.OdbcConnection-OdbcConnection=new System.Data.Odbc.OdbcConnection(odbcstr);
odbcConnection.Open();
System.Data.Odbc.OdbcCommand OdbcCommand=新的System.Data.Odbc.OdbcCommand(strSQLODBC,odbcConnection);
ODBCCommand.CommandTimeout=120;
System.Data.Common.DbDataReader dataReader=ODBCCommand.ExecuteReader();
while(dataReader.Read())
{
//待办事项
}
}
if(1==Convert.ToInt32(数组[0])//OLeDB连接
{
System.Data.OleDb.OleDbConnection-OleDbConnection=new System.Data.OleDb.OleDbConnection(oledbStr);
oleDbConnection.Open();
System.Data.OleDb.OleDbCommand-OleDbCommand=新的System.Data.OleDb.OleDbCommand(strOLedb,oleDbConnection);
OleDbCommand.CommandTimeout=120;
System.Data.Common.DbDataReader-dataReader=OleDbCommand.ExecuteReader();
while(dataReader.Read())
{
//做
}
}
}
静态void Main(字符串[]参数)
{
对于(int i=0;i<10;i++)
{
QueueUserWorkItem(Program.ConnectionCallback,new int[]{1,0});
}
Thread.CurrentThread.Join();
}
}
}编辑您的问题,指定您使用的Db2客户机的确切版本以及供应商是谁?(MS或IBM)等。我使用的是IBM DB2客户机11.1 x64bit。只有当我将平台目标从visual studio 2015更改为x64时,我才会面临这个问题。但是,它在visual studio目标平台x86上工作得非常好。它在哪些版本的Windows x64上出现故障?它适用于哪些32位版本?我正在windows 2k12 R2 64位计算机上通过visual studio 2015运行此程序。只有当我将程序平台目标更改为x64时,才会出现此问题。通过右键单击->程序->属性->平台目标。它可以与“AnyCpu”和“x86”一起使用,但不能与“x64”一起使用。您是否调试过以查找导致异常的代码行?