我的存储过程没有我的预期的执行结果,不知哪里出错了,特来请教各路大侠

9876 2003-09-25 08:57:29
SQL数据库表结构和存储过程如下

create table Department
(
cDepartmentID char(4) constraint pkDepartment primary key,
vDepartmentName varchar(20),
vDepartmentHead varchar(20),
vLocation varchar(200)
)

create procedure prcDepartmentAutoGen @iIncrement int output
as
declare @cDepartmentID char(4)
select @cDepartmentID=max(cDepartmentID) from Department
select @iIncrement=convert(int,substring(@cDepartmentID,1,4))+1
return

GO

窗体代码如下:
Option Explicit
Dim i As Integer
Dim blnStatus As Boolean
Dim intPosition As Integer

Private Sub fillList()
On Error GoTo errorhandler
List1.Clear
rs.Requery
rs.MoveFirst
While Not rs.EOF
List1.AddItem rs("vDepartmentName")
rs.MoveNext
Wend
rs.MoveFirst
Call display
Exit Sub
errorhandler:
MsgBox Err.Number & "," & Err.Source & "," & Err.Description, vbInformation, "部门管理"
End Sub

Private Sub display()
txtID = rs("cDepartmentID")
txtName = rs!vDepartmentName
txtHead = rs.Fields(2)
txtAddress = rs(3)
End Sub

Private Sub disallow()
Toolbar1.Buttons(1).Enabled = True
Toolbar1.Buttons(2).Enabled = False
Toolbar1.Buttons(3).Enabled = True
Toolbar1.Buttons(4).Enabled = False
Toolbar1.Buttons(5).Enabled = True
Toolbar1.Buttons(6).Enabled = True
End Sub

Private Sub allow()
Toolbar1.Buttons(1).Enabled = False
Toolbar1.Buttons(2).Enabled = True
Toolbar1.Buttons(3).Enabled = False
Toolbar1.Buttons(4).Enabled = True
Toolbar1.Buttons(5).Enabled = False
Toolbar1.Buttons(6).Enabled = True
End Sub

Private Sub Form_Load()
Call connectionSQLServer
If rs.State = adStateOpen Then rs.Close
rs.Open "select * from Department order by cDepartmentID", con, adOpenDynamic, adLockOptimistic
Call fillList
Call disallow
End Sub

Private Sub List1_Click()
intPosition = List1.ListIndex
rs.MoveFirst
rs.Move intPosition
Call display
End Sub

Private Sub Toolbar1_ButtonClick(ByVal Button As MSComctlLib.Button)
Dim prmOfPrc As parameter
Set prmOfPrc = New parameter//定义参数
Dim strDepartmentID As String//存储存储过程结果的字符串变量
Select Case Button.Key
Case "add"//以下是单击工具栏添加按钮时触发的事件代码
For i = 0 To Controls.Count - 1
If TypeOf Controls(i) Is TextBox Then
Controls(i).Enabled = True
Controls(i).Text = ""
End If
Next//清空各文本框并设置为有效
rs.AddNew//开始添加记录
Call allow//改变工具栏各个按钮的有效性
com.CommandType = adCmdStoredProc//以下均为存储过程代码
com.CommandText = "prcDepartmentAutoGen"
Set prmOfPrc = com.CreateParameter("DepartmentID", adInteger, adParamOutput)
com.Parameters.Append prmOfPrc
com.Execute
If com(0) < 10 Then
strDepartmentID = "000" + CStr(com(0))
ElseIf com(0) < 100 Then
strDepartmentID = "00" + CStr(com(0))
ElseIf com(0) < 1000 Then
strDepartmentID = "0" + CStr(com(0))
End If
txtID.Text = strDepartmentID//设置文本框为存储过程执行结果
Case "save"
blnStatus = True
For i = 0 To Controls.Count - 1
If TypeOf Controls(i) Is TextBox Then
If Controls(i).Text = "" Then
MsgBox "资料填写不完整,请检查", vbInformation, "部门管理"
blnStatus = False
Exit For
End If
End If
Next
If blnStatus = True Then
rs(0) = txtID.Text
rs(1) = txtName.Text
rs(2) = txtHead.Text
rs(3) = txtAddress.Text
rs.Update
MsgBox "记录已经成功保存到数据库", vbInformation, "部门管理"
Call fillList
For i = 0 To Controls.Count - 1
If TypeOf Controls(i) Is TextBox Then Controls(i).Enabled = False
Next
Call disallow
End If
Case "delete"
If rs.BOF = True Then
MsgBox "没有任何部门档案记录,不能进行删除操作", vbInformation, "部门管理"
Toolbar1.Buttons(3).Enabled = False
Exit Sub
End If
rs.Delete
rs.MoveNext
If rs.EOF = True Then
rs.Requery
If rs.BOF = True Then
MsgBox "现在已经没有任何部门档案记录", vbInformation, "部门管理"
For i = 0 To Controls.Count - 1
If TypeOf Controls(i) Is TextBox Then Controls(i).Text = ""
Next
Toolbar1.Buttons(3).Enabled = False
List1.Clear
Exit Sub
End If
End If
Call fillList
Case "cancel"
rs.CancelUpdate
If rs.BOF = True Then
For i = 0 To Controls.Count - 1
If TypeOf Controls(i) Is TextBox Then Controls(i).Enabled = False
Next
Call disallow
Exit Sub
End If
rs.MoveFirst
Call display
For i = 0 To Controls.Count - 1
If TypeOf Controls(i) Is TextBox Then Controls(i).Enabled = False
Next
Call disallow
Case "update"
If rs.BOF = True Then
MsgBox "没有任何部门档案记录,不能进行更新操作", vbInformation, "部门管理"
Toolbar1.Buttons(5).Enabled = False
Exit Sub
End If
For i = 0 To Controls.Count - 1
If TypeOf Controls(i) Is TextBox Then Controls(i).Enabled = True
Next
Call allow
Case "exit"
Unload Me
End Select
End Sub

不知哪里出错了,请问各路大侠

附:错误消息
run-time error '-2147217900(80040e14)':
为过程或函数prcDepartmentAutoGen 指定的参数太多

另外我测试时是这样的,就是数据库中没有记录时,单击工具栏添加按钮时未出现错误,但是文本框中并没有出现存储过程中应该执行的结果("0001"字符串)
单击工具栏取消按钮,再次单击添加按钮时出现如上错误

另外数据库中存在记录时,单击会有存储过程执行的结果,但是取消再添加时又会出现如上错误,不知该怎么修正代码,应该在哪里修改,望赐教

以上rs con com均为ADO对象,在模块代码中声明,干脆附上模块代码,做个参考
Public strServerName As String
Public con As Connection
Public rs As Recordset
Public com As Command

Public Sub getSQLServerName()
If GetSetting("OnlineBankingDB", "SQL Server Name", "ServerName") = "" Then
strServerName = InputBox("请输入数据库服务器名称")
SaveSetting "OnlineBankingDB", "SQL Server Name", "ServerName", strServerName
Else
strServerName = GetSetting("OnlineBankingDB", "SQL Server Name", "ServerName")
End If
End Sub

Public Sub connectionSQLServer()
Set con = New Connection
Set rs = New Recordset
Set com = New Command

On Error GoTo errorhandler
Call getSQLServerName

Set con = New Connection
With con
.Provider = "sqloledb"
.ConnectionString = "user id=sa;" & _
"password=810614;" & _
"data source=" & strServerName & _
";initial catalog=OnlineBankingDB"
.Open
End With

com.ActiveConnection = con
Exit Sub
errorhandler:
MsgBox Err.Number & Err.Source & Err.Description
End Sub


...全文
121 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
WuYunpeng 2003-09-26
  • 打赏
  • 举报
回复
只有数值例才可以用MAX聚合函数。
create table Department
(
● cDepartmentID char(4) constraint pkDepartment primary key,
vDepartmentName varchar(20),
vDepartmentHead varchar(20),
vLocation varchar(200)
)

create procedure prcDepartmentAutoGen @iIncrement int output
as
declare @cDepartmentID char(4)
●select @cDepartmentID=max(cDepartmentID) from Department
select @iIncrement=convert(int,substring(@cDepartmentID,1,4))+1
return

GO

yoki 2003-09-26
  • 打赏
  • 举报
回复
CREATE procedure prcDepartmentAutoGen @iIncrement int output
as
declare @cDepartmentID char(4)
set nocount on
select @cDepartmentID=isnull(max(cDepartmentID),'0000') from Department
set nocount off
select @iIncrement=convert(int,substring(@cDepartmentID,1,4))+1
GO
Fearfulness 2003-09-26
  • 打赏
  • 举报
回复
还有一个小建议,你将ServerName存到注册表里面,万一用户将名称输入错了怎么办?我觉得要是连接超时后,最好DeleteSetting一下。
让数据库列递增,我个人喜欢种一个种子。呵呵
mfcprogrammer 2003-09-26
  • 打赏
  • 举报
回复
楼上的代码正确
rt 2003-09-26
  • 打赏
  • 举报
回复
Private Sub Toolbar1_ButtonClick(ByVal Button As MSComctlLib.Button)
Select Case Button.Key
Case "add"
For i = 0 To Controls.Count - 1
If TypeOf Controls(i) Is TextBox Then
Controls(i).Enabled = True
Controls(i).Text = ""
End If
Next
rs.AddNew
Call allow

Dim comPrc As Command
Dim prmOfPrc As Parameter
Dim strDepartmentID As String

Set comPrc = New Command
Set prmOfPrc = New Parameter
comPrc.ActiveConnection = con

comPrc.CommandType = adCmdStoredProc
comPrc.CommandText = "prcDepartmentAutoGen"

Set prmOfPrc = comPrc.CreateParameter("DepartmentID", adInteger, adParamOutput)
comPrc.Parameters.Append prmOfPrc
comPrc.Execute
If comPrc(0) < 10 Then
strDepartmentID = "000" + CStr(comPrc(0))
ElseIf com(0) < 100 Then
strDepartmentID = "00" + CStr(comPrc(0))
ElseIf com(0) < 1000 Then
strDepartmentID = "0" + CStr(comPrc(0))
End If
txtID.Text = strDepartmentID

Set comPrc = Nothing
Set prmOfPrc = Nothing
Case "save"
blnStatus = True
For i = 0 To Controls.Count - 1
If TypeOf Controls(i) Is TextBox Then
If Controls(i).Text = "" Then
MsgBox "资料填写不完整,请检查", vbInformation, "部门管理"
blnStatus = False
Exit For
End If
End If
Next
If blnStatus = True Then
rs(0) = txtID.Text
rs(1) = txtName.Text
rs(2) = txtHead.Text
rs(3) = txtAddress.Text
rs.Update
MsgBox "记录已经成功保存到数据库", vbInformation, "部门管理"
Call fillList
For i = 0 To Controls.Count - 1
If TypeOf Controls(i) Is TextBox Then Controls(i).Enabled = False
Next
Call disallow
End If
Case "delete"
If rs.BOF = True Then
MsgBox "没有任何部门档案记录,不能进行删除操作", vbInformation, "部门管理"
Toolbar1.Buttons(3).Enabled = False
Exit Sub
End If
rs.Delete
rs.MoveNext
If rs.EOF = True Then
rs.Requery
If rs.BOF = True Then
MsgBox "现在已经没有任何部门档案记录", vbInformation, "部门管理"
For i = 0 To Controls.Count - 1
If TypeOf Controls(i) Is TextBox Then Controls(i).Text = ""
Next
Toolbar1.Buttons(3).Enabled = False
List1.Clear
Exit Sub
End If
End If
Call fillList
Case "cancel"
rs.CancelUpdate
If rs.BOF = True Then
For i = 0 To Controls.Count - 1
If TypeOf Controls(i) Is TextBox Then Controls(i).Enabled = False
Next
Call disallow
Exit Sub
End If
rs.MoveFirst
Call display
For i = 0 To Controls.Count - 1
If TypeOf Controls(i) Is TextBox Then Controls(i).Enabled = False
Next
Call disallow
Case "update"
If rs.BOF = True Then
MsgBox "没有任何部门档案记录,不能进行更新操作", vbInformation, "部门管理"
Toolbar1.Buttons(5).Enabled = False
Exit Sub
End If
For i = 0 To Controls.Count - 1
If TypeOf Controls(i) Is TextBox Then Controls(i).Enabled = True
Next
Call allow
Case "exit"
Unload Me
End Select
End Sub
Fearfulness 2003-09-26
  • 打赏
  • 举报
回复
上面的修改在我这里测试通过了,如果还有什么错误,请发消息或将错误发到我的邮箱(sundylong1981@163.com),想把错误都解决,谢谢!
Fearfulness 2003-09-26
  • 打赏
  • 举报
回复
个人愚见:
关于错误定义参数太多,你可以这样改
Set com = New Command
com.ActiveConnection = con
com.CommandType = adCmdStoredProc '以下均为存储过程代码
com.CommandText = "prcDepartmentAutoGen"
Set prmOfPrc = com.CreateParameter(ab, adInteger, adParamOutput)
com.Parameters.Append prmOfPrc

com.Execute
每次要执行存储过程的时候都将Command重置一下。
关于一开始的时候不显示0001,你可以修改一下存储过程。如下:
CREATE procedure prcDepartmentAutoGen @iIncrement int output
as
declare @cDepartmentID char(4)
select @cDepartmentID=max(cDepartmentID) from Department
if (@cDepartmentID is null)
select @cDepartmentID='0000'
select @iIncrement=convert(int,substring(@cDepartmentID,1,4))+1
return @iIncrement
GO
rt 2003-09-26
  • 打赏
  • 举报
回复
Private Sub Toolbar1_ButtonClick(ByVal Button As MSComctlLib.Button)
Select Case Button.Key
Case "add"
For i = 0 To Controls.Count - 1
If TypeOf Controls Is TextBox Then
Controls .Enabled = True
Controls .Text = ""
End If
Next
rs.AddNew
Call allow

Dim comPrc As Command
Dim prmOfPrc As Parameter
Dim strDepartmentID As S
yijiansong 2003-09-26
  • 打赏
  • 举报
回复
用单步跟踪来除虫,如果你认为存储过程有问题,那么可以在语法分析器中调试,也完全可以找到结果。
9876 2003-09-26
  • 打赏
  • 举报
回复
首先谢谢各位,可是执行仍是同样的错误,我可以确定存储过程现在已经没有问题了,错误肯定是在我的程序里面,不知错在哪里

错误消息是一样的:
run-time error '-2147217900(80040e14)':
为过程或函数prcDepartmentAutoGen 指定的参数太多

各位能不能帮我看看,谢谢各位

附:测试过程
数据库中无任何部门档案记录,单击添加按钮添加,执行预期的存储过程结果,自动产生ID号在文本框中,若是保存,则新增接下来的第二条记录出现如上错误,若是不保存放弃,则再单击工具栏的添加按钮,出现如上错误
Fearfulness 2003-09-26
  • 打赏
  • 举报
回复
个人愚见:你执行一下下面的sql代码看看。
declare @a char(4)
select @a=substring(null,1,4)
你的代码中select @iIncrement=convert(int,substring(@cDepartmentID,1,4))+1
@cDepartmentID在数据库为空的时候,是 NULL尽管你想转换为int形式,但是,@cDepartmentID为NULL时候,本身就是错误的,在你的程序中得到的数据com(0)就必然=NULL
所以不会出现你要的0001。
Lionking1027 2003-09-26
  • 打赏
  • 举报
回复
代码太长了,没几个人会去看的,帮你UP好了!
yunfeng007 2003-09-26
  • 打赏
  • 举报
回复
同意楼上的,另得到返回值用这样的形式试试com.Parameters("DepartmentID").Value
golden24kcn 2003-09-26
  • 打赏
  • 举报
回复
zzzz~~~~~~~~~~
aha99 2003-09-26
  • 打赏
  • 举报
回复
像楼上说的,跟踪一下,看看是哪一步的错误。估计最大的可能性就失调用错误,或者是sql语句错误。
LingeCoding 2003-09-26
  • 打赏
  • 举报
回复
这位兄弟的代码,我没有仔细看,也不清楚要实现什么样的功能。如果不是逻辑上的错误的话,完全可以用单步跟踪来除虫,如果你认为存储过程有问题,那么可以在语法分析器中调试,也完全可以找到结果。为什么不试试呢。
还有,我觉得没有必要把rs com置为全局变量尤其是rs
一般我们定义变量的原则尽量少用全局变量。
txlicenhe 2003-09-26
  • 打赏
  • 举报
回复
或者如下:
create procedure prcDepartmentAutoGen @iIncrement int output
as
select @iIncrement=
convert(int,substring(max(cDepartmentID),1,4))+1 from Department
return
GO
txlicenhe 2003-09-26
  • 打赏
  • 举报
回复
create procedure prcDepartmentAutoGen @iIncrement int output
as
declare @cDepartmentID char(4)
set nocount on
select @cDepartmentID=max(cDepartmentID) from Department
set nocount off
select @iIncrement=convert(int,substring(@cDepartmentID,1,4))+1
return

GO

7,789

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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