C++连接SQLserver

自学C++连接SQL server ,在进行select时输出的时间是乱码,有人知道是什么原因吗?
还有一个问题,就是我对数据库进行update的时候总是显示更新失败,看了很久都找不到原因

img

img

img

#undef UNICODE
#undef _UNICODE
#include<Windows.h>
#include  
#include  
#include
#include 
#include<string>
#include 
using namespace std;

//定义全局变量
SQLRETURN ret = NULL;//返回信息
SQLHENV henv = NULL;//环境句柄
SQLHDBC hdbc = NULL;//连接句柄
SQLHSTMT hstmt = NULL;//语句句柄

//释放空间
void free()
{
    SQLFreeHandle(SQL_HANDLE_STMT, hstmt);//释放语句
    SQLFreeHandle(SQL_HANDLE_DBC, hdbc);//释放连接
    SQLFreeHandle(SQL_HANDLE_ENV, henv);//释放环境
}

//连接数据库
void connect()//数据库连接函数
{
    SQLAllocHandle(SQL_HANDLE_ENV, NULL, &henv);//申请环境
    SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, SQL_IS_INTEGER);//设置环境
    SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);//申请数据库连接
    ret = SQLConnect(hdbc, (SQLTCHAR*)("Csql"), SQL_NTS, (SQLTCHAR*)("sa"), SQL_NTS, (SQLTCHAR*)("sa"), SQL_NTS);
    if ((ret == SQL_SUCCESS) || (ret == SQL_SUCCESS_WITH_INFO))
    {
        cout << "数据库连接成功!" << endl;
    }
    else
    {
        cout << "数据库连接失败!" << endl;
    }
}



//更新收入表记录--有问题“无法更新数据”
void update_income_money()
{
    cout << "请输入需要修改的记录编号;" << endl;
    //string in_no;
    //cin >> in_no;
   string in_money;
    cout << "请输入需要修改的金额:" << endl;
    cin >> in_money;
        ret = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);//申请句柄
        string str1 = "use money";
        string str2 = "update income set income_money = ' where income_no= 2";
       /* cout << "请输入需要修改的记录编号;" << endl;
        string in_no;
        cin >> in_no;
        string in_money;
        cout << "请输入需要修改的金额:" << endl;
        cin >> in_money;*/
        string str3 = str2 + in_money + "',";//+ in_no + "'";
        ret = SQLExecDirect(hstmt, (SQLCHAR*)str1.c_str(), SQL_NTS);
        ret = SQLExecDirect(hstmt, (SQLCHAR*)str2.c_str(), SQL_NTS);
        if (ret == SQL_SUCCESS || ret == SQL_SUCCESS_WITH_INFO)
            cout << "更新记录成功!" << endl;
        else
            cout << "更新记录失败!" << endl;
    free();
}

//查找收入表记录
void select_income()
{
    ret = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);//申请句柄
    string str1 = "use money";
    string str2 = "select income_no,income_description,income_money, CONVERT(varchar,GETDATE(),23) from income where income_no='";
    cout << "请输入需要查找的记录编号:" << endl;
    string in_no;
    cin >> in_no;
    string str3 = str2 + in_no + "'";
    ret = SQLExecDirect(hstmt, (SQLCHAR*)str1.c_str(), SQL_NTS);
    ret = SQLExecDirect(hstmt, (SQLCHAR*)str3.c_str(), SQL_NTS);
    if (ret == SQL_SUCCESS || ret == SQL_SUCCESS_WITH_INFO)
    {
        SQLCHAR str1[10], str2[12], str3[10],str4[15];//用来存放从数据库获取的列信息,你有几列就定义几个变量
        SQLLEN len_str1, len_str2, len_str3,len_str4;//字符串对应长度,你有几列就定义几个变量
        //printf("%s\t%s\t%s\n", "书籍编号", "书籍名称", "数量");
        cout << "编号" << "     " << "描述" << "     " << "金额" << "     " <<"时间" << endl;
        while (SQLFetch(hstmt) != SQL_NO_DATA)
        {
            //你有几列就调用几次SQLGetData函数,注意找规律哦
            SQLGetData(hstmt, 1, SQL_C_CHAR, str1, 10, &len_str1);   //获取第一列数据
            SQLGetData(hstmt, 2, SQL_C_CHAR, str2, 12, &len_str2);   //获取第二列数据
            SQLGetData(hstmt, 3, SQL_C_CHAR, str3, 10, &len_str3);  
            SQLGetData(hstmt, 3, SQL_C_CHAR, str4, 15, &len_str4); //获取第三列数据
            printf("%s\t%s\t%s\t%s\n", str1, str2, str3,str4);
        }
    }
    free();
}


int main()
{
    connect();
    update_income_money();
    select_income();
    return 0;
}

用memset将 SQLCHAR str1[10], str2[12], str3[10],str4[15]先填个0