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位)
之后選擇:使用用戶(hù)輸入登錄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; } // 查詢(xún)指定表中數(shù)據(jù) QList<Sql_Info*> query_table_info(QSqlDatabase db, QString query_command) { QList<Sql_Info*> sql_list; // 查詢(xún) 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)類(lèi)型SQLServer qDebug()<<"ODBC driver is valid: "<<db.isValid(); QString dsn = QString::fromLocal8Bit("QTHostDBDSN"); // 數(shù)據(jù)庫(kù)名稱(chēng) db.setHostName("10.40.19.9"); db.setDatabaseName(dsn); db.setUserName("sa"); db.setPassword("123"); if(db.open()) { qDebug()<<"數(shù)據(jù)庫(kù)打開(kāi)成功"; // 查詢(xún)數(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)文章
c++11?類(lèi)中關(guān)于default、explict、implicit、noexcept、final的詳解
這篇文章主要介紹了c++11?類(lèi)中關(guān)于default、explict、implicit、noexcept、final的詳解,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-11-11教你用c++從頭開(kāi)始實(shí)現(xiàn)決策樹(shù)
從頭實(shí)現(xiàn)一個(gè)分類(lèi)決策樹(shù)分類(lèi)器似乎是一個(gè)適當(dāng)?shù)奶魬?zhàn)。這已經(jīng)被證明是一個(gè)測(cè)試但有益的學(xué)習(xí)旅程,我想分享一些我在這個(gè)過(guò)程中的主要經(jīng)驗(yàn),對(duì)c++實(shí)現(xiàn)決策樹(shù)相關(guān)知識(shí)感興趣的朋友一起看看吧2021-05-05解決C++ openCV無(wú)法讀取視頻但是可以讀取圖像的問(wèn)題記錄
在使用OpenCV的cv::VideoCapture讀取視頻文件時(shí),可能會(huì)遇到無(wú)法讀取特定格式,如MP4的視頻文件的問(wèn)題,本文介紹解決C++ openCV無(wú)法讀取視頻但是可以讀取圖像的問(wèn)題記錄,感興趣的朋友跟隨小編一起看看吧2024-09-09C語(yǔ)言實(shí)現(xiàn)三角函數(shù)表
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言三角函數(shù)表,打印出相對(duì)應(yīng)的三角函數(shù)值,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-06-06C語(yǔ)言實(shí)現(xiàn)多項(xiàng)式的相加
這篇文章主要為大家介紹了C語(yǔ)言實(shí)現(xiàn)多項(xiàng)式的相加,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-10-10C語(yǔ)言報(bào)錯(cuò):Null Pointer Dereference的解決方案
Null Pointer Dereference(空指針解引用)是C語(yǔ)言中常見(jiàn)且危險(xiǎn)的內(nèi)存管理錯(cuò)誤,它通常在程序試圖訪(fǎng)問(wèn)通過(guò)空指針(NULL pointer)引用的內(nèi)存地址時(shí)發(fā)生,本文將詳細(xì)介紹Null Pointer Dereference的產(chǎn)生原因,提供多種解決方案,需要的朋友可以參考下2024-06-06關(guān)于C++虛繼承的內(nèi)存模型問(wèn)題
C++虛繼承的內(nèi)存模型是一個(gè)老生常談的話(huà)題,實(shí)現(xiàn)方法主要依賴(lài)于編譯器,本文從多個(gè)角度通過(guò)代碼詳解C++中虛繼承的內(nèi)存模型知識(shí),感興趣的朋友跟隨小編一起看看吧2021-07-07