VC6.0通过ODBC连接MYSQL数据库实例

问题:通过访问学生课程数据库中的表,设计数据库中函数,并编写嵌入式程序,完成下面功能:
    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匹配的课程信息。请确保您的数据库表结构和数据与查询语句相匹配。

此外,请注意您的代码中存在一些问题:

  1. 在获取查询结果时,您需要在循环中打印每一行的数据。
  2. 您可以在使用完查询语句后使用SQLFreeHandle函数释放语句句柄(hstmt)。

希望这能帮助您查询特定的行。如果您有其他问题,请随时提问。

可以查看这篇:
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#更简单