QT連接SQLServer數(shù)據(jù)庫(kù)的實(shí)現(xiàn)
1、安裝SQLServer數(shù)據(jù)庫(kù)后
在SQL Server 配置管理器中


設(shè)置后,需要重新啟動(dòng)SQL Server服務(wù)
2、重點(diǎn)* 配置ODBC數(shù)據(jù)源
由于沒(méi)有配置ODBC,一直無(wú)法連接
開(kāi)始——ODBC數(shù)據(jù)源管理程序(64位)


之后選擇:使用用戶輸入登錄ID和密碼的SQL Server驗(yàn)證
連接SQL Server以獲得其他配置選項(xiàng)的默認(rèn)設(shè)置
登錄ID:sa
密碼:xxx
之后更改默認(rèn)數(shù)據(jù)庫(kù)
選擇下一步,點(diǎn)擊測(cè)試數(shù)據(jù)源——如果顯示 測(cè)試成功,則完成
3、QT 編寫(xiě)代碼,連接數(shù)據(jù)庫(kù)
DatabaseProject.pro 添加sql
#include "widget.h"
#include <QApplication>
#include <QDebug>
#include <QSqlDatabase>
#include <QMessageBox>
#include <QSqlError>
bool OpenDatabase()
{
QSqlDatabase db = QSqlDatabase::addDatabase("QODBC");
qDebug()<<"ODBC driver is valid: "<<db.isValid();
QString dsn = QString::fromLocal8Bit("QTDSN");
db.setHostName("localhost");
db.setDatabaseName(dsn);
db.setUserName("sa");
db.setPassword("xxx");
if(db.open()) // 注意此處,是open(),不是isOpen()
{
qDebug()<<"open database success!";
return true;
}
else
{
qDebug()<<db.lastError().text();
QMessageBox::critical(0, QObject::tr("Database error"), db.lastError().text());
return false;
}
}
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
w.show();
OpenDatabase();
return a.exec();
}輸出open database success,則為連接 數(shù)據(jù)庫(kù)成功
4、嘗試實(shí)現(xiàn)遠(yuǎn)程電腦連接數(shù)據(jù)庫(kù)
連接遠(yuǎn)程電腦數(shù)據(jù)庫(kù)
首先,明確遠(yuǎn)程電腦ip地址,ping后看能否成功
其次,如果連接不上,查看是否關(guān)閉了電腦的防火墻
然后,在ODBC數(shù)據(jù)源管理中,在服務(wù)器處填寫(xiě)ip地址
最后,選擇指定的數(shù)據(jù)庫(kù),測(cè)試查看是否連接成功
5、實(shí)現(xiàn)增刪改查功能
#include "widget.h"
#include <QApplication>
#include <QSqlDatabase>
#include <QDebug>
#include <QMessageBox>
#include <QSqlError>
#include <QSqlQuery>
#include <sql_info.h>
// 連接sqlserver 數(shù)據(jù)庫(kù)
// Qt GUI應(yīng)用程序 《 Qt QODBC 數(shù)據(jù)庫(kù)驅(qū)動(dòng) 《 SQL數(shù)據(jù)庫(kù)
// 目標(biāo):
// 連接主機(jī)數(shù)據(jù)庫(kù),獲取數(shù)據(jù)庫(kù)表中數(shù)據(jù)
// 實(shí)現(xiàn)add delete update select 表中數(shù)據(jù),向一個(gè)表實(shí)現(xiàn)即可
// 向指定表中插入數(shù)據(jù)
// 增加數(shù)據(jù)
bool insert_info(QSqlDatabase db, QString insert_command, Sql_Info *info)
{
QSqlQuery ins_qry(db);
ins_qry.prepare(insert_command);
ins_qry.bindValue(":xx", info->get_xx());
ins_qry.bindValue(":xx", info->get_xx());
ins_qry.bindValue(":xx", info->get_xx());
ins_qry.bindValue(":xx", info->get_xx());
ins_qry.bindValue(":xx", info->get_xx());
ins_qry.bindValue(":xx", info->get_xx());
ins_qry.bindValue(":xx", info->get_xx());
ins_qry.bindValue(":xx", info->get_xx());
bool ins_res = ins_qry.exec();
if(ins_res)
qDebug()<<"插入數(shù)據(jù)成功";
else
qDebug()<<"插入數(shù)據(jù)失敗";
return ins_res;
}
// 刪除數(shù)據(jù)
bool delete_info(QSqlDatabase db, QString del_command, QString del_name)
{
QSqlQuery del_qry(db);
del_qry.prepare(del_command);
del_qry.addBindValue(del_name);
bool del_res = del_qry.exec();
if(del_res)
qDebug()<<"刪除成功";
else
qDebug()<<"刪除失敗";
return del_res;
}
// 修改表中數(shù)據(jù)
bool update_info(QSqlDatabase db, QString update_command, int xx, int xx, QString xx)
{
QSqlQuery update_qry(db);
update_qry.prepare(update_command);
update_qry.addBindValue(xx);
update_qry.addBindValue(xx);
update_qry.addBindValue(xx);
bool update_res = update_qry.exec();
if(update_res)
qDebug()<<"更新成功";
else
qDebug()<<"更新失敗";
return update_res;
}
// 查詢指定表中數(shù)據(jù)
QList<Sql_Info*> query_table_info(QSqlDatabase db, QString query_command)
{
QList<Sql_Info*> sql_list;
// 查詢
QSqlQuery qry(db); // 獲取數(shù)據(jù)庫(kù)
if(qry.exec(query_command)){
int sql_size = 0; // 記錄表中數(shù)據(jù)數(shù)量
while(qry.next())
{
if(qry.isValid())
{
int xx= qry.value(0).toUInt();
QString xx= qry.value(1).toString();
QString xx= qry.value(2).toString();
int xx= qry.value(3).toUInt();
Sql_Info * si = new Sql_Info(xx, xx, xx, xx);
sql_list.append(si);
qDebug()<<QString("xx:%1; xx:%2; xx:%3").arg(xx).arg(xx).arg(xx);
}
sql_size++;
}
}
//qDebug()<<sql_list[1]->get_name();
return sql_list;
}
// 打開(kāi)數(shù)據(jù)庫(kù),查看是否連接成功
bool OpenDatabase()
{
QSqlDatabase db = QSqlDatabase::addDatabase("QODBC"); // 數(shù)據(jù)庫(kù)驅(qū)動(dòng)類型SQLServer
qDebug()<<"ODBC driver is valid: "<<db.isValid();
QString dsn = QString::fromLocal8Bit("QTHostDBDSN"); // 數(shù)據(jù)庫(kù)名稱
db.setHostName("10.40.19.9");
db.setDatabaseName(dsn);
db.setUserName("sa");
db.setPassword("123");
if(db.open())
{
qDebug()<<"數(shù)據(jù)庫(kù)打開(kāi)成功";
// 查詢數(shù)據(jù)庫(kù)中指定表數(shù)據(jù)
//QString command = "SELECT * FROM xx表";
//QList<Sql_Info*> res = query_table_info(db, command);
// 向表中插入數(shù)據(jù)
//QString insert_command = "INSERT INTO xx表(xx,xx,xx,xx,xx,xx,xx,xx) VALUES (:xx,:xx,:xx,:xx,:xx,:xx,:xx,:xx)";
//Sql_Info *v = new Sql_Info("12345679", "張三", 2, "xx", 9, 10, 80, 0);
//insert_info(db, insert_command, v);
QSqlQuery insert_qry(db);
QString sel_command = "SELECT * FROM xx表";
if(insert_qry.exec(sel_command))
{
QString ins_qry_str = "INSERT INTO xx表"
}
// 刪除表中數(shù)據(jù)
//QString delete_command = "DELETE FROM xx表 WHERE xx=?";
//QString delete_name = "張三";
//delete_info(db, delete_command, delete_name);
// 修改表中數(shù)據(jù)
//QString update_command = "UPDATE xx表 SET xx=?, xx=? WHERE xx=?";
//update_info(db, update_command, 11, 80, "xx");
return true;
}
else
{
qDebug()<<"數(shù)據(jù)庫(kù)打開(kāi)失敗";
qDebug()<<db.lastError();
QMessageBox::critical(0, QObject::tr("Database Error"), db.lastError().text());
return false;
}
}
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
w.show();
OpenDatabase();
return a.exec();
}到此這篇關(guān)于QT連接SQLServer數(shù)據(jù)庫(kù)的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)QT連接SQLServer內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Qt連接MySQL數(shù)據(jù)庫(kù)的實(shí)現(xiàn)(保姆級(jí)成功版教程)
- QT連接Mysql數(shù)據(jù)庫(kù)的詳細(xì)教程(親測(cè)成功版)
- 可能是全網(wǎng)最詳細(xì)的Qt連接MySQL數(shù)據(jù)庫(kù)教程
- qt首次連接MYSQL驅(qū)動(dòng)的各種問(wèn)題圖文詳解
- QT5連接MySQL實(shí)現(xiàn)增刪改查
- QT連接Mysql數(shù)據(jù)庫(kù)的實(shí)現(xiàn)步驟
- Qt5連接并操作PostgreSQL數(shù)據(jù)庫(kù)的實(shí)現(xiàn)示例
- QT連接MYSQL數(shù)據(jù)庫(kù)的詳細(xì)步驟
- PyQt中使用QtSql連接MySql數(shù)據(jù)庫(kù)的方法
- PyQt5連接MySQL及QMYSQL driver not loaded錯(cuò)誤解決
相關(guān)文章
成員初始化列表與構(gòu)造函數(shù)體中的區(qū)別詳細(xì)解析
無(wú)論是在構(gòu)造函數(shù)初始化列表中初始化成員,還是在構(gòu)造函數(shù)體中對(duì)它們賦值,最終結(jié)果是相同的。不同之處在于,使用構(gòu)造函數(shù)初始化列表的版本初始化數(shù)據(jù)成員,沒(méi)有定義初始化列表的構(gòu)造函數(shù)版本在構(gòu)造函數(shù)體中對(duì)數(shù)據(jù)成員賦值2013-09-09
探索Visual C++下創(chuàng)建WPF項(xiàng)目的方法示例
這篇文章主要介紹了探索Visual C++下創(chuàng)建WPF項(xiàng)目的方法示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07
C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)與算法之圖的遍歷(二)
這篇文章主要是介紹了利用廣度優(yōu)先算法實(shí)現(xiàn)圖的遍歷,文中利用圖文詳細(xì)的介紹了實(shí)現(xiàn)步驟,對(duì)我們學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)與算法有一定的幫助,需要的朋友可以參考一下2021-12-12
C++?數(shù)據(jù)結(jié)構(gòu)超詳細(xì)講解順序表
程序中經(jīng)常需要將一組數(shù)據(jù)元素作為整體管理和使用,需要?jiǎng)?chuàng)建這種元素組,用變量記錄它們,傳進(jìn)傳出函數(shù)等。一組數(shù)據(jù)中包含的元素個(gè)數(shù)可能發(fā)生變化,順序表則是將元素順序地存放在一塊連續(xù)的存儲(chǔ)區(qū)里,元素間的順序關(guān)系由它們的存儲(chǔ)順序自然表示2022-03-03

