Proc编程实验
一、 实验内容
1)在数据库中创建三个表:学生S、课程C、s成绩SC。
2)使用pro*C编写程序,完成对数据库的操作,并按照相应格式输出,格式如下:
3)使用Pro*C编写程序, 完成对数据库的操作, 并按相应格式输出,格式范例如下:
二、 实验过程
1) 创建的S表:
图1:S表数据信息
创建的C表:
图2:创建的C表信息
创建的SC表:
图3:创建SC表信息
2) 使用proc编写程序:
首先使用rdbms中能够预编译该.pc文件的可执行程序。从该可执行程序预编译该 .pc文件。
也可直接在cmd中输入proc 文件名进行编译
图4:proc编写.pc文件
3)运行编译后.c文件
直接使用vs经行编译会出现报错。需要调下vs的配置参数,如下:
右键点击项目->属性->vc++目录->包含目录中添加头文件目录: oracle\product\11.1.0\client_1\precomp\public
库目录中添加.lib目录:
oracle\product\11.1.0\client_1\precomp\LIB
oracle\product\11.1.0\client_1\RDBMS\XA
oracle\product\11.1.0\client_1\oci\lib\msvc
oracle\product\11.1.0\client_1\precomp\LIB\msvc
右键点击项目->属性->配置属性->链接器->输入->附加依赖项添加.lib文件:
orasql11.lib;oraxa11.lib;oci.lib;orasqx11.lib
修该参数后,运行依然会报错,显示代码中的类和C中的类冲突,我们则需要提前预编译,预编译代码如下:
下面展示一些 内联代码片
。
#ifdef __cplusplus
extern "C"
{
#endif
int yyparse(void);
void sqliem(unsigned char*, signed int*);
void sqlcxt(void**, unsigned int*,
struct sqlexd*, const struct sqlcxp*);
//。。。各种需要的函数声明
#ifdef __cplusplus
}
#endif
4)修改.pc文件
void sql_error();//报错函数
void FindDept();//查找系学生信息
void FindName();//查找学生信息
int main()
{
exec sql include sqlca;
exec sql begin declare section;
char user_name[20];
char user_pwd[20];
char db_name[20];
char ip[20];
char port[20];
char url[100];
int i;
char s_no[6];
char s_name[10];
char s_sex[4];
int s_age;
int var_age;
char dept[5];
int choice;
exec sql end declare section;
exec sql whenever SQLERROR do sql_error();
printf("\n\n\b 欢迎登录学生年龄查询功能\n\n");
printf("\b\b IP地址:"); gets_s(ip);
printf("\b\b Port号:");gets_s(port);
printf("\b\b 数据库服务器名称:");gets_s(db_name);
printf("\b\b 用户名:"); gets_s(user_name);
printf("\b\b 密码:");gets_s(user_pwd);
strcpy_s(url,ip);
strcat_s(url,":");
strcat_s(url,port);
strcat_s(url,"/");
strcat_s(url,db_name);
exec sql connect :user_name
identified by :user_pwd using :url;
printf("\n\n 用户:%s 密码:%s,哈哈,登陆成功.\n",user_name,user_pwd);
system("pause");
while(1)
{
system("cls");
cout << "请输入选项:" << endl;
cout << "1.查询某系的学生" << endl;
cout << "2.查询某学生的课程成绩" << endl;
cout << "3.退出系统" << endl;
cin >> choice;
switch (choice)
{
case 1:
FindDept();
break;
case 2:
FindName();
break;
case 3:
break;
}
if(choice == 3) break;
}
system("pause")
exec sql commit release;
return 0;
}
void FindDept()
{
exec sql include sqlca;
exec sql begin declare section;
char s_no[6];
char s_name[10];
char s_sex[4];
int s_age;
char dept[5];
exec sql end declare section;
int i = 0;
system("cls");
cout << "请输入查找系别名称:";
cin >> dept;
exec sql declare sx1 cursor for
select sno, sname, sex, age from s where s.dept = :dept;
exec sql open sx1;
system("cls");
cout << "\n\t\t" << dept << "系的学生信息为" << endl;
cout << "\n\t---------------------------------------------";
cout << "\n\t序号\t学号\t姓名\t\t性别\t年龄" << endl;
cout << "\n\t---------------------------------------------";
while (1)
{
exec sql fetch sx1 into : s_no, : s_name, : s_sex, : s_age;
if (sqlca.sqlcode != 0) break;
i++;
printf("\n\t %d\t%s\t%s\t%s\t%d", i, s_no, s_name, s_sex, s_age);
}
exec sql close sx1;
}
void FindName()
{
int i = 0;
int sum = 0;
exec sql include sqlca;
exec sql begin declare section;
char s_no[6];
char s_name[10];
char s_sex[4];
char c_name[10];
int grade;
int s_age;
char name[10];
exec sql end declare section;
system("cls");
cout << "请输入查找学生的姓名:";
cin >> name;
exec sql declare sx2 cursor for
select c.cname, sc.grade from s, c, sc where c.cno = sc.cno and s.sno = sc.sno and s.sname = :name;
exec sql open sx2;
system("cls");
cout << "\n\t\t" << name << "学生信息为" << endl;
cout << "\n\t---------------------------------------------";
cout << "\n\t序号\t课程号\t成绩" << endl;
cout << "\n\t---------------------------------------------";
while (1)
{
exec sql fetch sx2 into : c_name, : grade;
if (sqlca.sqlcode != 0) break;
i++;
sum += grade;
printf("\n\t %d\t%s\t%d", i, c_name, grade);
}
if (i != 0)
{
cout << "平均成绩:" << sum / i << endl;
}
exec sql close sx2;
}
void sql_error()
{
printf("SQL语句错误:错误代号:%d 错误描述:%s\n",sqlca.sqlcode,sqlca.sqlerrm.sqlerrmc);
system("pause");
exit(0);
}
#endif
三、 实验结果
1) 登录用户:
图5:登录用户
2) 查询系学生信息:
3) 查询某个学生的信息:
图 7:文章学生的信息
四、 实验总结
通过上机编程,了解如何使用proc预编译.pc文件,通过网上查询学习,了解如何使用vs编译预编译后的c程序,了解处理函数冲突的处理方法。
----本问章用于记录博主数据库学习,转载请注明来处!