private void bt_chaxun_Click(object sender, EventArgs e)
{
this.bt_chaxun.Enabled = false;
DataTable dtable = new DataTable();
dtable = new DataTable();
switch (biaozhi)
{
case "0":
dtable.Columns.Add("编码", typeof(string));
dtable.Columns.Add("名称", typeof(string));
dtable.Columns.Add("应扫", typeof(string));
dtable.Columns.Add("已扫", typeof(string));
SqlCeDataReader dr91 = SqlCeHelper.ExecuteReader("SELECT SUM(shuliang) AS Expr1 FROM jilurukudan WHERE danhao='" + danhao + "' and (wuliaodaima IN (SELECT wuliaodaima FROM jilurukudan WHERE (id IN (SELECT MAX(id) FROM jilurukudan where danhao='" + danhao + "'))))");
SqlCeDataReader dr92 = SqlCeHelper.ExecuteReader("SELECT wuliaomingcheng,wuliaodaima FROM jilurukudan WHERE danhao='" + danhao + "' and (id IN (SELECT MAX(id) FROM jilurukudan where danhao='" + danhao + "'))");
this.listBox1.Items.Clear();
if (dr91.Read() == true && dr92.Read() == true)
{
SqlCeDataReader dr9000 = SqlCeHelper.ExecuteReader("select shuliang from rukudan where danhao='" + danhao + "' and (wuliaodaima IN (SELECT wuliaodaima FROM jilurukudan WHERE (id IN (SELECT MAX(id) FROM jilurukudan where danhao='" + danhao + "')))) ");
if (dr9000.Read() == true)
{
gv(dr92[1].ToString(), dr92[0].ToString(), dr9000[0].ToString(), dr91[0].ToString(), dtable);
dr9000.Close();
}//一部分代码其实所有的DR我都已经关闭这里不多写
private void gv(string bianma, string mingcheng, string yuanshu, string xianshu, DataTable dtable)
{
if (bianma.Length > 6)
{
bianma = bianma.Substring(bianma.Length - 6);
}
if (mingcheng.Length > 9)
{
mingcheng = mingcheng.Substring(mingcheng.Length - 9);
}
if (yuanshu.Length > 6)
{
yuanshu = yuanshu.Substring(yuanshu.Length - 6);
}
if (xianshu.Length > 6)
{
xianshu = xianshu.Substring(xianshu.Length - 6);
}
DataRow drow = dtable.NewRow();
drow["编码"] = bianma;
drow["名称"] = mingcheng;
drow["应扫"] = yuanshu;
drow["已扫"] = xianshu;
dtable.Rows.Add(drow);
}
}
代码虽然稍微有点多和乱,但是大家主要看下GV和DATATABLE在NEW的时候,是否需要手动释放资源?如果点击多次 时候会造成内存浪费? 我上网查了下 有人说DATATABLE释放的时候最好手动,难道dtable。clear();dtable.dispose(), 晕 ,主要是我不确定是不是DATATBALE引起的? 大家别看我代码细节,主要看下这么定义DATATBALE是否有问题? 是否会浪费资源? 就是点击一次chaxun_click的时候来new一个dtable是否有问题? 然后问题错在那里? 或者怎么释放?不会的帮顶下 谢谢 ,会的麻烦告诉我下
46 个解决方案
#1
把SqlCeDataReader换成DataSet试试
#2
不是这个问题吧? 你为什么让我换? 的有理由的?
#3
楼主是否笔误?
New就是新开一块内存地址。这样New两次,不会报错,但是消耗资源。
#4
不关dataset的事情是你的SQL语句太烂了
#5
我的SQL怎么优化? 麻烦讲解下
#6
NEW 2次是笔误
#7
好長,幫頂好了
#8
"SELECT SUM(shuliang) AS Expr1 FROM jilurukudan WHERE danhao='" + danhao + "'
and (wuliaodaima IN (SELECT wuliaodaima FROM jilurukudan
WHERE (id IN (SELECT MAX(id) FROM jilurukudan where danhao='" + danhao + "'))))"
#9
DataTable dtable = new DataTable();
dtable = new DataTable(); // 这里第二次 new 没有必要。
#10
你把表字段
贴出来
我帮你写
贴出来
我帮你写
#11
等我慢慢看
#12
8楼你的SQL和我的不是一样?
#13
给出你的表结构和要的结果
#14
另外,如果怀疑是DATATABLE使用后没有释放掉资源,可以考虑这样:
DataTable dtable = new DataTable();
private void bt_chaxun_Click(object sender, EventArgs e)
{
this.bt_chaxun.Enabled = false;
dtable.Clear();
// ...
}
#15
我的那个第2个new是笔误 ,是否需要 dtable.dispose() 还是其他原因造成多次执行clcik的时候死机? 现在的现象是查1次 比上一次慢一次 越查越慢 最后 OVER了,所以我怀疑是资源没释放的问题,不是SQL问题,麻烦高手帮解决
#16
8楼的SQL没改只是贴出来好看一些而已
#17
用Using语句试试
定义dataTable对象改为
using(DataTable dtable = new DataTable())
{
}
把你一下的代码放进上面的大括号里试试。
定义dataTable对象改为
using(DataTable dtable = new DataTable())
{
}
把你一下的代码放进上面的大括号里试试。
#18
private void bt_chaxun_KeyDown(object sender, KeyEventArgs e)
{ if (e.KeyCode == Keys.F1)
{
if (bt_chaxun.Enabled ==true)
this.bt_chaxun_Click(bt_chaxun, new KeyEventArgs(Keys.Enter));
}
}
能否是btchaun_click事件写的有问题? 就是KEYDOWN来完成CLICK ,因为我的是支持触摸屏幕的
#19
"SELECT SUM(shuliang) AS Expr1 FROM jilurukudan WHERE danhao='" + danhao + "'
and (wuliaodaima IN (SELECT wuliaodaima FROM jilurukudan
WHERE (id IN (SELECT MAX(id) FROM jilurukudan where danhao='" + danhao + "'))))"
怎么同一个表用了三个in啊?你到底想做什么?
(id IN (SELECT MAX(id) FROM jilurukudan where danhao='" + danhao + "')是获取同一个单号的最大ID
and (wuliaodaima IN (SELECT wuliaodaima FROM jilurukudan
WHERE (id IN (SELECT MAX(id) FROM jilurukudan where danhao='" + danhao + "'))))"
怎么同一个表用了三个in啊?你到底想做什么?
(id IN (SELECT MAX(id) FROM jilurukudan where danhao='" + danhao + "')是获取同一个单号的最大ID
#20
我觉得Using 和实例化一个对象,然后dispose效果差不多,因为using会自动调用对象的close 和 dispose方法,楼主这个问题我也遇到过,我每次也是直接new一个出来。帮顶!我也等待高人回答
================================================================================
viewerwang's life
http://lelespace.com/
================================================================================
================================================================================
viewerwang's life
http://lelespace.com/
================================================================================
#21
除非特别必要,一般资源的释放都是由.net framework的垃圾回收系统GC自动完成的.我认为与datatable没关系
#22
请楼主给出表结构和想要的结果。
#23
代码补充下:
我相当于把那个datatble当成个参数传到一个函数里面处理,然后处理后又做DATAGRID的DATASOURCE了,这个有问题吗? 还是写成REF?
private void bt_chaxun_Click(object sender, EventArgs e)
{
this.bt_chaxun.Enabled = false;
DataTable dtable = new DataTable();
dtable = new DataTable();
switch (biaozhi)
{
case "0":
dtable.Columns.Add("编码", typeof(string));
dtable.Columns.Add("名称", typeof(string));
dtable.Columns.Add("应扫", typeof(string));
dtable.Columns.Add("已扫", typeof(string));
SqlCeDataReader dr91 = SqlCeHelper.ExecuteReader("SELECT SUM(shuliang) AS Expr1 FROM jilurukudan WHERE danhao='" + danhao + "' and (wuliaodaima IN (SELECT wuliaodaima FROM jilurukudan WHERE (id IN (SELECT MAX(id) FROM jilurukudan where danhao='" + danhao + "'))))");
SqlCeDataReader dr92 = SqlCeHelper.ExecuteReader("SELECT wuliaomingcheng,wuliaodaima FROM jilurukudan WHERE danhao='" + danhao + "' and (id IN (SELECT MAX(id) FROM jilurukudan where danhao='" + danhao + "'))");
this.listBox1.Items.Clear();
if (dr91.Read() == true && dr92.Read() == true)
{
SqlCeDataReader dr9000 = SqlCeHelper.ExecuteReader("select shuliang from rukudan where danhao='" + danhao + "' and (wuliaodaima IN (SELECT wuliaodaima FROM jilurukudan WHERE (id IN (SELECT MAX(id) FROM jilurukudan where danhao='" + danhao + "')))) ");
if (dr9000.Read() == true)
{
gv(dr92[1].ToString(), dr92[0].ToString(), dr9000[0].ToString(), dr91[0].ToString(), dtable);
dr9000.Close();
dataGrid1.DataSource = dtable;
dataGrid1.TableStyles[0].GridColumnStyles[0].Width = 47;
dataGrid1.TableStyles[0].GridColumnStyles[1].Width = 128;
dataGrid1.TableStyles[0].GridColumnStyles[2].Width = 47;
dataGrid1.TableStyles[0].GridColumnStyles[3].Width = 47;
private void gv(string bianma, string mingcheng, string yuanshu, string xianshu, DataTable dtable)
{
if (bianma.Length > 6)
{
bianma = bianma.Substring(bianma.Length - 6);
}
if (mingcheng.Length > 9)
{
mingcheng = mingcheng.Substring(mingcheng.Length - 9);
}
if (yuanshu.Length > 6)
{
yuanshu = yuanshu.Substring(yuanshu.Length - 6);
}
if (xianshu.Length > 6)
{
xianshu = xianshu.Substring(xianshu.Length - 6);
}
DataRow drow = dtable.NewRow();
drow["编码"] = bianma;
drow["名称"] = mingcheng;
drow["应扫"] = yuanshu;
drow["已扫"] = xianshu;
dtable.Rows.Add(drow);
}
我相当于把那个datatble当成个参数传到一个函数里面处理,然后处理后又做DATAGRID的DATASOURCE了,这个有问题吗? 还是写成REF?
#24
我认为LZ的担心是多余的,几个DATATABLE并不会使程序挂掉,也没有必要去考虑释放资源这种问题,这些完全都可以由FRAME自行处理回收。
引起你现在挂起的问题我认为是SQL语句不当照成的,你中间的循环每一次就会去执行一次查询,这个代价太大了。
假设我有10000个循环你难道就要去数据库查询10000次?
建议你这个地方的处理方式进行更改
1.更改语句,使一次查询后就能得出结果
2.如果优化SQL语句不能达到一次出结果的话,使用DATASET代替DATAREADER,将所需要的数据全部导入DATASET,然后将逻辑处理放在DATASET上,尽可能减小与数据库的连接次数。
引起你现在挂起的问题我认为是SQL语句不当照成的,你中间的循环每一次就会去执行一次查询,这个代价太大了。
假设我有10000个循环你难道就要去数据库查询10000次?
建议你这个地方的处理方式进行更改
1.更改语句,使一次查询后就能得出结果
2.如果优化SQL语句不能达到一次出结果的话,使用DATASET代替DATAREADER,将所需要的数据全部导入DATASET,然后将逻辑处理放在DATASET上,尽可能减小与数据库的连接次数。
#25
像你这样的sql语句很不科学的,最好不要用in来查询
http://topic.csdn.net/u/20090325/10/b31fdf29-6e80-4b3b-bb61-bacd25fd37f9.html
上面链接你看看,看了你就应该明白了!
http://topic.csdn.net/u/20090325/10/b31fdf29-6e80-4b3b-bb61-bacd25fd37f9.html
上面链接你看看,看了你就应该明白了!
#26
不死都半条命了...
#27
SqlCeHelper.ExecuteReader
我要看这里的代码. 其他的没有问题
我要看这里的代码. 其他的没有问题
#28
24楼说我明白! 但是现在是现象 ,明白我的意思? 我第1次执行查询 完全OK! 一点问题没有,这也就是说我的SQL执行是没问题的,如果像24楼说的有问题 ,第1次查询速度会非常非常的慢,而现在不是这样的现象,现在是第1次查询完全正常,速度也正常,但是第2次查询,速度就会变慢,而且第3次会更慢,第4次会越来越慢,这样的现象告诉我们的是很明显有资源或者部分没有释放出去,所以不是SQL语句的问题? 大家明白吗?如果是SQL语句的问题,那么第1次查询和第2次查询会是一样的,都是会非常的慢,而且查多了会造成死机,2种情况的现象有很明显区别,所以大家看下我的代码是否是有的地方用过了没有释放掉? 或者是说有的地方用完后需要关闭。谢谢
SQL语句不对,肯定被否决了,因为我特意测试了下。
SQL语句不对,肯定被否决了,因为我特意测试了下。
#29
搞这么麻烦做什么,用SqlDataAdapter.Fill(DataTable)吧。
#30
if (dr91.Read() == true && dr92.Read() == true)
{
SqlCeDataReader dr9000 = SqlCeHelper.ExecuteReader("select shuliang from rukudan where danhao='" + danhao + "' and (wuliaodaima IN (SELECT wuliaodaima FROM jilurukudan WHERE (id IN (SELECT MAX(id) FROM jilurukudan where danhao='" + danhao + "')))) ");
if (dr9000.Read() == true)
{
gv(dr92[1].ToString(), dr92[0].ToString(), dr9000[0].ToString(), dr91[0].ToString(), dtable);
dr9000.Close();
}//一部分代码其实所有的DR我都已经关闭这里不多写
楼主至少应该将
dr9000.Close();
放到
}//一部分代码其实所有的DR我都已经关闭这里不多写
下面
我认为问题不在楼主贴出的代码中,SQL需要优化
{
SqlCeDataReader dr9000 = SqlCeHelper.ExecuteReader("select shuliang from rukudan where danhao='" + danhao + "' and (wuliaodaima IN (SELECT wuliaodaima FROM jilurukudan WHERE (id IN (SELECT MAX(id) FROM jilurukudan where danhao='" + danhao + "')))) ");
if (dr9000.Read() == true)
{
gv(dr92[1].ToString(), dr92[0].ToString(), dr9000[0].ToString(), dr91[0].ToString(), dtable);
dr9000.Close();
}//一部分代码其实所有的DR我都已经关闭这里不多写
楼主至少应该将
dr9000.Close();
放到
}//一部分代码其实所有的DR我都已经关闭这里不多写
下面
我认为问题不在楼主贴出的代码中,SQL需要优化
#31
我 昏倒 麻烦大家看下我描述的现象再来判断下 是什么问题?谢谢大家了,现象告诉我们真的不是SQL的问题
#32
总体感觉是效率太低,插入一行居然要连数据库三次,其实完全可以在一个存储过程里实现。
你把这些逻辑写在存储过程里,在数据库管理器多运行几次(相当于点几次按钮),看看会出什么问题就明白了。
你把这些逻辑写在存储过程里,在数据库管理器多运行几次(相当于点几次按钮),看看会出什么问题就明白了。
#33
对
#34
未处理的“System.OutOfMemoryException”类型的异常出现在 System.dll 中。
这是我跟踪到的错误
这是我跟踪到的错误
#35
不是这样认为.
很大情况下是因为ado的问题.
很大情况下是因为ado的问题.
#36
还没人会 RMB选上20元来解决这个问题 有会的 来叫我
#37
未处理的“System.OutOfMemoryException”类型的异常出现在 System.dll 中。
是因为内存消耗太大引起的,你的SQL语句消耗太多资源,而且写法也是错误的。
是因为内存消耗太大引起的,你的SQL语句消耗太多资源,而且写法也是错误的。
#38
我相当于把那个datatble当成个参数传到一个函数里面处理,然后处理后又做DATAGRID的DATASOURCE了,这个有问题吗? 还是写成REF?
REF,不然你修改不到方法外边的DATATABLE
SQL语句都写成这样了还说不对
首先你语句就不应该出现在这一层
其次你的语句写法很容易导致SQL注入
再之当你数据量大了后你写了这个东西完全等于没用,结果对的又如何?你难道要用户等你半个小时让你慢慢循环打开关闭打开关闭么?
你硬是要撑下去的话,贴HELPER里面吧。
REF,不然你修改不到方法外边的DATATABLE
SQL语句都写成这样了还说不对
首先你语句就不应该出现在这一层
其次你的语句写法很容易导致SQL注入
再之当你数据量大了后你写了这个东西完全等于没用,结果对的又如何?你难道要用户等你半个小时让你慢慢循环打开关闭打开关闭么?
你硬是要撑下去的话,贴HELPER里面吧。
#39
SqlCeDataReader dr91 = SqlCeHelper.ExecuteReader("SELECT SUM(shuliang) AS Expr1 FROM jilurukudan WHERE danhao='" + danhao + "' and (wuliaodaima IN (SELECT wuliaodaima FROM jilurukudan WHERE (id IN (SELECT MAX(id) FROM jilurukudan where danhao='" + danhao + "'))))");
SqlCeDataReader dr92 = SqlCeHelper.ExecuteReader("SELECT wuliaomingcheng,wuliaodaima FROM jilurukudan WHERE danhao='" + danhao + "' and (id IN (SELECT MAX(id) FROM jilurukudan where danhao='" + danhao + "'))");
问下:dr91/dr92释放了么???
既然你都已经跟踪到错误了,请告诉下出错的是哪行代码?
附注:为什么不多跟踪下,看看时间到底是消费在哪几句代码间。或者你在任务管理器中看看程序的内存使用变化,也能估计的差不多啊。
SqlCeDataReader dr92 = SqlCeHelper.ExecuteReader("SELECT wuliaomingcheng,wuliaodaima FROM jilurukudan WHERE danhao='" + danhao + "' and (id IN (SELECT MAX(id) FROM jilurukudan where danhao='" + danhao + "'))");
问下:dr91/dr92释放了么???
既然你都已经跟踪到错误了,请告诉下出错的是哪行代码?
附注:为什么不多跟踪下,看看时间到底是消费在哪几句代码间。或者你在任务管理器中看看程序的内存使用变化,也能估计的差不多啊。
#40
玉叶凉茶
#41
select wuliaodaima,wuliaomingcheng,sum(xianshu) xianshu,sum(yuanshu) yuanshu from
(select wuliaodaima,wuliaomingcheng, sum(shuliang)as xianshu ,0 yuanshu from jilurukudan where danhao='1' group by wuliaodaima,wuliaomingcheng
union
select wuliaodaima,wuliaomingcheng,0 xianshu ,shuliang yuanshu from rukudan where danhao='1') a
group by a.wuliaodaima,a.wuliaomingcheng
大家都说我SQL写的 有问题,这次我改了 ,我改成1次可以查询出来的,但是我这个在SQL2000上测试的已经是正确的了,但是我的开发数据库是SQLCE数据库,麻烦问下上面的语句在SQLCE下面有需要改的吗? 这个语句我已经在SQL2000测试过了是正确的,求此语句在SQLCE下面的写法
#42
你先用个最简单的sql语句查询. 查多几次看会不会影响速度 就知道问题是出在sql 还是cs代码上了
#43
恩,可能问题在这里,给出代码看看
#44
up,学习一下!
#45
我已经解决了,谢谢大家了,最后结贴前公布解决过程, 因为是dr.read()用的太多,太混乱,造成内存没有放出去,解决办法 合理写好SQL语句 减少DR.READER的数量
并合理关闭 尽量使用
try {}
catch{}
finally{dr.close()}
并合理关闭 尽量使用
try {}
catch{}
finally{dr.close()}
#46
因为是dr.read()用的太多,太混乱,造成内存没有放出去.
LZ,都没有仔细看别人给你的回复。
现在的人怎么都喜欢指望别人把代码写好了直接可以拿回去用??
你要是我的同事,我依然还是只会告诉你我写的回复。
LZ,都没有仔细看别人给你的回复。
现在的人怎么都喜欢指望别人把代码写好了直接可以拿回去用??
你要是我的同事,我依然还是只会告诉你我写的回复。
#1
把SqlCeDataReader换成DataSet试试
#2
不是这个问题吧? 你为什么让我换? 的有理由的?
#3
楼主是否笔误?
New就是新开一块内存地址。这样New两次,不会报错,但是消耗资源。
#4
不关dataset的事情是你的SQL语句太烂了
#5
我的SQL怎么优化? 麻烦讲解下
#6
NEW 2次是笔误
#7
好長,幫頂好了
#8
"SELECT SUM(shuliang) AS Expr1 FROM jilurukudan WHERE danhao='" + danhao + "'
and (wuliaodaima IN (SELECT wuliaodaima FROM jilurukudan
WHERE (id IN (SELECT MAX(id) FROM jilurukudan where danhao='" + danhao + "'))))"
#9
DataTable dtable = new DataTable();
dtable = new DataTable(); // 这里第二次 new 没有必要。
#10
你把表字段
贴出来
我帮你写
贴出来
我帮你写
#11
等我慢慢看
#12
8楼你的SQL和我的不是一样?
#13
给出你的表结构和要的结果
#14
另外,如果怀疑是DATATABLE使用后没有释放掉资源,可以考虑这样:
DataTable dtable = new DataTable();
private void bt_chaxun_Click(object sender, EventArgs e)
{
this.bt_chaxun.Enabled = false;
dtable.Clear();
// ...
}
#15
我的那个第2个new是笔误 ,是否需要 dtable.dispose() 还是其他原因造成多次执行clcik的时候死机? 现在的现象是查1次 比上一次慢一次 越查越慢 最后 OVER了,所以我怀疑是资源没释放的问题,不是SQL问题,麻烦高手帮解决
#16
8楼的SQL没改只是贴出来好看一些而已
#17
用Using语句试试
定义dataTable对象改为
using(DataTable dtable = new DataTable())
{
}
把你一下的代码放进上面的大括号里试试。
定义dataTable对象改为
using(DataTable dtable = new DataTable())
{
}
把你一下的代码放进上面的大括号里试试。
#18
private void bt_chaxun_KeyDown(object sender, KeyEventArgs e)
{ if (e.KeyCode == Keys.F1)
{
if (bt_chaxun.Enabled ==true)
this.bt_chaxun_Click(bt_chaxun, new KeyEventArgs(Keys.Enter));
}
}
能否是btchaun_click事件写的有问题? 就是KEYDOWN来完成CLICK ,因为我的是支持触摸屏幕的
#19
"SELECT SUM(shuliang) AS Expr1 FROM jilurukudan WHERE danhao='" + danhao + "'
and (wuliaodaima IN (SELECT wuliaodaima FROM jilurukudan
WHERE (id IN (SELECT MAX(id) FROM jilurukudan where danhao='" + danhao + "'))))"
怎么同一个表用了三个in啊?你到底想做什么?
(id IN (SELECT MAX(id) FROM jilurukudan where danhao='" + danhao + "')是获取同一个单号的最大ID
and (wuliaodaima IN (SELECT wuliaodaima FROM jilurukudan
WHERE (id IN (SELECT MAX(id) FROM jilurukudan where danhao='" + danhao + "'))))"
怎么同一个表用了三个in啊?你到底想做什么?
(id IN (SELECT MAX(id) FROM jilurukudan where danhao='" + danhao + "')是获取同一个单号的最大ID
#20
我觉得Using 和实例化一个对象,然后dispose效果差不多,因为using会自动调用对象的close 和 dispose方法,楼主这个问题我也遇到过,我每次也是直接new一个出来。帮顶!我也等待高人回答
================================================================================
viewerwang's life
http://lelespace.com/
================================================================================
================================================================================
viewerwang's life
http://lelespace.com/
================================================================================
#21
除非特别必要,一般资源的释放都是由.net framework的垃圾回收系统GC自动完成的.我认为与datatable没关系
#22
请楼主给出表结构和想要的结果。
#23
代码补充下:
我相当于把那个datatble当成个参数传到一个函数里面处理,然后处理后又做DATAGRID的DATASOURCE了,这个有问题吗? 还是写成REF?
private void bt_chaxun_Click(object sender, EventArgs e)
{
this.bt_chaxun.Enabled = false;
DataTable dtable = new DataTable();
dtable = new DataTable();
switch (biaozhi)
{
case "0":
dtable.Columns.Add("编码", typeof(string));
dtable.Columns.Add("名称", typeof(string));
dtable.Columns.Add("应扫", typeof(string));
dtable.Columns.Add("已扫", typeof(string));
SqlCeDataReader dr91 = SqlCeHelper.ExecuteReader("SELECT SUM(shuliang) AS Expr1 FROM jilurukudan WHERE danhao='" + danhao + "' and (wuliaodaima IN (SELECT wuliaodaima FROM jilurukudan WHERE (id IN (SELECT MAX(id) FROM jilurukudan where danhao='" + danhao + "'))))");
SqlCeDataReader dr92 = SqlCeHelper.ExecuteReader("SELECT wuliaomingcheng,wuliaodaima FROM jilurukudan WHERE danhao='" + danhao + "' and (id IN (SELECT MAX(id) FROM jilurukudan where danhao='" + danhao + "'))");
this.listBox1.Items.Clear();
if (dr91.Read() == true && dr92.Read() == true)
{
SqlCeDataReader dr9000 = SqlCeHelper.ExecuteReader("select shuliang from rukudan where danhao='" + danhao + "' and (wuliaodaima IN (SELECT wuliaodaima FROM jilurukudan WHERE (id IN (SELECT MAX(id) FROM jilurukudan where danhao='" + danhao + "')))) ");
if (dr9000.Read() == true)
{
gv(dr92[1].ToString(), dr92[0].ToString(), dr9000[0].ToString(), dr91[0].ToString(), dtable);
dr9000.Close();
dataGrid1.DataSource = dtable;
dataGrid1.TableStyles[0].GridColumnStyles[0].Width = 47;
dataGrid1.TableStyles[0].GridColumnStyles[1].Width = 128;
dataGrid1.TableStyles[0].GridColumnStyles[2].Width = 47;
dataGrid1.TableStyles[0].GridColumnStyles[3].Width = 47;
private void gv(string bianma, string mingcheng, string yuanshu, string xianshu, DataTable dtable)
{
if (bianma.Length > 6)
{
bianma = bianma.Substring(bianma.Length - 6);
}
if (mingcheng.Length > 9)
{
mingcheng = mingcheng.Substring(mingcheng.Length - 9);
}
if (yuanshu.Length > 6)
{
yuanshu = yuanshu.Substring(yuanshu.Length - 6);
}
if (xianshu.Length > 6)
{
xianshu = xianshu.Substring(xianshu.Length - 6);
}
DataRow drow = dtable.NewRow();
drow["编码"] = bianma;
drow["名称"] = mingcheng;
drow["应扫"] = yuanshu;
drow["已扫"] = xianshu;
dtable.Rows.Add(drow);
}
我相当于把那个datatble当成个参数传到一个函数里面处理,然后处理后又做DATAGRID的DATASOURCE了,这个有问题吗? 还是写成REF?
#24
我认为LZ的担心是多余的,几个DATATABLE并不会使程序挂掉,也没有必要去考虑释放资源这种问题,这些完全都可以由FRAME自行处理回收。
引起你现在挂起的问题我认为是SQL语句不当照成的,你中间的循环每一次就会去执行一次查询,这个代价太大了。
假设我有10000个循环你难道就要去数据库查询10000次?
建议你这个地方的处理方式进行更改
1.更改语句,使一次查询后就能得出结果
2.如果优化SQL语句不能达到一次出结果的话,使用DATASET代替DATAREADER,将所需要的数据全部导入DATASET,然后将逻辑处理放在DATASET上,尽可能减小与数据库的连接次数。
引起你现在挂起的问题我认为是SQL语句不当照成的,你中间的循环每一次就会去执行一次查询,这个代价太大了。
假设我有10000个循环你难道就要去数据库查询10000次?
建议你这个地方的处理方式进行更改
1.更改语句,使一次查询后就能得出结果
2.如果优化SQL语句不能达到一次出结果的话,使用DATASET代替DATAREADER,将所需要的数据全部导入DATASET,然后将逻辑处理放在DATASET上,尽可能减小与数据库的连接次数。
#25
像你这样的sql语句很不科学的,最好不要用in来查询
http://topic.csdn.net/u/20090325/10/b31fdf29-6e80-4b3b-bb61-bacd25fd37f9.html
上面链接你看看,看了你就应该明白了!
http://topic.csdn.net/u/20090325/10/b31fdf29-6e80-4b3b-bb61-bacd25fd37f9.html
上面链接你看看,看了你就应该明白了!
#26
不死都半条命了...
#27
SqlCeHelper.ExecuteReader
我要看这里的代码. 其他的没有问题
我要看这里的代码. 其他的没有问题
#28
24楼说我明白! 但是现在是现象 ,明白我的意思? 我第1次执行查询 完全OK! 一点问题没有,这也就是说我的SQL执行是没问题的,如果像24楼说的有问题 ,第1次查询速度会非常非常的慢,而现在不是这样的现象,现在是第1次查询完全正常,速度也正常,但是第2次查询,速度就会变慢,而且第3次会更慢,第4次会越来越慢,这样的现象告诉我们的是很明显有资源或者部分没有释放出去,所以不是SQL语句的问题? 大家明白吗?如果是SQL语句的问题,那么第1次查询和第2次查询会是一样的,都是会非常的慢,而且查多了会造成死机,2种情况的现象有很明显区别,所以大家看下我的代码是否是有的地方用过了没有释放掉? 或者是说有的地方用完后需要关闭。谢谢
SQL语句不对,肯定被否决了,因为我特意测试了下。
SQL语句不对,肯定被否决了,因为我特意测试了下。
#29
搞这么麻烦做什么,用SqlDataAdapter.Fill(DataTable)吧。
#30
if (dr91.Read() == true && dr92.Read() == true)
{
SqlCeDataReader dr9000 = SqlCeHelper.ExecuteReader("select shuliang from rukudan where danhao='" + danhao + "' and (wuliaodaima IN (SELECT wuliaodaima FROM jilurukudan WHERE (id IN (SELECT MAX(id) FROM jilurukudan where danhao='" + danhao + "')))) ");
if (dr9000.Read() == true)
{
gv(dr92[1].ToString(), dr92[0].ToString(), dr9000[0].ToString(), dr91[0].ToString(), dtable);
dr9000.Close();
}//一部分代码其实所有的DR我都已经关闭这里不多写
楼主至少应该将
dr9000.Close();
放到
}//一部分代码其实所有的DR我都已经关闭这里不多写
下面
我认为问题不在楼主贴出的代码中,SQL需要优化
{
SqlCeDataReader dr9000 = SqlCeHelper.ExecuteReader("select shuliang from rukudan where danhao='" + danhao + "' and (wuliaodaima IN (SELECT wuliaodaima FROM jilurukudan WHERE (id IN (SELECT MAX(id) FROM jilurukudan where danhao='" + danhao + "')))) ");
if (dr9000.Read() == true)
{
gv(dr92[1].ToString(), dr92[0].ToString(), dr9000[0].ToString(), dr91[0].ToString(), dtable);
dr9000.Close();
}//一部分代码其实所有的DR我都已经关闭这里不多写
楼主至少应该将
dr9000.Close();
放到
}//一部分代码其实所有的DR我都已经关闭这里不多写
下面
我认为问题不在楼主贴出的代码中,SQL需要优化
#31
我 昏倒 麻烦大家看下我描述的现象再来判断下 是什么问题?谢谢大家了,现象告诉我们真的不是SQL的问题
#32
总体感觉是效率太低,插入一行居然要连数据库三次,其实完全可以在一个存储过程里实现。
你把这些逻辑写在存储过程里,在数据库管理器多运行几次(相当于点几次按钮),看看会出什么问题就明白了。
你把这些逻辑写在存储过程里,在数据库管理器多运行几次(相当于点几次按钮),看看会出什么问题就明白了。
#33
对
#34
未处理的“System.OutOfMemoryException”类型的异常出现在 System.dll 中。
这是我跟踪到的错误
这是我跟踪到的错误
#35
不是这样认为.
很大情况下是因为ado的问题.
很大情况下是因为ado的问题.
#36
还没人会 RMB选上20元来解决这个问题 有会的 来叫我
#37
未处理的“System.OutOfMemoryException”类型的异常出现在 System.dll 中。
是因为内存消耗太大引起的,你的SQL语句消耗太多资源,而且写法也是错误的。
是因为内存消耗太大引起的,你的SQL语句消耗太多资源,而且写法也是错误的。
#38
我相当于把那个datatble当成个参数传到一个函数里面处理,然后处理后又做DATAGRID的DATASOURCE了,这个有问题吗? 还是写成REF?
REF,不然你修改不到方法外边的DATATABLE
SQL语句都写成这样了还说不对
首先你语句就不应该出现在这一层
其次你的语句写法很容易导致SQL注入
再之当你数据量大了后你写了这个东西完全等于没用,结果对的又如何?你难道要用户等你半个小时让你慢慢循环打开关闭打开关闭么?
你硬是要撑下去的话,贴HELPER里面吧。
REF,不然你修改不到方法外边的DATATABLE
SQL语句都写成这样了还说不对
首先你语句就不应该出现在这一层
其次你的语句写法很容易导致SQL注入
再之当你数据量大了后你写了这个东西完全等于没用,结果对的又如何?你难道要用户等你半个小时让你慢慢循环打开关闭打开关闭么?
你硬是要撑下去的话,贴HELPER里面吧。
#39
SqlCeDataReader dr91 = SqlCeHelper.ExecuteReader("SELECT SUM(shuliang) AS Expr1 FROM jilurukudan WHERE danhao='" + danhao + "' and (wuliaodaima IN (SELECT wuliaodaima FROM jilurukudan WHERE (id IN (SELECT MAX(id) FROM jilurukudan where danhao='" + danhao + "'))))");
SqlCeDataReader dr92 = SqlCeHelper.ExecuteReader("SELECT wuliaomingcheng,wuliaodaima FROM jilurukudan WHERE danhao='" + danhao + "' and (id IN (SELECT MAX(id) FROM jilurukudan where danhao='" + danhao + "'))");
问下:dr91/dr92释放了么???
既然你都已经跟踪到错误了,请告诉下出错的是哪行代码?
附注:为什么不多跟踪下,看看时间到底是消费在哪几句代码间。或者你在任务管理器中看看程序的内存使用变化,也能估计的差不多啊。
SqlCeDataReader dr92 = SqlCeHelper.ExecuteReader("SELECT wuliaomingcheng,wuliaodaima FROM jilurukudan WHERE danhao='" + danhao + "' and (id IN (SELECT MAX(id) FROM jilurukudan where danhao='" + danhao + "'))");
问下:dr91/dr92释放了么???
既然你都已经跟踪到错误了,请告诉下出错的是哪行代码?
附注:为什么不多跟踪下,看看时间到底是消费在哪几句代码间。或者你在任务管理器中看看程序的内存使用变化,也能估计的差不多啊。
#40
玉叶凉茶
#41
select wuliaodaima,wuliaomingcheng,sum(xianshu) xianshu,sum(yuanshu) yuanshu from
(select wuliaodaima,wuliaomingcheng, sum(shuliang)as xianshu ,0 yuanshu from jilurukudan where danhao='1' group by wuliaodaima,wuliaomingcheng
union
select wuliaodaima,wuliaomingcheng,0 xianshu ,shuliang yuanshu from rukudan where danhao='1') a
group by a.wuliaodaima,a.wuliaomingcheng
大家都说我SQL写的 有问题,这次我改了 ,我改成1次可以查询出来的,但是我这个在SQL2000上测试的已经是正确的了,但是我的开发数据库是SQLCE数据库,麻烦问下上面的语句在SQLCE下面有需要改的吗? 这个语句我已经在SQL2000测试过了是正确的,求此语句在SQLCE下面的写法
#42
你先用个最简单的sql语句查询. 查多几次看会不会影响速度 就知道问题是出在sql 还是cs代码上了
#43
恩,可能问题在这里,给出代码看看
#44
up,学习一下!
#45
我已经解决了,谢谢大家了,最后结贴前公布解决过程, 因为是dr.read()用的太多,太混乱,造成内存没有放出去,解决办法 合理写好SQL语句 减少DR.READER的数量
并合理关闭 尽量使用
try {}
catch{}
finally{dr.close()}
并合理关闭 尽量使用
try {}
catch{}
finally{dr.close()}
#46
因为是dr.read()用的太多,太混乱,造成内存没有放出去.
LZ,都没有仔细看别人给你的回复。
现在的人怎么都喜欢指望别人把代码写好了直接可以拿回去用??
你要是我的同事,我依然还是只会告诉你我写的回复。
LZ,都没有仔细看别人给你的回复。
现在的人怎么都喜欢指望别人把代码写好了直接可以拿回去用??
你要是我的同事,我依然还是只会告诉你我写的回复。