C++中向sqlite3数据库输入信息的问题

问题描述 投票:0回答:1

这是我的代码

#include <iostream>
#include <sqlite3.h>
#include <string>
#include <locale>
#include <codecvt>
#include <Windows.h>

using namespace std;

void CreateTable(int open, sqlite3* db, char* ERR)
{
    cout << "Создание таблицы: ";
    const char* SQLTable = "CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY AUTOINCREMENT, Name TEXT NOT NULL, Age INTEGER);";
    open = sqlite3_exec(db, SQLTable, 0, 0, &ERR);
    if (open)
    {
        cerr << RED << "ПРОВАЛ" << ERR << endl << RESET;
        sqlite3_free(ERR);
    }
    else
        cout << GREEN << "УСПЕХ" << RESET << endl;
}
void SetDB(sqlite3* db, const wstring& name, int age, sqlite3_stmt** stmt)
{
    const char* insertSQL = "INSERT INTO users (Name, Age) VALUES (?, ?)";
    if (sqlite3_prepare_v2(db, insertSQL, -1, stmt, nullptr) == SQLITE_OK)
    {
        // Используем sqlite3_bind_text16 для вставки wstring
        sqlite3_bind_text16(*stmt, 1, name.c_str(), -1, SQLITE_STATIC);
        sqlite3_bind_int(*stmt, 2, age);
        if (sqlite3_step(*stmt) != SQLITE_DONE)
            cerr << "Вставка данных: " << RED << "ПРОВАЛ" << endl << sqlite3_errmsg(db) << RESET;
        else
            cout << "Вставка данных: " << GREEN << "УСПЕХ" << endl << RESET;
    }
    else
    {
        cerr << "Подготовка запроса: " << RED << "ПРОВАЛ" << RESET << endl;
    }
    sqlite3_finalize(*stmt);
}

int main()
{
    SetConsoleCP(65001);
    SetConsoleOutputCP(65001);
    setlocale(LC_ALL, "ru");
    wstring name;
    int age;
    sqlite3_stmt* stmt = nullptr;
    sqlite3* db;
    char* ErrorMsg = 0;
    int open_db = sqlite3_open("test.db", &db);
    ERRORsql(open_db, db);
    CreateTable(open_db, db, ErrorMsg);
    cout << "Начните ввод для информации в бд" << endl <<
        "Для завершения работы пропишите //exit" << endl;
    while (true)
    {
        cout << "Имя: " << endl << ">> ";
        getline(wcin, name);
        if (name == L"//exit")
            break;
        cout << "Возраст (по желанию или же -)" << endl << ">> ";
        cin >> age;
        SetDB(db, name, age, &stmt);
    }
    cout << "До скорых встреч" << endl;
    sqlite3_close(db);
}

由于某种原因,当我尝试使用俄语在数据库中输入名称时,“名称”列只是空的(字面意思是空的),尽管在其他列中输入了信息。据我了解,这是编码的问题。然而,在尝试了目前我能做的一切之后,我没有成功。请不要批评太多,因为我刚刚开始学习C++,提前谢谢你! ^^

我更改了 Windows 控制台本身的编码并尝试使用 wstring;我通过 SetConsoleCP 设置了各种编码,但没有任何帮助。

c++ database sqlite types utf-8
1个回答
0
投票

我想我已经解决了我的问题,如果有人也有这样的问题,那么这就是我首先做的,我想如果我不运行.cpp文件本身,而是运行编译后的one.exe,那么整个俄语本例中的语言开始以 utf-8 编码编写并正确输入到数据库中。另外,为了正确输出到控制台,我在主函数中添加了以下代码

    setlocale(LC_ALL, "ru");
    SetConsoleCP(65001); 
    SetConsoleOutputCP(65001);

如果你遵循我的方法,一切都会正常,尽管我知道如果有其他解决方案,很可能有一些方法可以让 IDE 正常工作,我会很乐意倾听他们的意见,并感谢所有试图提供帮助的人

© www.soinside.com 2019 - 2024. All rights reserved.