void dati_suiji() //查询随机试题库的题目
{
char num;
Connect();
SQLPrepare(hstmt, (SQLCHAR*)("select * from 单项选项题标准化考试系统.dbo.随机试题库"), SQL_NTS);
ret = SQLExecute(hstmt);
if (ret == SQL_SUCCESS || ret == SQL_SUCCESS_WITH_INFO) {
SQLCHAR str1[50], str2[50], str3[50], str4[50], str5[50], str6[50];
SQLLEN len_str1, len_str2, len_str3, len_str4, len_str5, len_str6; 1;
cout << "题号" << " " << "题目" << " " << "a选项" << " " << "b选项" << " " << "c选项" << " " << "d选项" << endl;
string str7 = "use 单项选项题标准化答题系统";
string str8 = "update 随机试题库 set 用户答案=";
string str9 = " where 题号=";
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%s\t%s\t%s\t%s\t%s\n", str1, str2, str3, str4, str5, str6);
char* arr=(char*)str1;
cout << "请输入你的答案:";
cin >> num;
string str10 = str8 + "'" + num + "'" + str9 + "'" +arr + "'";
ret = SQLExecDirect(hstmt, (SQLCHAR*)str7.c_str(), SQL_NTS);
ret = SQLExecDirect(hstmt, (SQLCHAR*)str10.c_str(), SQL_NTS);
if (ret == SQL_SUCCESS || ret == SQL_SUCCESS_WITH_INFO)
cout << "插入成功!" << endl;
else
cout << "插入失败!" << endl;
}
}
free();
}
这个循环中的语句插入不进去,如果在while循环中加入连接就能插入成功,但是会一直循环第一个。这种问题如何解决。
参考GPT和自己的思路:根据你提供的代码,可能的问题是每次循环中都在执行Connect()函数并创建一个新的hstmt句柄,但没有关闭先前的句柄。因此,在将SQLExecDirect()函数添加到while循环之后,可能需要显式地关闭和清理之前的hstmt句柄。另外,每次循环创建一个新的SQL语句可能会导致性能问题,因此最好在循环之前创建SQL语句,并在每个循环中仅更新变量。
以下是修改后的代码(请注意仅供参考,可能需要进行其他修改以适应特定的数据库和ODBC驱动程序):
void dati_suiji() //查询随机试题库的题目
{
char num;
Connect();
SQLPrepare(hstmt, (SQLCHAR*)("select * from 单项选项题标准化考试系统.dbo.随机试题库"), SQL_NTS);
ret = SQLExecute(hstmt);
if (ret == SQL_SUCCESS || ret == SQL_SUCCESS_WITH_INFO) {
SQLCHAR str1[50], str2[50], str3[50], str4[50], str5[50], str6[50];
SQLLEN len_str1, len_str2, len_str3, len_str4, len_str5, len_str6; 1;
cout << "题号" << " " << "题目" << " " << "a选项" << " " << "b选项" << " " << "c选项" << " " << "d选项" << endl;
// 创建SQL语句
string strSQL = "update 随机试题库 set 用户答案=? where 题号=?";
SQLCHAR* pSQL = (SQLCHAR*)strSQL.c_str();
SQLLEN cbSQL = strlen((char*)pSQL);
// 绑定参数
SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, 1, 0, &num, 0, NULL);
SQLBindParameter(hstmt, 2, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, 50, 0, str1, 0, &len_str1);
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%s\t%s\t%s\t%s\t%s\n", str1, str2, str3, str4, str5, str6);
num = 'a'; // 这里是为了演示,实际应该根据输入的答案更新num的值
// 执行SQL语句
ret = SQLPrepare(hstmt, pSQL, cbSQL);
ret = SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, 1, 0, &num, 0, NULL);
ret = SQLBindParameter(hstmt, 2, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, 50, 0, str1, 0, &len_str1);
ret = SQLExecDirect(hstmt, pSQL, cbSQL);
if (ret == SQL_SUCCESS || ret == SQL_SUCCESS_WITH_INFO)
cout << "插入成功!" << endl;
else
cout << "插入失败!" << endl;
}
}
free();
}