Office中国论坛/Access中国论坛

标题: 数据源如何调用存储过程? [打印本页]

作者: KenjiSato    时间: 2002-8-30 00:58
标题: 数据源如何调用存储过程?
想根据组合框选定值筛选子窗体数据源
子窗体数据源:存储过程是带输入参数的

能否用代码作成类似,一句代码包含输入参数:
Set RSC = CNN.Execute("存储过程 '" & 组合框选定值 & "'")

不想用窗体的输入参数方式做,能否用类似上面一句代码指定带输入参数的存储过程?

子窗体.Form.RecordSource =存储过程

谢谢!

作者: eggh    时间: 2002-8-30 06:20
非要用存储过程吗? 能不能用sql语句动态赋子窗体的数据源?
作者: KenjiSato    时间: 2002-8-30 15:48
存储过程调用调试比内嵌SQL方便,好象速度也快点吧。
作者: HG    时间: 2002-8-30 17:02
我試過,目前除了采用窗體方式來接收輸入參數,或采用默認參數,其它的辦法還沒成功過。
作者: KenjiSato    时间: 2002-9-17 03:17
终于解决啦!!!


DoCmd.RunSQL ("exec Tran授权日志 " & "'" & 功能 & "', '" & 动作 & "', '" & 变更前值 & "', '" & 变更后值 & "','" & mUserName & "'")



ALTER PROCEDURE Tran授权日志
@功能 nvarchar(28),
@动作 nvarchar(28),
@更新前 nvarchar(20),
@更新后 nvarchar(20),
@操作人 nvarchar(8)
AS BEGIN TRAN
INSERT INTO dbo.授权日志 (记录日期, 功能, 动作, 变更前值, 变更后值, 操作人)  VALUES( GETDATE(), @功能 ,@动作,@更新前 ,@更新后, @操作人)

if @@ERROR >0 OR @@ROWCOUNT<>1
   ROLLBACK TRAN
ELSE
   COMMIT TRAN
ENDIF

作者: HG    时间: 2002-9-17 16:53
DoCmd.RunSQL ("exec Tran授权日志 " & "'" & 功能 & "', '" & 动作 & "', '" & 变更前值 & "', '" & 变更后值 & "','" & mUserName & "'")
這一句才是關珒所在,但這一句的變量,是直接來自窗體上的文本框的值嗎?
但這一句很容易出問題,如果參數輸入不完整,哪麼exec後的結果就可想而知了。
有沒有試過這個.docmd.runstortprocedure語句來調用哪,我就是在這條語句上碰碧的。
不多,還是結解了問題。多謝!
作者: HG    时间: 2002-9-18 01:33
DoCmd.RunSQL ("exec usp_qry_production_cn @my_jobno=" & me.my_jobno.Value)
這條語句譔怎麼改寫,方可以用?
多謝!
作者: KenjiSato    时间: 2002-9-18 04:19
DoCmd.RunSQL ("exec usp_qry_production_cn '" & Me.my_jobno.Value & "'")

作者: HG    时间: 2002-9-18 16:32
老大這樣是行不通的,我懷穎是您否這樣傳遞成功過。
作者: HG    时间: 2002-9-18 17:23
Public Function test_proc(my_jobno As String)
Dim comm As New ADODB.Command
Dim para As New ADODB.Parameter

With comm
  .ActiveConnection = CurrentProject.Connection
  .CommandType = adCmdStoredProc
  .CommandText = "usp_qry_production_cn"
End With

Set para = comm.CreateParameter(, adVarChar, adparainput, 10, mj_jobno)
comm.Parameters.Append para

If Not IsNull(my_jobno) Then
  comm.Execute '現在用傳統的方法調用成功,但問題是我怎樣把數據賦給一個表格哪?
Else
   MsgBox "請輸入一個JOBNO號碼", vbOKOnly, "err_info"
End If

Set para = Nothing
Set comm = Nothing

End Function
這是傳統的調用方法,但現在我怎麼才能實現實似於docmd.runsql哪樣的出現查詢數據窗體的效果哪?
正如KenjiSato所想的想的一樣,我也像好哪樣思考過,但從沒成功過,
現在參考了kenjisato的方法,可能是太笨,還是失敗了。
請kenjisato和高手們再指點。多謝!


作者: HG    时间: 2002-9-18 17:50
如果采用.docmd.runsql()方法來調用。
出錯提示如下:
procedure 'usp_qry_production_cn' expects parameter 'my_jobno',which was not supplied
但是我提供了,為什麼傳遞不成功哪?
作者: HG    时间: 2002-9-18 19:49
标题: 老大,現在急須您的幫助,這個問題困我久也
KenjiSato:請問您是怎麼用docmd.runsql()來調用成功的,指點指點我?多多謝!
DOCMD.runsql()根本不可能對ADP有效,在microsoft的ACCESS幫助中,明確的指出此功能只對MDB程序有用。好像此法,無解。


[此贴子已经被HG于2002-9-18 11:49:14编辑过]


作者: KenjiSato    时间: 2002-9-18 22:23
能否把你的表和窗体例子上传,我前面改写的是通过测试的,而且我自己的代码一直这么用。我是OFFICE XP +SQL 2000,不知是否有差异。
作者: HG    时间: 2002-9-19 03:12
太大的表了,上傳起來很麻煩的。可能有快百M了。其實我須要的就是您所寮現的哪種效果。
老大,我的語句只有哪麼一行代碼,但是為何為就是通過不了。
我的開發環境和您的一樣。不過都是英文版的吧了。
要不我就用存儲過程參數級連傳遞的代碼和你交換吧。可以嗎?
作者: HG    时间: 2002-9-20 17:16
我已上傳:ftp://office-cn.net/Production.rar
username:access-cn password:access-cn
您可以傳您的方法上來嗎
作者: HG    时间: 2002-9-20 17:46
ftp://access-cn:access-cn@office-cn.net/production.rar
作者: HG    时间: 2002-9-20 18:59
ftp://access-cn:access-cn@office-cn.net/production1.rar
這是前台,您看了前台就明瞭,我為什麼想用您的方法?
多謝你的幫助。
作者: KenjiSato    时间: 2002-9-20 19:00
标题: 简单的子窗体例子


文件下载

我猜想
作者: KenjiSato    时间: 2002-9-20 19:10

我那例子也可以用,无非用数据表替代存储过程。你的例子好象很特别,能否多多交流!
作者: HG    时间: 2002-9-20 19:53
呵呵,老大,您誤解了我的意思,如果像你哪樣的實現,我想很早就可以搞定了。
不過,您的思路也挺獨特的,值得學習喔!
我現在是編程越來越懶,越來越不想多寫一點代碼。
殃在連窗體都不想作了,都想用存儲過程來實現,報表也不想作了,也同樣用函數或存儲過程來寮現,總之是越來越懶了。呵呵
作者: HG    时间: 2002-9-20 20:01
Kenjisato:你有沒有注意在我的每一個存儲過程,視圖或函數中都可以隨意修改數據(但復合的存儲過程函數除外),你以前不是問過嗎?怎樣在視圖,隨意修改數據等,不過這次上傳例子中沒有哪些特殊情況,但我只能告訴你,所有的一切都可以實現,因為我實現過。
作者: KenjiSato    时间: 2002-9-20 22:58
不过 DoCmd.RunSQL ("exec SP  输入参数")
好象只能对 插入、更新、删除查询这些有用,对 SELECT 不行(只好用 SET RST=)

作者: HG    时间: 2002-9-23 23:33
???
為什麼,對insert,updata,delete有用,而select不可用哪?
您試過了麼?ACCESS的幫助曾明確的指出docmd.runsql只對mdb有用.
也就是說,現在還沒有直接從窗體上可以立即傳遞參數給存儲過程的方法吧。
也就是,直接傳遞參數給docmd.runstordproc sp_name agr1,agr...
作者: KenjiSato    时间: 2002-9-24 07:17
DoCmd.RunSQL ("exec 存储过程1 " & "'" & 输入  & "'")


ALTER PROCEDURE 存储过程1
@输入 nvarchar(28)
AS BEGIN TRAN
INSERT INTO dbo.表1 (姓名) VALUES( @输入)

if @@ERROR >0 OR @@ROWCOUNT<>1
ROLLBACK TRAN
ELSE
COMMIT TRAN
ENDIF

插入新记录是可以的,但是 SELECT * 表1 不行,得用 SET RST=
作者: WTM1    时间: 2002-9-25 21:55
我以前遇到这种问题都用 SET RST=
实现!!
现在问这个问题!!我回答不了!!
没有深度考虑!!
我试过insert可以使用
updata可以使用!
delete也可以!help中有表述!
但无法解释这个问题!
作者: HG    时间: 2002-9-26 01:33
可能微軟設計出docmd.run系統功能,其目的,並不是這樣用的。我的推測。
看來不想寫代碼,還是不行呀。




欢迎光临 Office中国论坛/Access中国论坛 (http://www.office-cn.net/) Powered by Discuz! X3.3