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

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。 应用程序和数据库服务器不在同一台机器上.
...全文
1284 19 打赏 收藏 举报
写回复
用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”);
源码直接下载地址: https://pan.quark.cn/s/a4b39357ea24 ### 以单片机为核心的火灾报警系统毕业论文开题报告相关知识点 #### 一、课题背景及意义 ##### (1)课题背景 随着科学技术的持续进步和社会经济的高速发展,火灾现象已经成为一个日益突出的安全问题。特别是在人口高度聚集的城市区域,由于多种因素导致的火灾事故时有发生,给人员生命安全和财产带来了严重的威胁。因此,如何高效地预防火灾事故并迅速进行应对处理,成为了当前亟待解决的重要课题之一。传统的火灾监测与报警装置普遍存在响应时间较长、误报现象频繁、维护费用高昂等不足,难以适应现代社会对火灾防控的迫切需求。而采用单片机技术构建的智能火灾报警装置,凭借其反应迅速、运行可靠、成本较低等优势,正受到业界的广泛重视。 ##### (2)课题意义 以单片机为基础的火灾报警装置旨在综合运用现代电子工程技术和计算机科学方法,研发一种能够实时监控环境中的烟雾含量及温度变化,并在参数超过设定标准时迅速发出警示信号的智能化装置。此类系统不仅能够显著提升火灾预警的精确度和时效性,还能有效减少误报情况,从而为公民生命财产提供更加周全的安全保障。 #### 二、国内外研究发展情况 目前,在国内外范围内,关于智能火灾报警系统的研发工作已经取得了长足的进步。在国外,许多国家已经大规模部署了基于物联网理念的智能火灾监测系统,这些系统不仅具备基础的烟雾探测能力,还能通过无线通信网络即时将火灾数据传输至消防机构,大幅度提升了应急救援工作的效率。在国内,尽管相关技术的研究起步相对较晚,但近年来随着国家对公共安全领域的关注程度不断提高,基于单片机技术、嵌入式系统等智能火灾报警设备正经历着快速的发展阶段。 #### ...
源码下载地址: https://pan.quark.cn/s/7c5ebe7e1146 专门用于处理和播放监控系统生成的MP4视频文件的软件工具即为监控专用MP4文件播放器。此类播放器通常配备特殊功能,能够解析和播放那些因编码格式特殊或包含特定行业标准而在常规多媒体播放器上无法打开的MP4文件。作为常见类型,H264文件播放器得到了广泛应用,因为H264(也称为AVC,即Advanced Video Coding)是当前监控录像最常用的视频编码格式之一,其高效的压缩比率能在维持良好画质的条件下减小文件体积。 监控视频的编码方法通常与一般娱乐视频存在差异,可能包含更复杂的元数据或专有的加密技术,旨在保障数据的安全性和隐私性。因此,标准MP4播放器可能因无法识别这些特征而无法正常播放。针对这些特点进行优化的监控专用MP4文件播放器,则能够确保正确解码和播放相关文件。 描述中提及的"各种录像文件"可能涵盖以下几种情形: 1. 非标准分辨率:监控摄像头或许会采用非典型的分辨率,如320x240、720x480等,这些在标准播放器中可能无法得到支持。 2. 特殊帧率:监控录像或许会采用非常规的帧率,例如1fps、5fps等,这与一般视频的24fps、30fps有所不同。 3. 非线性时间轴:部分监控系统可能会进行时间戳重置,导致视频时间线呈现非线性,普通播放器可能无法正确处理。 4. 加密保护:为防止未授权的访问,监控录像可能被加密,需要特定的播放器才能进行解密。 5. 多通道音频:部分监控设备或许会包含多个音频通道,例如同时记录多路音频,普通播放器可能无法同时播放。 在提供的压缩包文件中,"下载说明.htm"或许包含了软件的安装指南、使用教程或注意事项,对于用户而言至关...
摘要 在数字经济与乡村振兴深度融合的背景下,针对果蔬产品助农销售中存在的信息不对称、销售渠道单一、管理粗放及资金监管不足等痛点,为畅通果蔬产销对接、提升助农工作的规范化与数字化水平,研究设计并实现了一款果蔬产品助农销售系统。研究采用前后端分离的B/S架构,以SpringBoot为后端核心框架、Vue.js为前端开发框架,搭配MySQL数据库搭建系统技术架构;通过技术、经济、操作三维度可行性分析与功能需求分析,划分管理员、农商、消费者三大用户角色,运用UML建模梳理业务流程,完成系统模块化设计与数据库逻辑结构搭建,最终通过黑盒测试验证系统功能有效性。系统实现了管理端、农商端、消费者端三大子系统的功能整合,涵盖农商信息管理、助农项目全生命周期管控、果蔬商城运营、助农资金闭环监管、商品销售与订单跟踪等核心功能,各模块运行稳定、数据交互准确,可有效满足果蔬助农销售的实际业务需求。该系统为果蔬产品助农销售提供了数字化解决方案,实现了助农业务的信息化管理,为农业数字化转型提供了技术支撑,同时系统在数据安全、功能维度等方面仍有优化空间,可通过后续迭代进一步提升实用性。 关键词 果蔬产品;助农销售系统;SpringBoot

111,128

社区成员

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

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

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