关于#MFC#数据库工程#的问题,如何解决?

这是用VS2019 MFC写的一个MySQL数据库程序,C++语言写的
在这个函数中,实现教师开设课程操作,代码如下,但是无论开设什么都是失败,请问该如何改?
代码:

void TCHON::OnBnClickedButtonKaishe()
{
    // TODO: 在此添加控件通知处理程序代码
    USES_CONVERSION;
    kehao.GetWindowTextW(strkehao);
    keming.GetWindowTextW(strkeming);
    xuefen.GetWindowTextW(strxuefen);
    //if(!strkehao)MessageBox(TEXT("开设课程失败!"));
    double flxuefen = atof(T2A(strxuefen.GetBuffer(0)));
    CString query;
    query.Format(_T("开设课程('%s','%s',%f,'%s');"), strkehao,strkeming,flxuefen,strnum);
    char* charquery = T2A(query.GetBuffer(0));
    query.ReleaseBuffer();
    if (mysql_query(&m_sqlCon, charquery))//如果函数执行成功则返回0,不成功就进入if语句
    {
        CString error; 
        error = mysql_sqlstate(&m_sqlCon);
        if (error == "09000")
        {
            CString errormsg;
            errormsg = mysql_error(&m_sqlCon);
            MessageBox(errormsg);
        }
        else
        MessageBox(TEXT("开设课程失败!"));
        return;
    }

    query.Format(_T("select * from 课程 where 课号 in (select 课号 from 教授 natural join 教师 where 教师编号=%s);"), strnum);
    charquery = T2A(query.GetBuffer(0));
    query.ReleaseBuffer();
    mysql_query(&m_sqlCon, charquery);
    MYSQL_RES* m_res = mysql_store_result(&m_sqlCon);
    if (mysql_num_rows(m_res) != 0)
    {
        UpdateList(m_res);
    }
    else MessageBox(L"未开设课程!");
}


失败截图:

img

表的结构:

img

img

看情况应该是你的sql有问题,建议先在数据库中执行无误后,再放入代码调试。

本次回答借鉴GPT
根据代码和您的描述,开设课程失败的原因可能有:

  1. SQL语句错误。double类型变量strxuefen在SQL语句中需要使用%f格式化,但是代码中使用的是%f,可能导致SQL错误。
  2. 没有对SQL语句和查询结果进行错误检查。如果SQL执行失败或查询结果为空,需要及时捕获异常并作出提示。
  3. 连接数据库失败。如果MySQL连接没有成功建立,后续SQL语句会执行失败,需要先检查数据库连接状态。所以,我的建议如下:
  4. 修改SQL语句中double变量格式化为%f,例如:
query.Format(_T("开设课程('%s','%s',%f,'%s');"), strkehao,strkeming,strxuefen,strnum);
  1. 增加SQL执行结果检查,如果失败或没有查询到数据则作出相应提示,例如:
if (mysql_query(&m_sqlCon, charquery)) {
    // SQL执行失败,作出提示
}

MYSQL_RES* m_res = mysql_store_result(&m_sqlCon);
if (!m_res || mysql_num_rows(m_res) == 0) {
    // 查无数据,作出提示 
}
  1. 在程序开始检查MySQL连接状态,如果未连接则先建立连接,例如:
MYSQL* m_sqlCon = mysql_init(NULL);
if (!mysql_real_connect(m_sqlCon, "host", "user", "password", "db_name", 3306, NULL, 0)) {
    // 连接失败,作出提示
} 
  1. 最后,在开发工具中设置断点,调试程序至SQL语句处,检查变量的值和SQL语句是否正确,以定位具体问题。

首先,需要确定开设课程失败的具体原因。可以在if语句中加入一些调试信息,比如输出SQL语句和错误信息,以便更好地定位问题。例如:

if (mysql_query(&m_sqlCon, charquery))
{
    CString error;
    error = mysql_sqlstate(&m_sqlCon);
    if (error == "09000")
    {
        CString errormsg;
        errormsg = mysql_error(&m_sqlCon);
        CString debugmsg;
        debugmsg.Format(_T("开设课程失败:SQL语句:%s,错误信息:%s"), query, errormsg);
        MessageBox(debugmsg);
    }
    else
    {
        CString debugmsg;
        debugmsg.Format(_T("开设课程失败:SQL语句:%s"), query);
        MessageBox(debugmsg);
    }
    return;
}

然后,如果发现SQL语句有问题,可以尝试修改SQL语句。根据MySQL的文档,开设课程应该使用INSERT语句,而不是使用名为“开设课程”的函数。应该将第10行的代码修改为:

Copy
query.Format(_T("insert into 课程(课号, 课名, 学分) values('%s','%s',%f);"), strkehao,strkeming,flxuefen);
这样就可以将课程信息插入到课程表中了。另外,需要确认在此之前已经成功连接到了MySQL数据库,并且已经选择了正确的数据库。最后,还需要注意输入的课号、课名和学分是否符合数据库中定义的数据类型和约束,否则也会导致插入失败。

字符集转换