FETCH NEXT FROM V_cursor INTO @a,@a0,@h,@y0 /*从游标中提取数据行,存入四个变量中*/ WHILE @@FETCH_STATUS=0 /*循环检查游标提取状态*/
/*若系统变量@@FETCH_STATUS返回0值,则提取成功*/
BEGIN /*若从游标提取数据成功,则开始做以下工作(循环体的开始)*/ IF @a>0 set @n=@n+1 /*若顶宽数据大于0,则计数器加1*/ SET @s=(2*@a*@h*@y0-@h*@h*(@a-@a0))/2/@y0 /*求出某种型号V带断面积*/ SET @sa=@sa+@s /*累加各种型号的V带断面积*/ FETCH NEXT FROM V_cursor INTO @a,@a0,@h,@y0 /*再从游标提取下一行数据*/
END /*若从游标提取数据成功,所做工作至此结束(循环体的结束)*/ CLOSE V_cursor /*关闭游标*/
DEALLOCATE V_cursor /*释放游标所占用的内存*/
SET @sa=@sa/@n /*根据计数器的计数值,求出各种型号V带断面积的平均值*/ SET @VArea=@sa /*将此平均值赋给存储过程的输出参数(若用户调用存储过程,返回值即此)*/ END /*存储过程的结束*/ GO
此时对话框应为如图 17所示的内容:
图 17 输入完成后的对话框
对以上存储过程,做两点说明: (1) 存储过程的名称为Aear
(2) (3) (4) (5)
自定义的局部变量或参数必须以@开头
Transact-SQL语言不区分大小写
存储过程的每行都做了注释,注释语法与C语言相同 第13行代码:“SET @s=(2*@a*@h*@y0-@h*@h*(@a-@a0))/2/@y0”,是在利用以下公
2ahy0?h(a?a0)2y02式求V带断面积:s?
式中,a-顶宽; h-断面高 a0-节宽
y0-节高
最后,点击对话框中的“确定”按钮,完成存储过程的建立。 (3) VCL组件对象及布局 接着做C++Builder程序。
在窗体上放置一个组框GroupBox、三个标签Label、一个编辑框Edit、一个按钮Button、一个查询数据集ADOQuery、一个数据源DataSource、一个数据查表组合框DBLookupComboBox和一个存储过程ADOStoredProc组件,此时设计界面如图 18所示:
图 18 第七模块初始设计界面
(4) 组件对象的属性设置
按表 29~ 表 33顺序设置以上各VCL组件对象的属性。
表 29 组框与标签对象的属性设置
组件所属的选项卡 默认组件名 GroupBox7 Label13 Standard Label14 Label15 Edit2 Button2 组件所属的选项卡 默认组件名 ADO 组件 编辑框 按钮 标签 组件 组框 Name属性 Text属性 Result Cal (空串) Caption属性 调用带参存储过程 功能:求V带断面积 V带型号(输入参数) 断面积(输出参数) 求断面积 表 30 查询数据集对象的属性设置
Name属性 Connection属性 VModel Engineering 组件 SQL属性 select 型号 from V带断面 Active属性 true ADOQuery1 查询数据集 表 31 数据源对象的属性设置
组件所属的选项卡 默认组件名 DataAccess 组件所属的选项卡 ADO 默认组件名 DBLookupComboBox2 组件所属的选项卡 ADO DataSource1 组件 数据查表组合框 Name属性 DataSet属性 VModel 数据源 DSVModel 表 32 数据查表组合框对象的属性设置
Name属性 ListSource 属性 Model DSVModel ListField属性 KeyField 型号 型号 表 33 存储过程对象的属性设置
默认组件名 组件 Connection属性 Engineering ProcedureName属性 Area;1 ADOStoredProc1 存储过程 最后将窗体的Caption属性设置为“访问SQLServer数据库的七种典型用法”。 (5) 编写对象的事件过程
数据查表组合框(Model)的单击(Click)事件过程 void __fastcall TForm1::ModelClick(TObject *Sender) { //设置存储过程的输入参数
ADOStoredProc1->Parameters->ParamByName(\alue = Model->Text; Result->Clear(); //清空编辑框内显示的上一次的结果 if (Model->Text == \ //如果用户选择的是\型号
ShowMessage(\型号%意味着求所有型号的V带断面积平均值。\ //显示一条消息 }
“求断面积”按钮(Cal)的单击(Click)事件过程 void __fastcall TForm1::CalClick(TObject *Sender)
{ //如果用户没有选择任何型号,则以选择了\对待
if(Model->Text == \alue=\ ADOStoredProc1->ExecProc(); //调用存储过程
Result->Text = ADOStoredProc1->Parameters->ParamByName(\Area\alue; //取输出参数
//并将结果(输出参数)显示在编辑框内
}
(6) 保存程序文件并做程序测试
点击C++Builder主工具栏上的“Save All”按钮,保存所有程序文件。
点击C++Builder主工具栏上的Run按钮 ,运行程序。
从数据查表组合框中随意选择一种V带型号,点击“求断面积”按钮,则编辑框对象中将显示相应型号的V带断面积;若选择\型号,则所求结果是各种型号V带的平均断面积。
如果程序运行时,用户从数据查表组合框中选择一种V带型号后,程序提示如图 19所示的错误,表示找不到存储过程中的“@model”参数(parameter),实际上是无法确定参数的类型,则可按以下步骤解决此问题:首先中止程序运行:拉开C++Builder的“Run”菜单,选择“Program Reset”菜单项。然后,选中存储过程ADOStoredProc1,在属性面板中找到“Parameters”属性,点击其右边的按钮,会再现如图 20所示的“Editing ADOStoredProc1->Parameters”对话框。在对话框中选中“@model”参数行,在属性面板上按照图 21设置Value/Type属性即可。
图 19 程序运行时出现的提示错误
图 20 “Editing ADOStoredProc1->Parameters” 对话框
图 21 设置“@model”参数的“Value/Type”属性