存储过程遇到难题,问问大家

MorningTea 2005-08-26 04:21:15
我原来的代码,是一个asp程式
set cn = Server.CreateObject("ADODB.Connection")
set comm = Server.CreateObject("ADODB.Command")
set RcSet = Server.CreateObject("ADODB.RecordSet")
SET CN = GetConnection(gScriptSQL_test)
set comm.ActiveConnection = cn
comm.CommandType = 4
comm.CommandText = "dbo.CE_LIST_PRT" --sp返回一个数据集
RcSet.cursorlocation = adUseClient
set RcSet = comm.Execute
do until RcSet.eof
response.write RcSet("sn") & "<br>"
Rcset.movenext
loop
response.end

1.这是原来的代码,
连接的函数如下:
'=====Create Connection===
Function GetConnection( Param )
Dim conn

On Error Resume Next
Set GetConnection = Nothing
Set conn = Server.CreateObject("ADODB.Connection")
If Err.Number <> 0 Then Exit Function

conn.Open Param
If Err.Number <> 0 Then Exit Function
Set GetConnection = conn
End Function
一直没有问题,不过我的上司看我的代码的时候要我改为和他一样,不要用GetConnection( Param )这个连接方式,要用:
'=====得到SQL之Connection===[GetSQLServerRs使用到]
Function GetSQLServerConnection( Computer, UserID, Password, Db )
Dim Params, conn

Set GetSQLServerConnection = Nothing
Params = "Provider=SQLOLEDB.1"
Params = Params & ";Data Source=" & Computer
Params = Params & ";User ID=" & UserID
Params = Params & ";Password=" & Password
Params = Params & ";Initial Catalog=" & Db
Set conn = Server.CreateObject("ADODB.Connection")
conn.Open Params
conn.Execute "SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED"
Set GetSQLServerConnection = conn
End Function

于是我就修改set cn=GetSQLServerConnection( gSQLServerName, gSQLACCName, gSQLPassword, gSQLDBName)

我原来用的GetConnection(gScriptSQL_test),这个gScriptSQL_test是
gScriptSQL_test="driver={sql server};database=CERT_TEST_DEV;server=minerva;uid=misa;password='*****'"
,我觉得非常奇怪,如果用Provider=SQLOLEDB.1(上司用的这种机制),不是返回数据集就可以,update是可以,执行存储过程也可以,但是执行存储过程返回数据集就是有问题,错误为:
ADODB.Recordset (0x800A0E78)
Operation is not allowed when the object is closed.
---那就是数据集不存在
Provider=SQLOLEDB.1和driver={sql server}这2种不是都是微软提供的机制吗?
Provider=SQLOLEDB.1为什么不能返回我的数据集呢?
真是纳闷m(-_-)m

请大家多多指教!!!(我一直如此用法,从来没有想到换了种连接机制会有问题)
...全文
229 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
MorningTea 2005-09-05
  • 打赏
  • 举报
回复
--哦,问题没有很难,就是我自己为了偷懒,一时候有点想不开
CREATE TABLE #CE_TESTFEE (
[CTF_TENO] [varchar] (8) ,
[CTF_CPNO] [char] (10) ,
[CTF_FEE] [decimal](18, 2) ,
[CTF_CCUNO] [char] (10) ,
[CTF_DEFAULT] [bit]
)
GO
CREATE TABLE #CE_CET_D (
[CED_NO] [varchar] (8) ,
[CED_SN] [int] ,
[CED_T_CODE] [varchar] (8) ,
[CET_TEST_COMP] [varchar] (40) ,
[CED_UP] [decimal](18, 2) ,
[CED_CUR] [varchar] (20)
)
GO

insert into #CE_TESTFEE
select 'A001','SGS-TW',354.50,'NT',0 union all
select 'A001','ITS-GZ',152.69,'RMB',1 union all
select 'A001','ITS-SZ',84.30,'RMB',1 union all
select 'A002','SGS-TW',220.50,'NT',1 union all
select 'A002','ITS-GZ',52.69,'RMB',1 union all
select 'A002','ITS-SZ',50,'RMB',1


insert into #CE_CET_D
select '05090401',1,'A001','',0,'' union all
select '05090401',2,'A001','',0,'' union all
select '05090401',3,'A002','',0,''

-- vivianfdlpw() 符合我的要求,因为我这里有个币别,所以
--费用是不可比较的,没有汇率档,只要选择top 1,按照公司代号排序即可
UPDATE D
SET D.CET_TEST_COMP= T.CTF_CPNO,D. CED_UP=T.CTF_FEE,D. CED_CUR=T.CTF_CCUNO
FROM #CE_CET_D D
JOIN #CE_TESTFEE T
ON D.CED_T_CODE = T.CTF_TENO --项目字段关联
AND T.CTF_CPNO=(select top 1 CTF_CPNO from #CE_TESTFEE
where CTF_TENO=T.CTF_TENO and CTF_DEFAULT=1)

/*
CED_NO CED_SN CED_T_CODE CET_TEST_COMP CED_UP CED_CUR
-------- ----------- ---------- ---------------------------------------- -------------------- --------------------
05090401 1 A001 ITS-GZ 152.69 RMB
05090401 2 A001 ITS-GZ 152.69 RMB
05090401 3 A002 SGS-TW 220.50 NT

(3 row(s) affected)
*/


-- filebat(Mark)和我当初写的思路差不多,也是走进一个误区
UPDATE #CE_CET_D
SET #CE_CET_D.CET_TEST_COMP= tt.CTF_CPNO
,#CE_CET_D.CED_UP=tt.CTF_FEE
,#CE_CET_D.CED_CUR=tt.CTF_CCUNO
FROM (select top 1 t1.* --因为是top1,因为没有按照测试项目分类,
--因此找出来是全部的top 1,因为只是更新了一笔
from #CE_TESTFEE as t1 join #CE_CET_D as t2
on t1.CTF_TENO=t2.CED_T_CODE
where t1.CTF_DEFAULT = 1
order by t1.CTF_FEE desc)tt
where tt.CTF_TENO=#CE_CET_D.CED_T_CODE
select * from #CE_CET_D
/*
CED_NO CED_SN CED_T_CODE CET_TEST_COMP CED_UP CED_CUR
-------- ----------- ---------- ---------------------------------------- -------------------- --------------------
05090401 1 A001 .00
05090401 2 A001 .00
05090401 3 A002 SGS-TW 220.50 NT

(3 row(s) affected)
*/
iwl 2005-09-04
  • 打赏
  • 举报
回复
都是高手
天地客人 2005-09-04
  • 打赏
  • 举报
回复
哈哈,路过,问题解决了,就接分了,也祝贺楼主!

zhangyang555 2005-09-03
  • 打赏
  • 举报
回复
高手过招.呵呵
MorningTea 2005-09-03
  • 打赏
  • 举报
回复
是请SGS(瑞士通用公证行)、ITS(天祥公证行)、都是国际上很知名的公证行!是我们付费的!设置为默认值,也未必是价格最低的,不过你这样考虑也差不多了!我如果有时间,我做几个demo数据出来,大家等我哦,实在不好意思,周末了,人懒,问问题没有准备好表结构和数据,结果集!

等我哦~~!!!!大家周末愉快~
MorningTea 2005-09-03
  • 打赏
  • 举报
回复
问题已经想到:
有一个公证测试系统,功能:内部申请测试公司测试产品,
以得到一个以第三方标准对产品的质量鉴定

有一个表CE_TESTFEE:測試項目費用維護
索引键:CTF_TENO + CTF_CPNO
CTF_TENO 測試項目代號
CTF_CPNO 公司代號
CTF_FEE費用
CTF_CCUNO 幣別代號
CTF_CUSER修改人員
CTF_CDAT 修改日期
CTF_DEFAULT 是否默認值

另外一个表CE_CET_D:公證測試表項目明細資料
CED_T_CODE 測試項目代號
CET_TEST_COMP:測試公司
CED_UP:产生费用
CED_CUR:币别
....

现在要做的是,CE_CET_D表的CED_T_CODE已经写入,
但是CET_TEST_COMP,CED_UP,CED_CUR为空,
假如CE_TESTFEE表如此设计,一个测试项目对应多个测试公司,
有多笔资料,对于同一个测试项目,有多笔资料设为默认值(即CTF_DEFAULT为1:TRUE)
那么我在UPDATE CE_CET_D表的时候,我要带入默认值,
并且要每个测试项目带入第一个DEFAULT,那么我要如何写呢?

我用:
UPDATE D
SET D.CET_TEST_COMP= T.CTF_CPNO
D. CED_UP=T.CTF_FEE
D. CED_CUR=T.CTF_CCUNO
FROM CE_CET_D D,CE_TESTFEE T
WHERE D.CED_T_CODE = T.CTF_TENO
AND T.CTF_DEFAULT = 1

--我这样写,不是每个都带入第一个TOP 1的DEFAULT值,
他是遇到第一次就第一个DEFAULT值,第二次就带入第二个DEFAULT值!
你有办法做到吗?我有个多个DEFAULT值,
但是你必须对每个测试项目带入第一个DEFAULT值,
按照测试公司费用升序,费用最大的排在前面

我已经做了修改,就是一个测试项目只能有一个DEFAULT,
目前系统已经满足要求,不过我当初这种假设可以做到吗?

只要帮我解决的,都给分,目前本人可用分不多,一个帖子不能给太多分,欠分的,我可以给的时候一定给!!

3Q!
vivianfdlpw 2005-09-03
  • 打赏
  • 举报
回复


按照测试公司费用升序,费用最大的排在前面
===============>
top 1 应该是费用最少的吧,别人帮你们测试,是你们付费的?


如果CE_CET_D表只保存每个项目的最少费用纪录:

UPDATE D
SET D.CET_TEST_COMP= T.CTF_CPNO
,D. CED_UP=T.CTF_FEE
,D. CED_CUR=T.CTF_CCUNO
FROM CE_CET_D D
JOIN CE_TESTFEE T
ON D.CED_T_CODE = T.CTF_TENO --项目字段关联
AND T.CTF_DEFAULT = 1
AND T.CTF_FEE=(select min(CTF_FEE) from CE_TESTFEE
where CTF_TENO=T.CTF_TENO)
filebat 2005-09-03
  • 打赏
  • 举报
回复
--大致写了一下,具体细节可以要做点小修改
--而且,我对你的原意有些不解
--例如:"按照测试公司费用升序,费用最大的排在前面"
UPDATE CE_CET_D
SET CE_CET_D.CET_TEST_COMP= tt.CTF_CPNO
,CE_CET_D.CED_UP=tt.CTF_FEE
,CE_CET_D.CED_CUR=tt.CTF_CCUNO
FROM (select top 1 t1.*
from CE_TESTFEE as t1 join CE_CET_D as t2
on t1.CTF_TENO=t2.CED_T_CODE
where t1.CTF_DEFAULT = 1
order by t1.CTF_FEE desc)tt
where tt.CTF_TENO=CE_CET_D.CED_T_CODE
MorningTea 2005-09-03
  • 打赏
  • 举报
回复
vivianfdlpw() ,不是这样子的!

D.CED_T_CODE = T.CTF_TENO --项目字段关联
没有T.CTF_CPNO=D.CET_TEST_COMP --公司字段关联
的条件,实际情况是这样,先是有公司送样品给我们,于是我们品管部的QA人员按需申请测试样品,于是便有CE_CET_D这个表的测试项目的产生,但是CET_TEST_COMP,CED_UP,CED_CUR为空,因为不确定给请那个公司(需要国际认证,所以会请公证行的公司)来帮我们测试,然后我们有维护一个表
CE_TESTFEE,里面记录测试项目,测试公司,费用,币别,是否为default,
假如我设计表CE_TESTFEE,某些测试项目可以有多笔default值,如果用户需要带入默认值,就update表CET_TEST_COMP,CED_UP,CED_CUR,这个带入是default为true,假如一个测试项目default可以有多笔,不同的公司,那么我每次要带入的是按公司代号升序,排在最前面的那一笔!!!

所以就是测试公司还不知道,这个是要带入的东西!
就是要货比三家,设定default值,然后选择top 1
vivianfdlpw 2005-09-03
  • 打赏
  • 举报
回复
你应该再加个连接条件

UPDATE D
SET D.CET_TEST_COMP= T.CTF_CPNO
,D. CED_UP=T.CTF_FEE
,D. CED_CUR=T.CTF_CCUNO
FROM CE_CET_D D
JOIN CE_TESTFEE T
ON D.CED_T_CODE = T.CTF_TENO --项目字段关联
AND T.CTF_CPNO=D.CET_TEST_COMP --公司字段关联
AND T.CTF_DEFAULT = 1
vivianfdlpw 2005-09-03
  • 打赏
  • 举报
回复
你应该再加个连接条件

UPDATE D
SET D.CET_TEST_COMP= T.CTF_CPNO
,D. CED_UP=T.CTF_FEE
,D. CED_CUR=T.CTF_CCUNO
FROM CE_CET_D D
JOIN CE_TESTFEE T
WHERE D.CED_T_CODE = T.CTF_TENO --项目字段关联
AND T.CTF_CPNO=D.CET_TEST_COMP --公司字段关联
AND T.CTF_DEFAULT = 1
MorningTea 2005-08-26
  • 打赏
  • 举报
回复
可是给你50分(我给 vivianfdlpw,只能增加50分),不过一定要回答我一个问题,等我想好了call你,呵呵
filebat 2005-08-26
  • 打赏
  • 举报
回复
难得见 MorningTea发帖哦。
顶一下, 顺便蹭点分。
vivianfdlpw 2005-08-26
  • 打赏
  • 举报
回复
接分:)
MorningTea 2005-08-26
  • 打赏
  • 举报
回复
问题解决了,谢谢 vivianfdlpw() ,真的很感谢,我承诺给你150分,*^O^*......

书到用时方很少啊!我也经常用SET NOCOUNT ON,但是就是没有想到用Provider=SQLOLEDB.1是返回一个计数列影响,而没有返回我SELECT出来的集合!


贴出我的SP,其实很简单,本来用不着用SP,但是我觉得在前台产生一个序号非常慢,所以就用SP:

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[CE_LIST_PRT]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[CE_LIST_PRT]
GO

SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS ON
GO
--SET NOCOUNT ON /*写在SP外面没有用哦,这个不属于SP的CODE,只是在我编写,产生SP的这个SESSION有效*/
GO
create proc dbo.[CE_LIST_PRT]
as
SET NOCOUNT ON --写在SP里面
SELECT IDENTITY(INT,1,1) AS PR_SN,PR_NO,PR_NAM,PR_TYPE INTO #TT
FROM CE_PRT Order By PR_NO
select * from #TT ;
RETURN 0

GO




vivianfdlpw 2005-08-26
  • 打赏
  • 举报
回复
PRB: Error Messaging Referencing #Temp Table with ADO-SQLOLEDB
http://support.microsoft.com/default.aspx?scid=kb;en-us;235340

34,588

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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