C语言嵌入SQL语言编程,语句执行到#sql3 = strcat((char *)sql2,str2)#无法再执行下去
//教师查看自己所教课程的学生和成绩;
int search1()
{
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*)"stu",SQL_NTS,(SQLCHAR*)"sa",SQL_NTS,(SQLCHAR*)"123456",SQL_NTS);
/*第2个参数为配置的ODBC数据源名称,这里根据自己的配置进行修改*/
if(!(ret==SQL_SUCCESS || ret==SQL_SUCCESS_WITH_INFO))
{
printf("连接数据库失败!");
return -1;
}
int ch;
char *cname;
printf("请输入你要查看的课程名称:\n") ;
scanf("%s",&cname);
ret=SQLAllocHandle(SQL_HANDLE_STMT,hdbc,&hstmt); /*执行sql语句*/
SQLCHAR sql1[]="use student2022";
SQLCHAR sql2[]="SELECT Reports.Sno,Grade FROM Reports LEFT JOIN Courses ON Reports.Cno=Courses.Cno WHERE Courses.Cname=";
SQLCHAR str1[]=" ORDER BY Grade DESC,Sno";
char *sql3;
char *str2="'";
printf("text\n"); /*无法执行以下代码*/
sql3 = strcat((char *)sql2,str2);
sql3 = strcat(sql3,cname);
sql3 = strcat(sql3,str2);
sql3 = strcat(sql3,(char *)str1);
printf("%s\n",sql3);
ret=SQLExecDirect(hstmt,sql1,SQL_NTS);
ret=SQLExecDirect(hstmt,(SQLCHAR *)sql3,SQL_NTS);
printf("这学期该门课程的所有学生成绩:\n");
printf("学生学号\t\t\t课程名称\t\t\t\t成绩\n");
if(ret==SQL_SUCCESS || ret==SQL_SUCCESS_WITH_INFO)
{
SQLCHAR str1[50],str2[50],str3[50];//str5[50],str6[50];
SQLINTEGER len_str1, len_str2, len_str3;
while(SQLFetch(hstmt)!=SQL_NO_DATA)
{
SQLGetData(hstmt,1,SQL_C_CHAR,str1,50,&len_str1); //获取第一列数据
SQLGetData(hstmt,2,SQL_C_CHAR,str2,50,&len_str2);
SQLGetData(hstmt,3,SQL_C_CHAR,str3,50,&len_str3);
//SQLGetData(hstmt,4,SQL_C_CHAR,str4,50,&len_str4);
//SQLGetData(hstmt,5,SQL_C_CHAR,str5,50,&len_str5);
//SQLGetData(hstmt,6,SQL_C_CHAR,str6,50,&len_str6);
printf("%s \t\t%s %s\n", str1, str2,str3);//,str4);//, str5);
}
}
SQLFreeHandle(SQL_HANDLE_DBC,hdbc);//释放连接句柄
SQLFreeHandle(SQL_HANDLE_ENV,henv);//释放环境句柄
return 0;
}
请输入你要查看的课程名称:
数据结构
text
Process exited after 8.11 seconds with return value 3221225477
请按任意键继续. . .
sql2数组大小不够用