Gee. 2023-03-28 23:01 采纳率: 53.3%
浏览 10
已结题

C++连接SQLserver

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

img

img

img

#undef UNICODE
#undef _UNICODE
#include<Windows.h>
#include <sql.h> 
#include <sqlext.h> 
#include<sqltypes.h>
#include <iostream>
#include<string>
#include <iomanip>
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;
}

  • 写回答

1条回答 默认 最新

  • threenewbee 2023-03-28 23:14
    关注

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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 4月6日
  • 已采纳回答 3月29日
  • 创建了问题 3月28日

悬赏问题

  • ¥20 机器学习能否像多层线性模型一样处理嵌套数据
  • ¥20 西门子S7-Graph,S7-300,梯形图
  • ¥50 用易语言http 访问不了网页
  • ¥50 safari浏览器fetch提交数据后数据丢失问题
  • ¥15 matlab不知道怎么改,求解答!!
  • ¥15 永磁直线电机的电流环pi调不出来
  • ¥15 用stata实现聚类的代码
  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效