问题:通过访问学生课程数据库中的表,设计数据库中函数,并编写嵌入式程序,完成下面功能:
1) 查询某一门课程的信息。要查询的课程由用户在程序运行过程中指定,放在主变量中。
2) 查询选修某一门课程的选课信息,要查询的课程号由用户在程序运行过程中指定,放在主变量中,然后根据用户的要求修改其中某些记录的成绩字段。
我是用VC6.0通过ODBC连接MYSQL数据库
#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
#include<sql.h>
#include <sqlext.h>
#include<sqltypes.h>
int main()
{
SQLRETURN ret;
SQLHENV henv;
SQLHDBC hdbc;
SQLHSTMT hstmt;
SQLCHAR str1[20],str2[20];
SQLINTEGER len_str1,len_str2;
char str3;
printf("请输入所要查询课程的课程id:");
scanf("%s",&str3);
ret=SQLAllocHandle(SQL_HANDLE_ENV,NULL,&henv);//申请环境句柄
ret=SQLSetEnvAttr(henv,SQL_ATTR_ODBC_VERSION,(SQLPOINTER)SQL_OV_ODBC3,SQL_IS_INTEGER);
ret=SQLAllocHandle(SQL_HANDLE_DBC,henv,&hdbc);//申请数据库连接句柄
ret=SQLConnect(hdbc,(SQLCHAR*)"test5",SQL_NTS,(SQLCHAR*)"sa",SQL_NTS,(SQLCHAR*)"MSsql123",SQL_NTS);
if(!(ret==SQL_SUCCESS || ret==SQL_SUCCESS_WITH_INFO))
{
return -1;
}
ret=SQLAllocHandle(SQL_HANDLE_STMT,hdbc,&hstmt);
SQLCHAR sql1[]="use test5";
SQLCHAR sql2[]="select c_id,c_name from test5.dbo.Course";
ret=SQLExecDirect(hstmt,sql1,SQL_NTS);
ret=SQLExecDirect(hstmt,sql2,SQL_NTS);
if(ret==SQL_SUCCESS||ret==SQL_SUCCESS_WITH_INFO)
{
printf("c_id\tc_name\n");
while(SQLFetch(hstmt)!=SQL_NO_DATA)
{
SQLGetData(hstmt,1,SQL_C_CHAR,str1,20,&len_str1); //获取第一列数据
SQLGetData(hstmt,2,SQL_C_CHAR,str2,20,&len_str2);
}
}
SQLFreeHandle(SQL_HANDLE_DBC,hdbc);//释放连接句柄
SQLFreeHandle(SQL_HANDLE_ENV,henv);//释放环境句柄
return 0;
}
我不知道怎么用这个查询特定的行,求解,谢谢
要查询特定的行,您可以在SQL查询语句中使用WHERE子句来指定查询条件。在您的代码中,您可以修改以下部分来查询特定的行:
SQLCHAR sql2[100];
sprintf((char*)sql2, "select c_id, c_name from test5.dbo.Course where c_id = '%c'", str3);
ret = SQLExecDirect(hstmt, sql2, SQL_NTS);
在这个示例中,我使用sprintf函数构建了一个带有WHERE子句的查询语句。它将根据用户输入的课程id(str3)查询相应的课程信息。
请注意,这里假设课程id(c_id)是一个字符类型的字段。如果课程id是一个整数类型的字段,您可以使用%d作为格式化字符串,如:
sprintf((char*)sql2, "select c_id, c_name from test5.dbo.Course where c_id = %d", str3);
答案参考Chatgpt解答
修改代码后,它将只返回与用户指定课程id匹配的课程信息。请确保您的数据库表结构和数据与查询语句相匹配。
此外,请注意您的代码中存在一些问题:
希望这能帮助您查询特定的行。如果您有其他问题,请随时提问。
可以查看这篇:
https://blog.csdn.net/weixin_43739821/article/details/116862379
//Wirten By Tanxin-ouc
EXEC SQL BEGIN DECLARE SECTION;//主变量说明开始
char Hsno[64];
char Hcno[64];
int Hgrade;
int NEWGRADE;
EXEC SQL END DECLARE SECTION;//主变量说明结束
long SQLCODE;
EXEC SQL INCLUDE sqlca;//定义SQL通信区
int main(void)
{
int count = 0;
char yn; //变量yn代表yes或no
printf("Please input the calss number:");
scanf("%s", &classno);
EXEC SQL CONNECT TO TEST@ localhost:54321 USER "SYSTEM" / "MANAGER";//链接数据库TEST
EXEC SQL DECLARE SX CURSOR FOR//定义游标SX
SELECT Sno, Cno, Grade
FROM SC
WHERE Cno = :classno;
EXEC SQL OPEN SX;
for (;;)
{
EXEC SQL FETCH SX INTO : HSno, : Hcno, : Hgrade;
if (sqlca.sqlcode != 0)
break;
if (count++ == 0)
printf("\n%-10s%-20s%-10s\n", "Sno", "Cno", "Grade");
printf("%-10s%-20s%-10d\n", HSno, Hcno, Hgrade);
printf("UPDATE GRADE(y/n)?");
do {
scanf("%c", &yn);
} while (yn != 'N' && yn != 'n' && yn != 'Y' && yn != 'y');
if (yn == 'y' || yn == 'Y')
{
printf("INPUT NEW GRADE:");
scanf("%d", &NEWGRADE);
EXEC SQL UPDATE SC//嵌入式SQL更新语句
SET Grade = :NEWGRADE
WHERE CURRENT OF SX;
}
}
EXEC SQL CLOSE SX;//关闭游标SX
EXEC SQL COMMIT WORK;//提交更新
EXEC SQL DISCONNECT TEST;//断开数据库连接
}
写出来了,大家别用这个方法,C#更简单