2.关于QT中数据库操作,简单数据库连接操作,数据库的增删改查,QSqlTableModel和QTableView,事务操作,关于QItemDelegate 代理

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介:  Linux下的qt安装,命令时:sudoapt-get install qt-sdk 安装mysql数据库,安装方法参考博客:http://blog.csdn.net/tototuzuoquan/article/details/39565783 如果行想进数据库开发,需要安装libqt5sql5-mysql.命令是: sudo apt-g

  1. Linux下的qt安装,命令时:sudoapt-get install qt-sdk

  2. 安装mysql数据库,安装方法参考博客:http://blog.csdn.net/tototuzuoquan/article/details/39565783

  3. 如果行想进数据库开发,需要安装libqt5sql5-mysql.命令是:

sudo apt-get install libqt5sql5-mysql

4 创建一个项目

要调用数据库,需要加上QT += gui widgets sql  也就是说要加上sql

注意如果是在windows平台下:要将C:/MySQL/bin目录下的libmySQL.dll拷贝到项目编译后的生成的exe文件所在的同级目录下(比如目录E:\QT\build-Database01-Desktop_Qt_5_3_MinGW_32bit-Debug\debug下,在此目录下有Database01.exe)。比如截图:

A 如果是在Linux目录下,输入以下命令:mysql-u root -p123456

创建数据库:

B使用数据库d0718,并创建所需的数据库表

表内容如下:

CREATE TABLE `tcontact` (

 `username` varchar(32) NOT NULL,

 `mobile` varchar(16) NOT NULL,

 `mobile2` varchar(16) NOT NULL,

 `telephone` varchar(32) DEFAULT NULL,

 `home` varchar(32) DEFAULT NULL,

 `homeaddr` varchar(1024) DEFAULT NULL,

 `company` varchar(128) DEFAULT NULL,

 `companyaddr` varchar(1024) DEFAULT NULL,

 `title` varchar(16) DEFAULT NULL,

 PRIMARY KEY (`mobile`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE `tuser` (

 `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'this is userid',

 `username` varchar(32) NOT NULL COMMENT 'username',

 `password` varchar(32) NOT NULL COMMENT 'password',

 `gender` int(11) NOT NULL COMMENT '1 is male 0 is female',

 PRIMARY KEY (`id`),

 UNIQUE KEY `username` (`username`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

 

C 编写项目代码:

Database01.pro

SOURCES+=\

   main.cpp

 

QT+=gui widgets sql

 

CONFIG+=C++11

main.cpp

#include <QApplication>
#include <QSqlDatabase>
#include <QSqlError>
#include <QDebug>
#include <QWidget>
 
int main(int argc,char* argv[])
{
    QApplication app(argc,argv);
    QWidget w;
 
    /*QT可以操作 QSLITE QODBC,QPLSQL 这些数据库*/
    //下面表示使用mysql数据库
    QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
    db.setHostName("127.0.0.1");  //设置数据库所在位置
    db.setUserName("root");       //设置数据库的用户名
    db.setPassword("123456");     //设置数据库的密码
    db.setDatabaseName("d0718");  //设置数据库名称
    bool bRet = db.open();        //打开数据库连接
    if(bRet == false)
{
    //说明可以通过db.lastError()的方式得到错误信息
        qDebug() << "error open database" << db.lastError().text();
        exit(0);
    }
    qDebug() << "open database success";
 
    w.show();
    return app.exec();
}

运行结果:

 

案例二:

Database01.pro的内容如下:

SOURCES += \
    main.cpp \
    Widget01.cpp
 
QT += gui widgets sql
#如果用到C++11的才会用到,否则不用
CONFIG += C++11
 
HEADERS += \
    Widget01.h

Widget01.h的内容如下:

#ifndef WIDGET01_H
#define WIDGET01_H
 
#include <QWidget>
 
class Widget01 : public QWidget
{
    Q_OBJECT
public:
    explicit Widget01(QWidget *parent = 0);
 
signals:
 
public slots:
 
};
 
#endif // WIDGET01_H

Widget01.cpp的内容如下:

#include "Widget01.h"
 
#include <QSqlDatabase>
#include <QSqlError>
#include <QSqlQuery>
#include <QSqlResult>
 
#include <QDebug>
 
Widget01::Widget01(QWidget *parent) :
    QWidget(parent)
{
    QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
    db.setHostName("127.0.0.1");
    db.setUserName("root");
    db.setPassword("123456");
    db.setDatabaseName("d0718");
    bool bRet = db.open();
    if(bRet == false)
    {
        qDebug() << "error open database" << db.lastError().text();
        exit(0);
    }
    qDebug() << "open database success";
 
    //向数据库中添加数据
    db.exec("insert into tuser(username,password,gender) values('涂作权','123456','1')");
    db.close();
}

main.cpp的内容如下:

#include <QApplication>
#include "Widget01.h"
 
int main(int argc,char* argv[])
{
    QApplication app(argc,argv);
    Widget01 w;
    w.show();
    return app.exec();
}

运行结果:

 

案例2,使用QSqlTableModel

Database01.pro

SOURCES += \
    main.cpp \
    Widget02.cpp
 
QT += gui widgets sql
 
CONFIG += C++11
 
HEADERS += \
    Widget02.h

Widget02.h

#ifndef WIDGET02_H
#define WIDGET02_H
 
#include <QWidget>
 
class Widget02 : public QWidget
{
    Q_OBJECT
public:
    explicit Widget02(QWidget *parent = 0);
 
signals:
 
public slots:
 
};
 
#endif // WIDGET02_H

Widget02.cpp

#include "Widget02.h"
#include <QSqlDatabase>
#include <QSqlTableModel>
#include <QSqlRecord>
#include <QDebug>
#include <QSqlError>
 
Widget02::Widget02(QWidget *parent) :
    QWidget(parent)
{
    // QSqlTableModel: 数据表对应的数据结构
    QSqlTableModel model;
    //设置表名,通过这种方式不用写sql语句了
    model.setTable("tuser");
    //设置过滤器,当加上这一句的时候只返回用户名不是"toto"数据
    //model.setFilter("username<>'toto'");
    model.select();  // exec query
    int ret = model.rowCount();
 
    // read data from database
    for(int i=0; i<ret; ++i)
    {
        QSqlRecord record = model.record(i);
        for(int j=0; j<record.count(); j++)
        {
            qDebug() << record.value(j);
        }
    }
 
    // update data to database
    //将第0(脚标以0开始),第1列的数据改成toto
    //注意只能修改上满select出来的结果。
    model.setData(model.index(2, 1), "tototuzuoquan");
    //要想让上面的这一句也执行成功,要放开下面一句
    model.submitAll();
 
    // insert data to database
    QSqlRecord record = model.record();
    //可以指定id的值,通过下面的方式实现向数据库中插入一条记录
    // record.setValue("id", );
    record.setValue("username", "toto12");
    record.setValue("password", "password12");
    record.setValue("gender", 1);
    model.insertRecord(-1, record);
    model.submitAll();
}

main.cpp

#include <QApplication>
#include "Widget02.h"
#include <QSqlDatabase>
#include <QSqlError>
#include <QDebug>
 
int main(int argc,char* argv[])
{
    QApplication app(argc,argv);
 
    /*QT可以操作 QSLITE QODBC,QPLSQL 这些数据库*/
    //下面表示使用mysql数据库,因为这里的db没有用到db,所以可以把它放在main
    //本质:在QT里面打开一个数据库之后,就会保存一个数据库连接,
    //其它的位置就可以任意使用这个全局的变量了
    QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
    db.setHostName("127.0.0.1");  //设置数据库所在位置
    db.setUserName("root");       //设置数据库的用户名
    db.setPassword("123456");     //设置数据库的密码
    db.setDatabaseName("d0718");  //设置数据库名称
    bool bRet = db.open();        //打开数据库连接
 
    if(bRet == false)
    {
        //说明可以通过db.lastError()的方式得到错误信息
        qDebug() << "error open database" << db.lastError().text();
        exit(0);
    }
    qDebug() << "open database success";
 
    //注意Widget02要写在上面代码的下面
    Widget02 w;
    w.show();
    return app.exec();
}

运行结果:

数据库中的变化的内容如下:

 

案例三(QTableView),事务操作:

Database01.pro

SOURCES += \
    main.cpp \
    Widget03.cpp
 
QT += gui widgets sql
 
CONFIG += C++11
 
HEADERS += \
    Widget03.h

Widget03.h

#ifndef WIDGET03_H
#define WIDGET03_H
 
#include <QObject>
#include <QSqlTableModel>
#include <QTableView> // show table
 
class Widget03 : public QWidget
{
    Q_OBJECT
public:
    explicit Widget03(QWidget *parent = 0);
 
    QSqlTableModel* _model;
    QTableView* _view;
 
signals:
 
public slots:
    void slotSubmitClicked();
    void slotDelClicked();
    void slotAddClicked();
};
 
#endif // WIDGET03_H

Widget03.cpp

#include "Widget03.h"
#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QPushButton>
#include <QMessageBox>
#include <QSqlError>
#include <QSqlDatabase>
#include <QSqlRecord>
 
Widget03::Widget03(QWidget *parent) :
    QWidget(parent)
{
    _model = new QSqlTableModel;
    _model->setTable("tuser");
    _model->select();
    _model->setEditStrategy(QSqlTableModel::OnManualSubmit);
 
    _model->setHeaderData(0, Qt::Horizontal, "编号");
    _model->setHeaderData(1, Qt::Horizontal, "用户名");
    _model->setHeaderData(2, Qt::Horizontal, "密码");
    _model->setHeaderData(3, Qt::Horizontal, "性别");
 
    _view = new QTableView;
    //_view中添加_model
    _view->setModel(_model);
    //隐藏第3
    //_view->hideColumn(2);
 
    QVBoxLayout* lay = new QVBoxLayout(this);
    lay->addWidget(_view);
 
    QHBoxLayout* hBox = new QHBoxLayout;
    lay->addLayout(hBox);
    hBox->addStretch();
 
    //删除的信号和槽
    QPushButton* del = new QPushButton("del");
    connect(del, SIGNAL(clicked()), this, SLOT(slotDelClicked()));
    hBox->addWidget(del);
 
    //提交的信号和槽
    QPushButton* submit = new QPushButton("submit");
    connect(submit, SIGNAL(clicked()), this, SLOT(slotSubmitClicked()));
    hBox->addWidget(submit);
 
    //添加的信号和槽
    QPushButton* add = new QPushButton("add");
    connect(add, SIGNAL(clicked()), this, SLOT(slotAddClicked()));
    hBox->addWidget(add);
}
 
/**
 * @brief Widget03::slotAddClicked 添加的槽
 */
void Widget03::slotAddClicked()
{
    //开启事务
    _model->database().transaction();
 
    QSqlRecord record = _model->record();
    _model->insertRecord(-1,record);
}
 
/**
 * @brief Widget03::slotDelClicked 删除的信号槽
 */
void Widget03::slotDelClicked()
{
    // 通过_view去获取被选中的部分的数据model
    QItemSelectionModel * selectModel = _view->selectionModel();
    // 通过选中的数据结构,获取这些格子的ModelIndex
    QModelIndexList selectList =  selectModel->selectedIndexes();
    QList<int> delRow;
 
    // 遍历这些格子,获取格子所在行,因为可能存在相同的行,所以要去重
    for(int i=0; i<selectList.size(); ++i)
    {
        QModelIndex index = selectList.at(i);
        //  _model->removeRow(index.row());
        delRow << index.row();
    }
 
    while(delRow.size() > 0)
    {
        int row = delRow.at(0);
        delRow.removeAll(row);
        _model->removeRow(row);
    }
 
    _model->submitAll();
}
 
void Widget03::slotSubmitClicked()
{
    if(!_model->submitAll())
    {
        QMessageBox::critical(this, "Error", QSqlDatabase().lastError().text());
        _model->database().rollback();
    }
    else
    {
        _model->database().commit();
    }
}

main.cpp

#include <QApplication>
#include "Widget03.h"
#include <QSqlDatabase>
#include <QSqlError>
#include <QDebug>
 
int main(int argc,char* argv[])
{
    QApplication app(argc,argv);
 
    /*QT可以操作 QSLITE QODBC,QPLSQL 这些数据库*/
    //下面表示使用mysql数据库,因为这里的db没有用到db,所以可以把它放在main
    //本质:在QT里面打开一个数据库之后,就会保存一个数据库连接,
    //其它的位置就可以任意使用这个全局的变量了
    QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
    db.setHostName("127.0.0.1");  //设置数据库所在位置
    db.setUserName("root");       //设置数据库的用户名
    db.setPassword("123456");     //设置数据库的密码
    db.setDatabaseName("d0718");  //设置数据库名称
    bool bRet = db.open();        //打开数据库连接
 
    if(bRet == false)
    {
        //说明可以通过db.lastError()的方式得到错误信息
        qDebug() << "error open database" << db.lastError().text();
        exit(0);
    }
    qDebug() << "open database success";
 
    //注意Widget02要写在上面代码的下面
    Widget03 w;
    w.show();
    return app.exec();
}

运行结果:

 

案例四:关于QItemDelegate代理

Database01.pro

SOURCES+=\

   main.cpp\

   Widget04.cpp

 

QT+=gui widgets sql

 

CONFIG+=C++11

 

HEADERS+=\

   Widget04.h

Widget04.h

#ifndefWIDGET04_H

#defineWIDGET04_H

 

#include<QObject>

#include<QSqlTableModel>

#include<QTableView>//showtable

#include<QItemDelegate>

#include<QComboBox>

 

/**

 *@briefTheTUserDelegateclass对整张表进行代理

 */

classTUserDelegate:publicQItemDelegate

{

   QWidget*createEditor(QWidget*parent,

                         constQStyleOptionViewItem&option,

                         constQModelIndex&index)const

   {

       if(index.column()==0)

           returnNULL;

       if(index.column()==3)

       {

           QComboBox* combo=newQComboBox(parent);

           combo->addItem("");

           combo->addItem("");

           returncombo;

       }

 

       returnQItemDelegate::createEditor(parent,option,index);

   }

};

 

/**

 *@briefTheReadOnlyDelegateclass做一个只读的代理

 */

classReadOnlyDelegate:publicQItemDelegate

{

   QWidget*createEditor(QWidget*,

                         constQStyleOptionViewItem&,

                         constQModelIndex&)const

   {

       returnNULL;

   }

};

 

/**

 *@briefTheGenderDelegateclass对指定列进行代理

 */

classGenderDelegate:publicQItemDelegate

{

public:

   QWidget*createEditor(QWidget*parent,

                         constQStyleOptionViewItem&,

                         constQModelIndex&)const

   {

       QComboBox* combo=newQComboBox(parent);

       combo->addItem("");

       combo->addItem("");

       returncombo;

   }

};

 

/**

 *@briefTheMyTableModelclassTableModel的重写

 */

classMyTableModel:publicQSqlTableModel

{

public:

   QVariantdata(constQModelIndex&idx,introle=Qt::DisplayRole)const

   {

       //  if(role==Qt::DisplayRole)

       //      returnQSqlTableModel::data(idx,role);

       //如果不是第三列,直接返回

       if(idx.column()!=3)

           returnQSqlTableModel::data(idx,role);

 

       //如果是第三列

       QVariantvar=QSqlTableModel::data(idx,role);

       if(var==0)

       {

           return"";

       }

 

       return"";

   }

 

   boolsetData(constQModelIndex&index,constQVariant&value,introle=Qt::EditRole)

   {

       if(index.column()!=3)

           returnQSqlTableModel::setData(index,value,role);

 

       if(value=="")

           returnQSqlTableModel::setData(index,1,role);

       returnQSqlTableModel::setData(index,0,role);

   }

 

};

 

classWidget04:publicQWidget

{

   Q_OBJECT

public:

   explicitWidget04(QWidget*parent= 0);

 

   MyTableModel*_model;

   QTableView*_view;

 

signals:

 

publicslots:

   voidslotSubmitClicked();

   voidslotDelClicked();

   voidslotAddClicked();

};

 

#endif//WIDGET04_H

Widget04.cpp

#include"Widget04.h"

#include<QVBoxLayout>

#include<QHBoxLayout>

#include<QPushButton>

#include<QMessageBox>

#include<QSqlError>

#include<QSqlDatabase>

#include<QSqlRecord>

 

Widget04::Widget04(QWidget*parent):

   QWidget(parent)

{

   _model=newMyTableModel;

   _model->setTable("tuser");

   _model->select();

   //数据库的提交策略是手动提交

   _model->setEditStrategy(QSqlTableModel::OnManualSubmit);

 

   //改变现实的表的名字

   _model->setHeaderData(0,Qt::Horizontal,"编号");

   _model->setHeaderData(1,Qt::Horizontal,"用户名");

   _model->setHeaderData(2,Qt::Horizontal,"密码");

   _model->setHeaderData(3,Qt::Horizontal,"性别");

 

   _view=newQTableView;

   _view->setModel(_model);

   //   _view->hideColumn(2);

 

   //下面是为指定的列设置代理

   // _view->setItemDelegateForColumn(3,newGenderDelegate);

   //_view->setItemDelegateForColumn(0,newReadOnlyDelegate);

   //为整个表设置代理

   _view->setItemDelegate(newTUserDelegate);

   QVBoxLayout*lay=newQVBoxLayout(this);

   lay->addWidget(_view);

 

   QHBoxLayout*hBox=newQHBoxLayout;

   lay->addLayout(hBox);

   hBox->addStretch();

 

   //删除按钮

   QPushButton*del=newQPushButton("del");

   connect(del,SIGNAL(clicked()),this,SLOT(slotDelClicked()));

   hBox->addWidget(del);

 

   //提交按钮

   QPushButton*submit=newQPushButton("submit");

   connect(submit,SIGNAL(clicked()),this,SLOT(slotSubmitClicked()));

   hBox->addWidget(submit);

 

   //添加按钮

   QPushButton*add=newQPushButton("add");

   connect(add,SIGNAL(clicked()),this,SLOT(slotAddClicked()));

   hBox->addWidget(add);

}

 

voidWidget04::slotAddClicked()

{

 

   QSqlRecordrecord=_model->record();

   _model->insertRecord(-1,record);

}

 

voidWidget04::slotDelClicked()

{

   //通过_view去获取被选中的部分的数据model

   QItemSelectionModel*selectModel=_view->selectionModel();

   //通过选中的数据结构,获取这些格子的ModelIndex

   QModelIndexListselectList= selectModel->selectedIndexes();

   QList<int>delRow;

 

   //遍历这些格子,获取格子所在行,因为可能存在相同的行,所以要去重

   for(inti=0;i<selectList.size();++i)

   {

       QModelIndexindex=selectList.at(i);

       // _model->removeRow(index.row());

       delRow<<index.row();

   }

 

   while(delRow.size()>0)

   {

       introw=delRow.at(0);

       delRow.removeAll(row);

       _model->removeRow(row);

   }

 

   _model->submitAll();

 

}

 

/**

 *@briefWidget04::slotSubmitClicked提交按钮

 */

voidWidget04::slotSubmitClicked()

{

   if(!_model->submitAll())

   {

       QMessageBox::critical(this,"Error",QSqlDatabase().lastError().text());

   }

}

main.cpp

#include<QApplication>

#include"Widget04.h"

#include<QSqlDatabase>

#include<QSqlError>

#include<QDebug>

 

intmain(intargc,char*argv[])

{

   QApplicationapp(argc,argv);

 

   /*QT可以操作QSLITEQODBC,QPLSQL这些数据库*/

   //下面表示使用mysql数据库,因为这里的db没有用到db,所以可以把它放在main

   //本质:在QT里面打开一个数据库之后,就会保存一个数据库连接,

   //其它的位置就可以任意使用这个全局的变量了

   QSqlDatabasedb=QSqlDatabase::addDatabase("QMYSQL");

   db.setHostName("127.0.0.1"); //设置数据库所在位置

   db.setUserName("root");      //设置数据库的用户名

   db.setPassword("123456");    //设置数据库的密码

   db.setDatabaseName("d0718"); //设置数据库名称

   boolbRet=db.open();       //打开数据库连接

 

   if(bRet==false)

   {

       //说明可以通过db.lastError()的方式得到错误信息

       qDebug()<<"erroropendatabase"<<db.lastError().text();

       exit(0);

   }

   qDebug()<<"opendatabasesuccess";

 

   //注意Widget02要写在上面代码的下面

   Widget04w;

   w.show();

   returnapp.exec();

}

运行结果:

 

 

Widget05.h

#ifndef WIDGET05_H

#define WIDGET05_H

 

#include <QWidget>

#include <QSqlQueryModel>

#include <QTableView>

class Widget05 : public QWidget

{

    Q_OBJECT

public:

    explicit Widget05(QWidget *parent = 0);

 

    QSqlQueryModel* _model;

    QTableView *_view;

 

signals:

 

public slots:

 

};

 

#endif // WIDGET05_H

Widget05.cpp

#include "Widget05.h"

#include <QSqlQuery>

#include <QVBoxLayout>

Widget05::Widget05(QWidget *parent) :

    QWidget(parent)

{

    _model = new QSqlQueryModel;

    _view = new QTableView(this);

    _view->setModel(_model);

 

    _model->setQuery("select * from tuser");

    _model->query();

 

    QVBoxLayout* lay = new QVBoxLayout(this);

    lay->addWidget(_view);

}

main.cpp

#include <QApplication>
#include "Widget05.h"
#include <QSqlDatabase>
#include <QSqlError>
#include <QDebug>
#include "Contact.h"
 
int main(int argc,char* argv[])
{
    QApplication app(argc,argv);
 
    /*QT可以操作 QSLITE QODBC,QPLSQL 这些数据库*/
    //下面表示使用mysql数据库,因为这里的db没有用到db,所以可以把它放在main
    //本质:在QT里面打开一个数据库之后,就会保存一个数据库连接,
    //其它的位置就可以任意使用这个全局的变量了
    QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
    db.setHostName("127.0.0.1");  //设置数据库所在位置
    db.setUserName("root");       //设置数据库的用户名
    db.setPassword("123456");     //设置数据库的密码
    db.setDatabaseName("d0718");  //设置数据库名称
    bool bRet = db.open();        //打开数据库连接
 
    if(bRet == false)
    {
        //说明可以通过db.lastError()的方式得到错误信息
        qDebug() << "error open database" << db.lastError().text();
        exit(0);
    }
    qDebug() << "open database success";
 
    //注意Widget02要写在上面代码的下面
    Widget05 w;
    w.show();
    return app.exec();
}
运行结果:

 

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
2月前
|
SQL 关系型数据库 MySQL
乐观锁在分布式数据库中如何与事务隔离级别结合使用
乐观锁在分布式数据库中如何与事务隔离级别结合使用
|
2月前
|
SQL 数据库 数据安全/隐私保护
SQL Server数据库Owner导致事务复制log reader job无法启动的解决办法
【8月更文挑战第14天】解决SQL Server事务复制Log Reader作业因数据库所有者问题无法启动的方法:首先验证数据库所有者是否有效并具足够权限;若非,使用`ALTER AUTHORIZATION`更改为有效登录名。其次,确认Log Reader使用的登录名拥有读取事务日志所需的角色权限。还需检查复制配置是否准确无误,并验证Log Reader代理的连接信息及参数。重启SQL Server Agent服务或手动启动Log Reader作业亦可能解决问题。最后,审查SQL Server错误日志及Windows事件查看器以获取更多线索。
|
20天前
|
SQL 关系型数据库 MySQL
学成在线笔记+踩坑(3)——【内容模块】课程分类查询、课程增改删、课程计划增删改查,统一异常处理+JSR303校验
课程分类查询、课程新增、统一异常处理、统一封装结果类、JSR303校验、修改课程、查询课程计划、新增/修改课程计划
学成在线笔记+踩坑(3)——【内容模块】课程分类查询、课程增改删、课程计划增删改查,统一异常处理+JSR303校验
|
5天前
|
数据库 数据库管理
qt对sqlite数据库多线程的操作
本文总结了在Qt中进行SQLite数据库多线程操作时应注意的四个关键问题,包括数据库驱动加载、加锁、数据库的打开与关闭,以及QsqlQuery变量的使用。
|
7天前
|
SQL 关系型数据库 MySQL
ThinkPHP6 连接使用数据库,增删改查,find,select,save,insert,insertAll,insertGetId,delete,update方法的用法
本文介绍了在ThinkPHP6框架中如何连接和使用数据库进行增删改查操作。内容包括配置数据库连接信息、使用Db类进行原生MySQL查询、find方法查询单个数据、select方法查询数据集、save方法添加数据、insertAll方法批量添加数据、insertGetId方法添加数据并返回自增主键、delete方法删除数据和update方法更新数据。此外,还说明了如何通过数据库配置文件进行数据库连接信息的配置,并强调了在使用Db类时需要先将其引入。
ThinkPHP6 连接使用数据库,增删改查,find,select,save,insert,insertAll,insertGetId,delete,update方法的用法
|
3月前
|
存储 SQL 关系型数据库
数据库事务:确保数据完整性的关键20
【7月更文挑战第20天】事务是数据库操作的基本逻辑单位,确保数据一致性。ACID原则包括:原子性(操作全成或全败),一致性(事务前后数据合法性),隔离性(并发操作互不影响),持久性(提交后更改永久保存)。MySQL的InnoDB引擎支持事务,通过undo log实现回滚,redo log确保数据持久化。开启事务可使用`BEGIN`或`START TRANSACTION`,提交`COMMIT`,回滚`ROLLBACK`。
161 70
|
2月前
|
SQL 数据库连接 API
ThinkPHP6实现增删改查接口
ThinkPHP6实现增删改查接口
33 1
|
2月前
|
XML 数据库 数据格式
Spring5入门到实战------14、完全注解开发形式 ----JdbcTemplate操作数据库(增删改查、批量增删改)。具体代码+讲解 【终结篇】
这篇文章是Spring5框架的实战教程的终结篇,介绍了如何使用注解而非XML配置文件来实现JdbcTemplate的数据库操作,包括增删改查和批量操作,通过创建配置类来注入数据库连接池和JdbcTemplate对象,并展示了完全注解开发形式的项目结构和代码实现。
Spring5入门到实战------14、完全注解开发形式 ----JdbcTemplate操作数据库(增删改查、批量增删改)。具体代码+讲解 【终结篇】
|
2月前
|
SQL XML Java
Spring5入门到实战------12、使用JdbcTemplate操作数据库(增删改查)。具体代码+讲解 【上篇】
这篇文章是Spring5框架的实战教程,详细讲解了如何使用JdbcTemplate进行数据库的增删改查操作,包括在项目中引入依赖、配置数据库连接池、创建实体类、定义DAO接口及其实现,并提供了具体的代码示例和测试结果,最后还提供了完整的XML配置文件和测试代码。
Spring5入门到实战------12、使用JdbcTemplate操作数据库(增删改查)。具体代码+讲解 【上篇】
|
1月前
|
SQL 安全 数据库
基于SQL Server事务日志的数据库恢复技术及实战代码详解
基于事务日志的数据库恢复技术是SQL Server中一个非常强大的功能,它能够帮助数据库管理员在数据丢失或损坏的情况下,有效地恢复数据。通过定期备份数据库和事务日志,并在需要时按照正确的步骤恢复,可以最大限度地减少数据丢失的风险。需要注意的是,恢复数据是一个需要谨慎操作的过程,建议在执行恢复操作之前,详细了解相关的操作步骤和注意事项,以确保数据的安全和完整。
59 0
下一篇
无影云桌面