万分棘手的问题."尝试读取或写入受保护的内存。这通常指示其他内存已损坏"

gengchengxiang 2010-05-05 04:50:44
public static DataTable GetTable(string szSql)
{
string szTableName;
OleDbConnection DCon;
OleDbDataAdapter DAdp;
DataSet DSet;
DataTable DTbl;

szTableName="thetable";
try
{
DCon = new OleDbConnection(Utility.ConnectString);
DAdp = new OleDbDataAdapter("",DCon);
DSet = new DataSet();
DAdp.SelectCommand.CommandTimeout = Utility.CommandTimeout;
DAdp.SelectCommand.CommandText = szSql;
DAdp.Fill(DSet,szTableName);
DTbl = DSet.Tables[szTableName];
}
catch (Exception e)
{
DTbl = new DataTable(szTableName);
}

return DTbl;
}


上面的代码是传入一个Sql语句. 返回一个DataTable。

调用上面的函数经常会报 "尝试读取或写入受保护的内存。这通常指示其他内存已损坏" 错误. 哪位高手知道原因,请告知小弟。感激不尽

应用程序运行环境是Windows Server 2008。 数据库是 SQL Server 2005。 应用程序和数据库服务器不在同一台机器上.
...全文
1174 19 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
reof_net 2010-05-18
  • 打赏
  • 举报
回复
public static DataTable GetTable(string szSql)
{
string szTableName;
OleDbConnection DCon;
OleDbDataAdapter DAdp;
DataSet DSet;
DataTable DTbl;

szTableName="thetable";
try
{
DCon = new OleDbConnection(Utility.ConnectString);
DAdp = new OleDbDataAdapter("",DCon);
DSet = new DataSet();
DAdp.SelectCommand.CommandTimeout = Utility.CommandTimeout;
DAdp.SelectCommand.CommandText = szSql;
DAdp.Fill(DSet,szTableName);
DTbl = DSet.Tables[szTableName];
}
catch (Exception e)
{
DTbl = new DataTable(szTableName);
}

return DTbl;
}
改成
public static DataTable GetTable(string szSql)
{
string szTableName;
OleDbConnection DCon;
OleDbDataAdapter DAdp;
DataSet DSet;
DataTable DTbl;

szTableName="thetable";
try
{
DCon = new OleDbConnection(Utility.ConnectString);
DAdp = new OleDbDataAdapter("",DCon);
DSet = new DataSet();
DAdp.SelectCommand.CommandTimeout = Utility.CommandTimeout;
DAdp.SelectCommand.CommandText = szSql;
DAdp.Fill(DSet,szTableName);
DTbl = DSet.Tables[szTableName];
DCon.Close();
}
catch (Exception e)
{
DTbl = new DataTable(szTableName);
}

return DTbl;
}
另外将你的DAdp.SelectCommand.CommandTimeout根据业务需求合理的设置长短,一定要记住OleDbConnection连接用完后关闭!
aqgsh 2010-05-18
  • 打赏
  • 举报
回复
学习中。。。。。。
gengchengxiang 2010-05-18
  • 打赏
  • 举报
回复
改用 SqlClient问题解决了。
gengchengxiang 2010-05-06
  • 打赏
  • 举报
回复
今天换用一个另外一台电脑上的 SQL 服务器,已经运行了1个小时,目前为止还没有出现错误。所以,我怀疑是原来的SQL服务器有问题。先运行一天看看,有没有什么问题。如果没有问题, 基本上可以断定是原来的 SQL 服务器有问题。
gengchengxiang 2010-05-06
  • 打赏
  • 举报
回复
问题还是没有解决,换用windows 2008 + Sql Server 2008 又出现同样的问题了。我狂晕狂晕了。
我现在怀疑是我的线程没有控制好,线程结束时,线程占用的资源没有释放, 我现在想知道,线程结束时如何释放线程想占用的资源。
wonsoft 2010-05-05
  • 打赏
  • 举报
回复
你的防火墙是不是限制了?或者你的SQL用户权限?
wuyq11 2010-05-05
  • 打赏
  • 举报
回复
程序本身的问题。例如:数据库访问达到最大的并发量,出现死锁。或频繁的写入和读取操作,c#的垃圾回收机制造成的,即变量的回收速度大于使 用的速度造成。
使得内存资源没有及时释放导致此错误
调用API问题
加油馒头 2010-05-05
  • 打赏
  • 举报
回复
你说的有的报错 有的不报错

是不是访问冲突?比如多次并发访问之类

用sqlcommend试试
gengchengxiang 2010-05-05
  • 打赏
  • 举报
回复
我的开发环境是 window 2003 + sql Server 2005 。在我的系统下运行没有任何错误。
编译好的应用程序,放到windows 2008 下运行就报这样的错误。我在windows 2008 下无法调试运行,所以也就不知道具体在哪行出错,可以肯定是在GetTable里出错.
我是在GetTable中写了日志文件, 才发现错误。
nashina 2010-05-05
  • 打赏
  • 举报
回复
有资源没有释放,单步跟踪看哪里出错;
是不是资源调用冲突了
捷哥1999 2010-05-05
  • 打赏
  • 举报
回复
单步执行,跟踪到GetTable里面看看,调试运行程序,到调用GetTable那行时,F11快捷键进入,看看那一行出错。
gengchengxiang 2010-05-05
  • 打赏
  • 举报
回复
补充说明
在 windows Server 2003 + sql Server 2005 下运行就不报错.
是不是win 2008 访问 sql 2005 有什么特别的限制?
jietuan 2010-05-05
  • 打赏
  • 举报
回复
你看看改成访问其它的表行吗? 你在SQL server 查询分析器里面执行这些语句,看看是否出现相同的问题?
gengchengxiang 2010-05-05
  • 打赏
  • 举报
回复
主线程开启子线程代码
private void ExecDO()
{
ConnProcMgr ConnProc = new ConnProcMgr(iApplyID, iWMPostID, iWMAccountID);
ConnProc.ClientInfo = ClientInfo;
ConnProc.TempRootPath = TempRootPath;
ConnProc.ConnProc += new ConnProcEventHandler(ConnProc_ConnProc);

Thread ProcThread;
ProcThread = new Thread(new ThreadMgrStart(ConnProc.Start));
ProcThread.Start();
}

从子线程返回主线程, 进入这个函数
private void ConnProc_ConnProc(object sender, ConnProcEventArgs e)
{
bool bAllApplyEnd, bExist;
int i, iProcStatus, iRemoveIndex;
string szSql;
DataTable RS;

try
{
szSql = "select * from WMConnProc where WMConnApplyID =" + e.ApplyID;
// 执行GetTable时会报错误
RS = C.DbBase.GetTable(szSql);
}
catch(Exception ex)
{
C.RunLog.WriteEIPErrorLog("Service1.ConnProc_ConnProc", ex.Message);
}

}

子线程代码
public delegate void ConnProcEventHandler(object sender, ConnProcEventArgs e);
public class ConnProcMgr
{
public event ConnProcEventHandler ConnProc;
public void Start()
{
string szSql;
DataTable RS;

szSql = "select * from WMConnProc where WMConnApplyID=" + ApplyID + " and WMAccountID=" + WMAccountID;
// 执行GetTable 时会报错
RS = C.DbBase.GetTable(szSql);
}
}
vrhero 2010-05-05
  • 打赏
  • 举报
回复
为什么要有OleDb访问SQL Server?改用SqlClient...
gengchengxiang 2010-05-05
  • 打赏
  • 举报
回复
由于无法跟踪调试,不知道在哪一行上。而且并不是所有的sql语句都报错,有的sql语句就不报错。
一般情况会在如下两个地方报错。
1。主线程开启子线程, 在子线程的入口函数里会报这个错误.
2。子线程通过委托返回主线程时,在主线程里会报这个错误.

捷哥1999 2010-05-05
  • 打赏
  • 举报
回复
调用上面的函数经常会报 "尝试读取或写入受保护的内存。这通常指示其他内存已损坏" 错误

报这个错误时,调试器代码在哪一行上?
skep99 2010-05-05
  • 打赏
  • 举报
回复
调用了非托管类了吧?
gengchengxiang 2010-05-05
  • 打赏
  • 举报
回复
补充说明
例如传入最简单的Sql
GetTable(“select * from WMConnApply where WMConnApplyID = 123”);

111,092

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧