下面这个语句只有1千多行记录,但是经常会超时已过期

时间:2022-11-30 11:10:11
我要合并两个数据库的一些表,所以开了两个connection
cn1 是A公司的
cn2 是B公司的
我的思路是:
第一步.建立一个公共的临时表public_jk_jnl,这个表放在cn1 所在的数据库中
第二步.在A公司的数据库中,执行下面的语句一,先插入到临时表#Jk_Jnl,经过一些筛选或者更新处理后,再插入到publicc_jk_jnl
第三步.在B公司的数据库中,执行下面的语句一,先插入到临时表#Jk_Jnl,经过一些筛选或者更新处理后,再插入到publicc_jk_jnl

可能第二步是A公司的数据比较少吧,一般几百行,我每次执行第二步都是成功的,即执行下面的语句一;但是执行到第三步的时候,就提示"超时已过期"。
其实第三步B公司下面这个筛选的数据也不多,不超过2千行就报错。

把上面三步变成我的代码是这样的
cn1.execute "delete from public_jk_jnl" 
cn1.excute "if object_id('tempdb..#jK_Jnl') is not null drop table #Jk_Jnl"
cn1.execute 语句一  '这里不会错
cn1.execute "inert into public_jk_jnl select * from  #Jk_Jnl""
cn1.execute "drop table #Jk_Jnl"

cn2.execute "delete from public_jk_jnl" 
cn2.excute "if object_id('tempdb..#jK_Jnl') is not null drop table #Jk_Jnl"
cn2.execute 语句一  ’ 这里错
cn2.execute "inert into public_jk_jnl select * from  #Jk_Jnl"
cn2.execute "drop table #Jk_Jnl"




我尝试的解决方法:
1. cn1和cn2的ado连接,connect timeout=0,也不行,修改到1000000也不行

我的疑问:
下面这段代码有什么问题,我的步骤哪里错了.

语句一

SELECT v.FVoucherID FVoucherID,v.FEntryCount,ve.FEntryID,v.FYear,v.FPeriod,v.FDate, v.FTransDate,
 v.FGroupID, vg.FName FGroupName, v.FNumber,v.FSerialNum,v.FReference FReference, v.FExplanation FVExplanation, 
ve.FExplanation FEExplanation, ve.FAccountID FAccountID, ve.FDetailID FDetailID, a.FNumber FAccountNumber,
 a.FName FAccountName, ve.FAccountID2 FSideAccountID, b.FNumber FSideAccountNumber,
 b.FName FSideAccountName,FSideDetailID=0,a.FContact FContact, ve.FSettleTypeID,
 ISNULL(e.Fname,SPACE(0)) FSettleTypeName,ve.FSettleNo FSettleNumber, FTplTypeName=tp.FTplTypeName,
FModuleName=tp.FModuleName, ve.FTransNo , ve.FCurrencyID FCurrencyID, c.FNumber FCurrencyNumber,
 c.FName FCurrencyName, ve.FExchangeRate, ve.FDC, ve.FAmountFor FAmountFor,ve.FAmount FAmount,
v.FPosted,a.FDelete ,'aaa' as fitemnumber,'aaaa' as fitemname INTO #Jk_Jnl 
 FROM t_Voucher v INNER JOIN t_VoucherGroup vg ON v.FGroupID = vg.FGroupID
 LEFT OUTER JOIN t_VoucherTplType tp on v.FTranType=tp.FTplTypeID 
INNER JOIN t_VoucherEntry ve ON v.FVoucherID = ve.FVoucherID
 INNER JOIN t_Account a ON ve.FAccountID = a.FAccountID 
LEFT OUTER JOIN ( Select * FROM t_Account b  ) b ON ve.FAccountID2 = b.FAccountID 
INNER JOIN t_Currency c ON ve.FCurrencyID = c.FCurrencyID 
 LEFT OUTER JOIN t_Settle e ON ve.FSettleTypeID=e.FitemID AND e.FitemID<>0 
 WHERE  FDate Between '2013-03-01' AND '2013-03-31' AND a.FNumber>='1122'  AND  a.FNumber<='1122.zzzzzzz'
 AND ve.FCurrencyID =  1 

12 个解决方案

#1


这是 SQL Server 吧。
直接拿了语句到查询分析器中去执行啊,看看到底出了什么错。

#2


语句放到SQL SERVER是没有问题的,大哥。两边数据库都没有问题的。

#3


监视数据库锁对象。

#4


赵老师,数据库锁对象我补太清楚,能讲详细一点吗?还有我的问题,除了在客户操作的时候遇到外,我自己调试也是经常这样的。

#5


在百度搜“监视SQL Server数据库锁对象”

#6


可是我根本就没有用到锁的呀,是系统自动加锁了吗?

#7


引用 5 楼 zhao4zhong1 的回复:
在百度搜“监视SQL Server数据库锁对象”
哥们,头像分辨率太低了,看了好多年了,换个高点分辨率的,好歹也是名人了 下面这个语句只有1千多行记录,但是经常会超时已过期

#8


引用 7 楼 sysdzw 的回复:
Quote: 引用 5 楼 zhao4zhong1 的回复:

在百度搜“监视SQL Server数据库锁对象”
哥们,头像分辨率太低了,看了好多年了,换个高点分辨率的,好歹也是名人了 下面这个语句只有1千多行记录,但是经常会超时已过期

分辨率高了就不象数字化的了。

#9


你们辆聊天,顺便给我讨论下办法吗?好不

#10


现在的问题是在我自己电脑上调试,没有其他人访问的时候也是超时已过期.不存在锁的问题。

#11


use master
go
select *
from master..sysprocesses a join (
select blocked from master..sysprocesses group by blocked
)b on a.spid=b.blocked where a.blocked=0

出现“”超时已过期“后,”用上面的语句在两个服务器上执行后,都没有记录。说明没有阻塞。

#12


ConnectionTimeout 属性
      

指示在终止尝试和产生错误前建立连接期间所等待的时间。

设置和返回值

设置或返回指示等待连接打开的时间的长整型值(单位为秒)。默认值为 15。

说明

如果由于网络拥塞或服务器负载过重导致的延迟使得必须放弃连接尝试时,请使用 Connection 对象的 ConnectionTimeout 属性。如果打开连接前所经过的时间超过 ConnectionTimeout 属性上设置的时间,将产生错误,并且 ADO 将取消该尝试。如果将该属性设置为零,ADO 将无限等待直到连接打开。请确认正在对其编写代码的提供者会支持 ConnectionTimeout 功能。

连接关闭时 ConnectionTimeout 属性为读/写,而打开时其属性为只读。



CommandTimeout 属性
      

指示在终止尝试和产生错误之前执行命令期间需等待的时间。

设置和返回值

设置或返回长整型值,该值指示等待命令执行的时间(单位为秒)。默认值为 30。

说明

使用 Connection 对象或 Command 上的 CommandTimeout 属性,允许由于网络拥塞或服务器负载过重产生的延迟而取消 Execute 方法调用。如果在 CommandTimeout 属性中设置的时间间隔内没有完成命令执行,将产生错误,然后 ADO 将取消该命令。如果将该属性设置为零,ADO 将无限期等待直到命令执行完毕。请确保正在写入代码的提供者和数据源支持 CommandTimeout 功能。

Connection 对象的 CommandTimeout 设置不会对相同 Connection 上 Command 对象的 CommandTimeout 设置产生影响,即 Command 对象的 CommandTimeout 属性不继承 Connection 对象的 CommandTimeout 的值。

在 Connection 对象上,打开 Connection 后,CommandTimeout 属性将保持读/写。

#1


这是 SQL Server 吧。
直接拿了语句到查询分析器中去执行啊,看看到底出了什么错。

#2


语句放到SQL SERVER是没有问题的,大哥。两边数据库都没有问题的。

#3


监视数据库锁对象。

#4


赵老师,数据库锁对象我补太清楚,能讲详细一点吗?还有我的问题,除了在客户操作的时候遇到外,我自己调试也是经常这样的。

#5


在百度搜“监视SQL Server数据库锁对象”

#6


可是我根本就没有用到锁的呀,是系统自动加锁了吗?

#7


引用 5 楼 zhao4zhong1 的回复:
在百度搜“监视SQL Server数据库锁对象”
哥们,头像分辨率太低了,看了好多年了,换个高点分辨率的,好歹也是名人了 下面这个语句只有1千多行记录,但是经常会超时已过期

#8


引用 7 楼 sysdzw 的回复:
Quote: 引用 5 楼 zhao4zhong1 的回复:

在百度搜“监视SQL Server数据库锁对象”
哥们,头像分辨率太低了,看了好多年了,换个高点分辨率的,好歹也是名人了 下面这个语句只有1千多行记录,但是经常会超时已过期

分辨率高了就不象数字化的了。

#9


你们辆聊天,顺便给我讨论下办法吗?好不

#10


现在的问题是在我自己电脑上调试,没有其他人访问的时候也是超时已过期.不存在锁的问题。

#11


use master
go
select *
from master..sysprocesses a join (
select blocked from master..sysprocesses group by blocked
)b on a.spid=b.blocked where a.blocked=0

出现“”超时已过期“后,”用上面的语句在两个服务器上执行后,都没有记录。说明没有阻塞。

#12


ConnectionTimeout 属性
      

指示在终止尝试和产生错误前建立连接期间所等待的时间。

设置和返回值

设置或返回指示等待连接打开的时间的长整型值(单位为秒)。默认值为 15。

说明

如果由于网络拥塞或服务器负载过重导致的延迟使得必须放弃连接尝试时,请使用 Connection 对象的 ConnectionTimeout 属性。如果打开连接前所经过的时间超过 ConnectionTimeout 属性上设置的时间,将产生错误,并且 ADO 将取消该尝试。如果将该属性设置为零,ADO 将无限等待直到连接打开。请确认正在对其编写代码的提供者会支持 ConnectionTimeout 功能。

连接关闭时 ConnectionTimeout 属性为读/写,而打开时其属性为只读。



CommandTimeout 属性
      

指示在终止尝试和产生错误之前执行命令期间需等待的时间。

设置和返回值

设置或返回长整型值,该值指示等待命令执行的时间(单位为秒)。默认值为 30。

说明

使用 Connection 对象或 Command 上的 CommandTimeout 属性,允许由于网络拥塞或服务器负载过重产生的延迟而取消 Execute 方法调用。如果在 CommandTimeout 属性中设置的时间间隔内没有完成命令执行,将产生错误,然后 ADO 将取消该命令。如果将该属性设置为零,ADO 将无限期等待直到命令执行完毕。请确保正在写入代码的提供者和数据源支持 CommandTimeout 功能。

Connection 对象的 CommandTimeout 设置不会对相同 Connection 上 Command 对象的 CommandTimeout 设置产生影响,即 Command 对象的 CommandTimeout 属性不继承 Connection 对象的 CommandTimeout 的值。

在 Connection 对象上,打开 Connection 后,CommandTimeout 属性将保持读/写。