SqlDataAdapter.Fill()的时候超时

allen0118 2012-02-28 09:39:01
public DataTable GetDataSet(string sql, params SqlParameter[] values)
{
using (SqlCommand cmd = new SqlCommand(sql, Connection))
{
DataSet ds = new DataSet();

cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddRange(values);
SqlDataAdapter da = new SqlDataAdapter(cmd);
da.Fill(ds);
return ds.Tables[0];
}

}


这里就是调用的时候:
public DataTable GetWeekProduct(DateTime startTime, DateTime endTime)
{
string strSql = "DB.DBO.usp_WeekProductReport ";
SqlParameter[] sp = new SqlParameter[]
{
new SqlParameter("@DateFrom",startTime),
new SqlParameter("@DateTo",endTime),

};
return base.GetDataSet(strSql, sp);

}



我在数据库里面直接查询的话只需要2秒钟数据就出来了,数据量只有10条数据,但是在程序里面就死掉了,就是da.Fill(ds)的时候卡住了,
我是调用的一个存储过程来查询,网上说的那些设置cmd.CommandTimeout我也试过了,问题依旧,不知道有没有人遇见过。
...全文
1367 42 打赏 收藏 转发到动态 举报
写回复
用AI写文章
42 条回复
切换为时间正序
请发表友善的回复…
发表回复
yangfanwx 2012-08-13
  • 打赏
  • 举报
回复
SqlCommand cmd = new SqlCommand();
cmd.CommandTimeout = 180;
再运行,即解决,这里设置的时间的180秒,即三分钟!可根据需要设置,如果过长,也可以设置为0,当此属性设置为0时表示不限制时间。此属性值应该慎用。还需要在Web.config配置文件中设置http请求运行时限间

<system.web>
<httpRuntime maxRequestLength="102400" executionTimeout="720" />
</system.web>
这里设置的为720秒,前面的属性maxRequestLength一般用于用户上传文件限制大小!默认一般为4096 KB (4 MB)。

Anson_Lubin 2012-04-13
  • 打赏
  • 举报
回复
所以要注意滴是表涉及哪些其它的内容
Anson_Lubin 2012-04-13
  • 打赏
  • 举报
回复
你地问题 我 刚刚碰到了啊 是这样的 我的情况跟你的不一样。我的是在同一服务器,在数据库执行存储过程非常快,用时几乎为0,绝对不是存储过程的问题,我的表的数据有80万条,我的分页存储过程查询很快滴,几乎是0。但在c#中SqlDataAdapter fill总是超时,是因为我在查询的那一张表中创建了一个索引,是在2个字段上面创建的。后来我改成只在那个表的主键字段上创建索引就可以了,就不会出现超时的问题。我也郁闷,为什么在2个字段上面创建索引就不行。反正再去研究一下。
allen0118 2012-02-28
  • 打赏
  • 举报
回复
[Quote=引用 31 楼 cnwin 的回复:]
引用 29 楼 chenpeng0118 的回复:
delete WeekProduct

insert into WeekProduct select * from #AllInfo ORDER BY FMPN,FORDER

select * from WeekProduct ORDER BY FMPN,FORDERGO

你还是在你存储过程最后获得表啊。当然正常情况下也没问题,……
[/Quote]

分开执行都没问题,第一步:将存储过程的数据放到一张表里面。OK

第二步:查询那张有数据的表,OK
分开都是可以的,但是合在一起就不行了。
SQL77 2012-02-28
  • 打赏
  • 举报
回复
[Quote=引用 30 楼 chenpeng0118 的回复:]
引用 22 楼 qldsrx 的回复:
“开始”-->"程序"-->"Microsoft SQL Server"-->"事件探查器",打开后运行就可以跟踪到了,难道你就从未用过它?这可是调试C#操作数据库的必备工具啊,特别是要用Linq To Sql等自动创建SQL语句的时候,可以分析自动产生的SQL的好坏。

qldsrx :
我发现跟踪的时候有这个错误,提示没有可用的连接,并自动创建一……
[/Quote]
看这个就是没连接到啊。。。。
cnwin 2012-02-28
  • 打赏
  • 举报
回复
[Quote=引用 29 楼 chenpeng0118 的回复:]
delete WeekProduct

insert into WeekProduct select * from #AllInfo ORDER BY FMPN,FORDER

select * from WeekProduct ORDER BY FMPN,FORDERGO
[/Quote]
你还是在你存储过程最后获得表啊。当然正常情况下也没问题,我试过我的改成这种方式是可以的。
看你上面说的存储过程就是一句话(select)是可以获得数据的?是吗?那就是说用你现在的连接可以获得数据表了?连接该没问题啊。

我上面的意思就是让你把执行和获取表分开来。这样如果执行过程有问题可以在应用程序中报出来。

就目前情况看说明你连接没问题,Sql Server中执行也没问题。那就是程序调用有问题了。
你的时间参数有问题:转一下
StartDate.ToString()

我都是这么用的,当然我是自己写的DbHelp类:我的代码如下:

Db.AddInParameter("@first_date", DbType.String, StartDate.ToString());
Db.AddInParameter("@Last_date", DbType.String, EndDate.ToString());
Db.AddOutParameter("@error_string", DbType.String, "ok", 255);
Db.ExecuteNonQuery("sp_Stock_Statist", CommandType.StoredProcedure);
string Rst = Db.Parameters["@error_string"].Value.ToString();
if (Rst=="ok")
{
return TableOperator.GetDataTable<dsResult.month_statistDataTable>();
}
else
{
throw new Exception(Rst);
}

allen0118 2012-02-28
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 qldsrx 的回复:]
“开始”-->"程序"-->"Microsoft SQL Server"-->"事件探查器",打开后运行就可以跟踪到了,难道你就从未用过它?这可是调试C#操作数据库的必备工具啊,特别是要用Linq To Sql等自动创建SQL语句的时候,可以分析自动产生的SQL的好坏。
[/Quote]
qldsrx :
我发现跟踪的时候有这个错误,提示没有可用的连接,并自动创建一个,这是什么意思呢?
No matching connection to execute this on. Will auto-create one.
allen0118 2012-02-28
  • 打赏
  • 举报
回复
CREATE PROCEDURE [DBO].[usp_WeekProductYieldReport3]
-- @ModelPN VARCHAR(15)=' ',
@DateFrom smalldatetime=' ',
@DateTo smalldatetime=' ' ----- 10/31/2010
AS

SELECT @DateTo=DATEADD(DAY,1,@DateTo)


SELECT FORDER=1,FPN_L='52', FFLOW='AOI' INTO #FLOW
UNION
SELECT FORDER=2,FPN_L='52', FFLOW='AOI'
UNION
SELECT FORDER=3,FPN_L='50', FFLOW='TWS'
UNION
SELECT FORDER=4,FPN_L='52', FFLOW='T01'
UNION
SELECT FORDER=5,FPN_L='50', FFLOW='T01'
UNION
SELECT FORDER=6,FPN_L='52', FFLOW='T03'
UNION
SELECT FORDER=7,FPN_L='80', FFLOW='T11'
UNION
SELECT FORDER=8,FPN_L='80', FFLOW='Q01'
UNION
SELECT FORDER=9,FPN_L='80', FFLOW='Q02'
-------------------------------------------------------------------------------------


SELECT FNO=21, FMPN='80-A368-30W00',FPN='52-A368-11W00', FORDER=1 INTO #805052
UNION
SELECT FNO=22, FMPN='80-A368-30W00',FPN='52-A368-00W00', FORDER=2
UNION
SELECT FNO=23, FMPN='80-A368-30W00',FPN='52-A368-05W00', FORDER=2
UNION
SELECT FNO=24, FMPN='80-A368-30W00',FPN='50-A368-30W00', FORDER=3
UNION
SELECT FNO=25, FMPN='80-A368-30W00',FPN='52-A368-11W00', FORDER=4
UNION
SELECT FNO=26, FMPN='80-A368-30W00',FPN='50-A368-30W00', FORDER=5
UNION
SELECT FNO=27, FMPN='80-A368-30W00',FPN='52-A368-11W00', FORDER=6
UNION
SELECT FNO=28, FMPN='80-A368-30W00',FPN='80-A368-30W00', FORDER=7
UNION
SELECT FNO=29, FMPN='80-A368-30W00',FPN='80-A368-30W00', FORDER=8
UNION
SELECT FNO=30, FMPN='80-A368-30W00',FPN='80-A368-30W00', FORDER=9




--------------------------------------------------------------------------------------


SELECT FID=IDENTITY(INT,1,1), B.FMPN, B.FPN, A.FFLOW, FTOTQTY=0, FFQTY=0, A.FORDER
INTO #R FROM #FLOW A, #805052 B
WHERE A.FORDER=B.FORDER ---A.FPN_L=LEFT(B.FPN,2)
ORDER BY B.FMPN, A.FORDER, B.FNO


SELECT * INTO #MOD FROM viwModelB5 WHERE MOD_CUSTOM='CC002'


select SONO = MSO_NO, FPN=MSO_MODEL,PN80=MSO_MODEL, FPN2=MSO_MODEL, MSO=MSO_NO, IFMB = 'M' into #temp_so
from viwModsoB5, #MOD
where MSO_MODEL=MOD_NO
UNION ALL
select b.BSO_NO, BSO_BOARD,m.MSO_MODEL, '52'+SUBSTRING(BSO_BOARD,3,15), BSO_MSOFOR, 'B'
from viwBodsoB5 b, viwModsoB5 m, #MOD
where m.MSO_MODEL=MOD_NO and b.BSO_MSOFOR = m.MSO_NO
ORDER BY MSO, SONO

----SELECT * FROM #temp_so ORDER BY PN80




SELECT PN80=SPACE(13), FPN=SPACE(13), FFLOW=SPACE(5), FTOTQTY=0, FREPQTY=0 INTO #TEMPR0 WHERE 1=0

-----AOI
SELECT DISTINCT A.FFlow, A.FPBC, A.FMPN, B.FBC ----, SONO --
INTO #AOI0 FROM viwMPBCINFOB5 A, viwMBCINFOB5 B ----, #temp_so C
WHERE A.FFLOW='AOI' AND B.FFLOW='SMT' ----AND A.FMPN=C.FPN2 AND C.IFMB='B'
AND A.FPBC=B.FPBC AND A.FINPUTDATE>=@DATEFROM AND A.FINPUTDATE<@DateTo
---- AND FMPN='52-A368-10W00'

SELECT BCS_MODFOR AS PN80, A.* INTO #AOI FROM #AOI0 A, VIWBCSTATUSB5 B WHERE FBC=BCS_CTSNO
-----DELETE #AOI WHERE FBC NOT IN (SELECT BCS_CTSNO FROM #VSNO)
DROP TABLE #AOI0
/*
SELECT * FROM #AOI
WHERE PN80='80-A368-00W00'
order by FBC
RETURN
*/



--1. AOI
/*SELECT * FROM viwMPBCINFOB5 A, viwMBCINFOB5 B, #temp_so C
WHERE A.FFLOW='AOI' AND B.FFLOW='SMT' AND A.FMPN=C.FPN2 AND C.IFMB='B'
AND A.FPBC=B.FPBC AND A.FINPUTDATE>=@DATEFROM AND A.FINPUTDATE<@DateTo
ORDER BY C.PN80,A.FFlow, A.FPBC, A.FMPN, B.FBC
*/


INSERT INTO #TEMPR0
SELECT PN80,FMPN, 'AOI', COUNT(*), 0 FROM #AOI GROUP BY PN80,FMPN

SELECT FBC, MAX(FMPN) AS FMPN INTO #RPN FROM #AOI GROUP BY FPBC, FBC


INSERT INTO #TEMPR0
SELECT B.PN80,'50'+SUBSTRING(C.FMPN,3,15), 'AOI', 0, COUNT(*) FROM viwMPBCINFOB5 A, #AOI B, #RPN C
WHERE A.FFLOW='SMTR' AND A.FPBC=B.FBC AND A.FPBC=C.FBC
GROUP BY B.PN80,C.FMPN


--2. SMT REPAIR
/*SELECT * FROM viwMPBCINFOB5 A, #AOI B, #RPN C
WHERE A.FFLOW='SMTR' AND A.FPBC=B.FBC AND A.FPBC=C.FBC
ORDER BY B.PN80,C.FMPN
*/


select m.PN80, M.FPN, m.IFMB, s.SOT_OPESEQ, SOT_OPEDESC, Process = o.OPE_DESC, ProcessedQty = sum(s.SOT_PQTY+s.SOT_OQTY+s.SOT_FQTY+s.SOT_SQTY),
PassedQty = sum(s.SOT_PQTY+s.SOT_OQTY)
into #temp_res
from viwSodailytotalB5 s, #temp_so m, viwOPERATIONB5 o
where s.SOT_DATE >=@DateFrom and s.SOT_DATE < @DateTo
and s.SOT_SONO = m.SONO AND SOT_OPEDESC IN ('TWS','T01', 'T03','T11','Q01','Q02')
and s.SOT_OPEDESC = o.OPE_CODE
group by m.PN80,M.FPN, m.IFMB, s.SOT_OPESEQ, SOT_OPEDESC, o.OPE_DESC

/*
select * from viwSodailytotalB5 s, #temp_so m, viwOPERATIONB5 o
where s.SOT_DATE >=@DateFrom and s.SOT_DATE < @DateTo
and s.SOT_SONO = m.SONO AND SOT_OPEDESC IN ('TWS','T01', 'T03','T11','Q01','Q02')
and s.SOT_OPEDESC = o.OPE_CODE
return
*/
/*
--3. VTS
select m.PN80, M.FPN, m.IFMB, s.SOT_OPESEQ, SOT_OPEDESC, Process = o.OPE_DESC, ProcessedQty = s.SOT_PQTY+s.SOT_OQTY+s.SOT_FQTY+s.SOT_SQTY,
PassedQty = s.SOT_PQTY+s.SOT_OQTY
from viwSodailytotalB5 s, #temp_so m, viwOPERATIONB5 o
where s.SOT_DATE >=@DateFrom and s.SOT_DATE < @DateTo
and s.SOT_SONO = m.SONO AND SOT_OPEDESC IN ('TWS','T01', 'T03','T11','Q01','Q02')
and s.SOT_OPEDESC = o.OPE_CODE
ORDER by m.PN80,M.FPN, m.IFMB, s.SOT_OPESEQ, SOT_OPEDESC, o.OPE_DESC
*/


----SELECT * FROM #TEMPR0
----SELECT * FROM #temp_res
----RETURN



INSERT INTO #TEMPR0
select PN80, FPN, SOT_OPEDESC, ProcessedQty, PassedQty --Process
from #temp_res
order by PN80,FPN, IFMB, SOT_OPESEQ

SELECT PN80, FPN, FFLOW, FTOTQTY=SUM(FTOTQTY), FREPQTY=SUM(FREPQTY)
INTO #TEMPR FROM #TEMPR0
GROUP BY PN80, FPN, FFLOW

----select * from #tempr

UPDATE #R SET FTOTQTY=B.FTOTQTY, FFQTY=B.FREPQTY
FROM #R A, #TEMPR B
WHERE A.FMPN=B.PN80 AND A.FPN=B.FPN AND A.FFLOW=B.FFLOW



UPDATE #R SET FFQTY=FTOTQTY WHERE FFLOW='AOI'---ADD 2011-02-17

SELECT FMPN, MAX(FPN) AS FPN, FFLOW, SUM(FTOTQTY) AS FTOTQTY, SUM(FFQTY) AS FFQTY, FORDER
INTO #R2 FROM #R GROUP BY FMPN, FFLOW, FORDER
--- ORDER BY FORDER

---FID=IDENTITY(INT,1,1),

--SELECT FID=FORDER,* FROM #R2 ORDER BY FMPN,FORDER

SELECT FID=FORDER,* into #AllInfo FROM #R2 ORDER BY FMPN,FORDER

--select * from #AllInfo ORDER BY FMPN,FORDER


delete WeekProduct

insert into WeekProduct select * from #AllInfo ORDER BY FMPN,FORDER

select * from WeekProduct ORDER BY FMPN,FORDER
GO


最后两句话就是将数据放到我新建的表里面去了,但是这样居然还是出现超时。
allen0118 2012-02-28
  • 打赏
  • 举报
回复
找到问题了,我把那个存储过程里面的代码全部注释了,然后直接写了一句select * from table,然后程序就可以执行下去了,但是我那个存储过程在SQL里面执行也没问题,并且执行时间也很快,这是为什么?求解。
cnwin 2012-02-28
  • 打赏
  • 举报
回复
对了,存储过程执行了吗?你新表里有数据吗?
cnwin 2012-02-28
  • 打赏
  • 举报
回复
哦。那样有可能是连接问题。你的连接查询其它数据表没问题吗?
allen0118 2012-02-28
  • 打赏
  • 举报
回复
[Quote=引用 23 楼 cnwin 的回复:]
这样吧,你最后不要返回#xxxx这样的临时表,而是返回到一个数据库表中(不带“#”号),用ExcuteCommand方法执行你的存储过程,如果执行成功则“select from 你的表”。这样应该没问题。
[/Quote]

我现在将存储过程查出来的数据写到我新建的一张表里面(不是临时表),然后直接查询这张表,但是还是不行。
cnwin 2012-02-28
  • 打赏
  • 举报
回复
补充:用上面的办法你要加一个@ErrString参数(你就保证你的存储过程执行肯定没问题?)在你存储过程可能出问题的地方写一下如下类似语句:

if @@error <> 0
begin
select @error_string = 'xxxx时出错!'
rollback tran
return
end


在存储过程最后(能执行到最后说明执行成功)select @error_string =‘ok'
这样在你程序里判断

if (Rst=="ok")
{
//返回 查询你的表
}
else
{
throw new Exception(Rst);
}
cnwin 2012-02-28
  • 打赏
  • 举报
回复
这样吧,你最后不要返回#xxxx这样的临时表,而是返回到一个数据库表中(不带“#”号),用ExcuteCommand方法执行你的存储过程,如果执行成功则“select from 你的表”。这样应该没问题。
qldsrx 2012-02-28
  • 打赏
  • 举报
回复
“开始”-->"程序"-->"Microsoft SQL Server"-->"事件探查器",打开后运行就可以跟踪到了,难道你就从未用过它?这可是调试C#操作数据库的必备工具啊,特别是要用Linq To Sql等自动创建SQL语句的时候,可以分析自动产生的SQL的好坏。
cnwin 2012-02-28
  • 打赏
  • 举报
回复
sql Server Profiler可以跟踪数据库执行情况。
你说用DataReader时Cmd.ExecuteReader()这时就死掉了?那就是在获取数据过程超时了。
allen0118 2012-02-28
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 qldsrx 的回复:]
打开SQLSERVER的查询跟踪,监测你程序执行存储过程时的数据库操作,如果是SQL语句问题,可以看到当时执行的SQL语句,并分析语句,如果没看到任何SQL语句,就可能是连接问题,未连接到数据库。
[/Quote]

qldsrx:我的SQL是Server2000的,怎么样可以跟踪的到?
allen0118 2012-02-28
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 cnwin 的回复:]
Adapter的Fill办法填充的是数据表表,因此你的这句:DataSet ds = new DataSet();
就可以改成DataTable Dt=new DataTable();
下面的填充就是:
da.Fill(Dt);
Return Dt;
你创建的DataSet里面是不是还没有数据表啊?
还可以用DataTable的Load方法LoadDataReader
SqlD……
[/Quote]

cnwin:

你的方法为都试过了,第一种方法还是在Fill的时候就超时了,第二种方法在SqlDataReader Dr= Cmd.ExecuteReader();的时候超时。
qldsrx 2012-02-28
  • 打赏
  • 举报
回复
打开SQLSERVER的查询跟踪,监测你程序执行存储过程时的数据库操作,如果是SQL语句问题,可以看到当时执行的SQL语句,并分析语句,如果没看到任何SQL语句,就可能是连接问题,未连接到数据库。
cnwin 2012-02-28
  • 打赏
  • 举报
回复
Adapter的Fill办法填充的是数据表表,因此你的这句:DataSet ds = new DataSet();
就可以改成DataTable Dt=new DataTable();
下面的填充就是:
da.Fill(Dt);
Return Dt;
你创建的DataSet里面是不是还没有数据表啊?
还可以用DataTable的Load方法LoadDataReader
SqlDataReader Dr= Cmd.ExecuteReader();
Dt.Load(Dr, LoadOption.PreserveChanges);
加载更多回复(21)

110,538

社区成员

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

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

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