C++如何连接云数据库

佬站里好像没见到C++项目,我忍不了 毕竟C++是全世界最好的语言

我们假设佬站用上了云数据库,然而我的名字旁边居然没有五彩斑斓金光闪闪的盾牌,于是我在我的电脑上直连佬库,将false改成了true<狗头>,再次差评佬站表情包里没有狗头!并且新增一个狗头表情包

花点钱搞个腾讯云数据库

当然相对于VS我还是喜欢QT,能让大多数人喜欢用的东西肯定不是什么好东西

我真的一上班就闲了下来我爱上班

下面正文吧

新建QT工程不多说
在.pro文件中加入
QT += network
在.h文件中加入头文件

#include <QTimer>
#include <QtNetwork>

腾讯微信小程序开发文档中对获取小程序全局唯一后台接口调用凭据(access_token)的描述为

请求地址

GET https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET
属性 类型 说明
grant_type string 只能填client_credential
appid string 小程序唯一凭证,即 AppID,可在「微信公众平台 - 开发管理 - 开发设置」页中获得。
secret string 小程序唯一凭证密钥,即 AppSecret,获取方式同 appid(第一次使用一定要重置!注意不是登录密码,就是AppSecret)

使用微信公众平台接口调试工具调试显示成功即可。

属性 类型 说明
access_token string 获取到的凭证
expires_in number 凭证有效时间,单位:秒。目前是7200秒一次。
errcode number 错误码
errmsg string 错误信息

因为需要http访问,我们使用QNetworkAccessManager完成访问数据操作的控制。
在.h中定义

signals:
    bool managerLoaded(bool);

private slots:
    void initial();
    void getAccess_token();
    void slotGetAccess_token();
    QString getAccess_Token();
    void managerLoad(QString account,QString pw);
    QString slotManagerLoad();
    QJsonObject getManagerInfo();
    void on_select_clicked();
    void on_initial_clicked();
    void getNetImage(QString imageName, QString imageUrl);
    void slotGetImage(QNetworkReply* r);
    void imageLoaded(QPixmap pixmap, QString imageName);
private:
    QNetworkAccessManager *manager;
    QNetworkRequest *request;//网络请求的URL,Header参数等信息
    QNetworkReply  *reply;//获知网络操作中的各种状态。当QNetworkReply发出readyRead()信号后,获取应答对象中的数据。
    QTimer *timer = new QTimer(this);//自动获取最新凭证
    QString Access_Token;//调用凭证
    int Access_Token_expries;//剩余凭证有效时间
    QJsonObject managerObject;//由于小程序的云数据库中数据为JSON数据包,因此使用QJsonDocument来对获取的数据进行处理
void MainWindow::initial()
{
    manager = new QNetworkAccessManager(this);
    request = new QNetworkRequest();
    getAccess_token();
    connect(timer, SIGNAL(timeout()), this, SLOT(getAccess_token()));
    timer->start(Access_Token_expries);
}
void MainWindow::getAccess_token()
{
    request->setUrl(QUrl(tr("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=%1&secret=%2").arg(appid,secret)));//appid,secret参数为小程序AppID,AppSecret
    request->setHeader(QNetworkRequest::ContentTypeHeader,"application/json; encoding=utf-8");
    reply = manager->get(*request);
    connect(reply,SIGNAL(readyRead()),this,SLOT(slotGetAccess_token()));
}
 
void MainWindow::slotGetAccess_token()
{
    QByteArray ba = reply->readAll();
    QJsonDocument js = QJsonDocument::fromJson(ba);
    Access_Token = js["access_token"].toString();
    Access_Token_expries = js["expires_in"].toInt()-200;//为了提前更新凭证,提前200S
    timer->setInterval(Access_Token_expries*1000);
}
 
QString MainWindow::getAccess_Token()
{
    return Access_Token;//返回获取到的Access_Token值
}

腾讯微信小程序开发文档中对数据库查询记录描述为:
请求地址

POST https://api.weixin.qq.com/tcb/databasequery?access_token=ACCESS_TOKEN
属性 类型 说明
access_token string 接口调用凭证
env string 云环境ID
query string 数据库操作语句

因为需要POST发送数据,我们使用QNetworkAccessManager完成访问数据操作的控制。使用QJsonObject处理需要发送的data数据(JSON)。

void MainWindow::managerLoad(QString account,QString pw)
{
        request->setUrl(QUrl(tr("https://api.weixin.qq.com/tcb/databasequery?access_token=%1").arg(Access_Token)));
        QString query = tr("db.collection('login').where({_id: '%1',password: '%2'}).get()").arg(account,pw);//login为查询的数据集,_id和password为数据集字段,此行会获取符合条件的整个数据集
        QString env = "cloud1";//env为自己小程序云数据库的云环境ID,可在云开发控制台中找到
        QJsonObject obj
        {
            {"query",query},//query为微信小程序云数据库的查询语句,云数据库介绍可查看微信官方文档中的介绍。
            {"env",env}
        };
        QByteArray objBy = QJsonDocument(obj).toJson();//将JSON对象obj用QJsonDocument转为QByteArray字节数组,当QNetworkReply发出readyRead()信号后,获取应答对象中的数据。
        reply = manager->post(*request,objBy);
        connect(reply,SIGNAL(readyRead()),this,SLOT(slotManagerLoad()));
}

void MainWindow::slotManagerLoad()
{
    QByteArray ba = reply->readAll();
    QJsonDocument js = QJsonDocument::fromJson(ba);
    int totalInt = js["pager"].toObject()["Total"].toInt();
    QJsonValue dataValue = js["data"].toArray().first();
    qDebug()<<dataValue;
    QString dataStr = dataValue.toString();//读取到的数据
    managerObject = QJsonDocument::fromJson(dataStr.toUtf8()).object();//data数据转为Object
    if(totalInt != 0)
    {
        emit managerLoaded(true);
    }else
    {
        emit managerLoaded(false);
    }
}
 
QJsonObject MainWindow::getManagerInfo()
{//返回从服务器中获得的数据库内容
    return managerObject;
}

查询到的表单如下所示,做用find函数和substr函数做字符解析即可(或者使用正则匹配方法更合适):
image

更新数据:
只需要修改url地址,使用update语句,获取记录id即可,其余不变

request->setUrl(QUrl(tr("https://api.weixin.qq.com/tcb/databaseupdate?access_token=%1").arg(Access_Token)));
QString isok = tr("db.collection('Entrust').doc('%1').update({"
                        "data: {"
                          "'publish': true"
                        "},"
                      "})").arg(id);
2 Likes

好帖!社区有你更精彩

没看懂你在搞么子,C++太难了

好像腾讯云除了视频和游戏,其他业务还真没腾讯云的份额

image
你能忍?

Qt是Qt,Cpp是Cpp

1 Like

https://linux.do/faq

当然可以

不懂

8 Likes

C++是全世界最好的语言

Mark

53 Likes

From 软件开发 to 开发调优

1 Like