《數(shù)據(jù)庫系統(tǒng)概論》實驗報告
實驗題目:通過ODBC方式訪問數(shù)據(jù)庫
實驗環(huán)境:Windows 10、MySQL、SQL Server
實驗步驟
一、MySQL數(shù)據(jù)源配置
1、安裝MySQL的ODBC驅動安裝包
https://dev.mysql.com/downloads/connector/odbc/,選擇32位的8.0.21的msi版本,進行安裝
2、添加驅動程序
打開控制面板
——系統(tǒng)和安全
——管理工具
——ODBC數(shù)據(jù)源(32位)
,在用戶DSN中添加MySQL ODBC 8.0 ANSI Driver
3、配置數(shù)據(jù)源
分別配置數(shù)據(jù)源名字、數(shù)據(jù)源描述(這個隨意)、TCP/IP Server(設為本機)、端口、用戶名、密碼和數(shù)據(jù)庫名,點擊Test
,如果成功則點擊OK
4、注
如果出現(xiàn)了下面的情況,則需要在管理員模式下的命令提示符中使用語句net start 數(shù)據(jù)庫名
將數(shù)據(jù)庫啟動
二、SQL Server數(shù)據(jù)源配置
1、下載并安裝SQL Server
在官網(wǎng)下載SSMS-Setup-CHS.exe
和SQL2019-SSEI-Dev.exe
根據(jù)網(wǎng)上教程進行各種配置
雙擊SQL2019-SSEI-Dev.exe
并根據(jù)網(wǎng)上教程進行各種配置(jdk使用了原來的版本,圖為IDEA的Project Structure中的設置)
使用管理員模式運行SSMS-Setup-CHS.exe
,然后不斷下一步,最后重啟即可完成安裝
2、設置賬戶sa
打開Microsoft SQL Server Management Studio
,在左側的安全性
——登錄名
中找到賬戶sa
右鍵sa,進入屬性
,配置好密碼,服務器角色勾選上sysadmin
3、配置服務器連接
如圖所示,配置服務器連接(我一開始用的是Windows身份認證,遇到了各種連不上的問題)
4、新建查詢
在db_lab7_server數(shù)據(jù)庫下創(chuàng)建一個course表
5、添加驅動程序并配置數(shù)據(jù)源
像MySQL部分一樣,打開 ODBC數(shù)據(jù)源(32位)
,在用戶DSN中添加ODBC Driver 17 for SQL Server
并進行數(shù)據(jù)庫相關信息的配置
三、代碼部分
1、適用于MySQL的代碼
#include <windows.h>
#include <iostream>
#include <assert.h>
#include <sql.h>
#include <sqlext.h>
using namespace std;
int main(){
SQLHENV serverhenv;
SQLHDBC serverhdbc;
SQLHSTMT serverhstmt;
SQLRETURN ret;
SQLCHAR sno[20]={0},sex[20]={0},sname[20]={0},dept[20]={0},classno[20]={0},bdate[30]={0},cno[20]={0},cname[20]={0},semester[10]={10};
SQLINTEGER grade=0,length;
//分配環(huán)境句柄
ret = SQLAllocHandle(SQL_HANDLE_ENV,SQL_NULL_HANDLE,&serverhenv);
//設置環(huán)境屬性
ret = SQLSetEnvAttr(serverhenv,SQL_ATTR_ODBC_VERSION,(void*)SQL_OV_ODBC3,0);
if(!SQL_SUCCEEDED(ret))
{
cout<<"AllocEnvHandle error!"<<endl;
system("pause");
}
//分配連接句柄
ret = SQLAllocHandle(SQL_HANDLE_DBC,serverhenv,&serverhdbc);
if(!SQL_SUCCEEDED(ret))
{
cout<<"AllocDbcHandle error!"<<endl;
system("pause");
}
//MySQL連接
ret = SQLConnect(serverhdbc,(SQLCHAR*)"數(shù)據(jù)庫名",SQL_NTS,(SQLCHAR*)"數(shù)據(jù)庫用戶名",SQL_NTS,(SQLCHAR*)"數(shù)據(jù)庫密碼",SQL_NTS);
if(!SQL_SUCCEEDED(ret))
//if(!(ret == SQL_SUCCESS || ret == SQL_SUCCESS_WITH_INFO))
{
cout<<"SQL_Connect error!"<<endl;
system("pause");
}
//分配執(zhí)行語句句柄
ret = SQLAllocHandle(SQL_HANDLE_STMT,serverhdbc,&serverhstmt);
//執(zhí)行SQL語句
ret=SQLExecDirect(serverhstmt,(SQLCHAR*)"insert into course values('C01','數(shù)據(jù)庫概論',01,6,'秋');",SQL_NTS);
ret=SQLExecDirect(serverhstmt,(SQLCHAR*)"select cno,cname,semester from course",SQL_NTS);
if(ret == SQL_SUCCESS || ret == SQL_SUCCESS_WITH_INFO){
//綁定數(shù)據(jù)
SQLBindCol(serverhstmt,1, SQL_C_CHAR, (void*)cno,sizeof(cno), &length);
SQLBindCol(serverhstmt,2, SQL_C_CHAR, (void*)cname,sizeof(cname), &length);
SQLBindCol(serverhstmt,3, SQL_C_CHAR, (void*)semester,sizeof(semester), &length);
//將光標移動到下行,即獲得下行數(shù)據(jù)
while(SQL_NO_DATA != SQLFetch(serverhstmt))
{
cout<<"cno:"<<cno<<" cname:"<<cname<<" semester:"<<semester;
cout<<endl;
}
}
//釋放語句句柄
ret=SQLFreeHandle(SQL_HANDLE_STMT,serverhstmt);
if(SQL_SUCCESS!=ret && SQL_SUCCESS_WITH_INFO != ret)
cout<<"free hstmt error!"<<endl;
//斷開數(shù)據(jù)庫連接
ret=SQLDisconnect(serverhdbc);
if(SQL_SUCCESS!=ret&&SQL_SUCCESS_WITH_INFO!=ret)
cout<<"disconnected error!"<<endl;
//釋放連接句柄
ret=SQLFreeHandle(SQL_HANDLE_DBC,serverhdbc);
if(SQL_SUCCESS!=ret&&SQL_SUCCESS_WITH_INFO!=ret)
cout<<"free hdbc error!"<<endl;
//釋放環(huán)境句柄句柄
ret=SQLFreeHandle(SQL_HANDLE_ENV,serverhenv);
if(SQL_SUCCESS!=ret&&SQL_SUCCESS_WITH_INFO!=ret)
cout<<"free henv error!"<<endl;
system("pause");
}
2、適用于SQL Server的代碼
#include <windows.h>
#include <iostream>
#include <assert.h>
#include <sql.h>
#include <sqlext.h>
using namespace std;
int main(){
SQLHENV serverhenv;
SQLHDBC serverhdbc;
SQLHSTMT serverhstmt;
SQLRETURN ret;
SQLCHAR sno[20]={0},sex[20]={0},sname[20]={0},dept[20]={0},classno[20]={0},bdate[30]={0},cno[20]={0},cname[20]={0},semester[10]={10};
SQLINTEGER grade=0,length;
//分配環(huán)境句柄
ret = SQLAllocHandle(SQL_HANDLE_ENV,SQL_NULL_HANDLE,&serverhenv);
//設置環(huán)境屬性
ret = SQLSetEnvAttr(serverhenv,SQL_ATTR_ODBC_VERSION,(void*)SQL_OV_ODBC3,0);
if(!SQL_SUCCEEDED(ret))
{
cout<<"AllocEnvHandle error!"<<endl;
system("pause");
}
//分配連接句柄
ret = SQLAllocHandle(SQL_HANDLE_DBC,serverhenv,&serverhdbc);
if(!SQL_SUCCEEDED(ret))
{
cout<<"AllocDbcHandle error!"<<endl;
system("pause");
}
//SQL Server連接
ret = SQLConnect(serverhdbc,(SQLCHAR*)"數(shù)據(jù)庫名",SQL_NTS,(SQLCHAR*)"sa",SQL_NTS,(SQLCHAR*)"數(shù)據(jù)庫密碼",SQL_NTS);
if(!SQL_SUCCEEDED(ret))
//if(!(ret == SQL_SUCCESS || ret == SQL_SUCCESS_WITH_INFO))
{
cout<<"SQL_Connect error!"<<endl;
system("pause");
}
//分配執(zhí)行語句句柄
ret = SQLAllocHandle(SQL_HANDLE_STMT,serverhdbc,&serverhstmt);
//執(zhí)行SQL語句
ret=SQLExecDirect(serverhstmt,(SQLCHAR*)"use db_lab7_server;",SQL_NTS);
ret=SQLExecDirect(serverhstmt,(SQLCHAR*)"insert into course values('C01','數(shù)據(jù)庫概論',01,6,'秋');",SQL_NTS);
ret=SQLExecDirect(serverhstmt,(SQLCHAR*)"select cno,cname,semester from course",SQL_NTS);
if(ret == SQL_SUCCESS || ret == SQL_SUCCESS_WITH_INFO){
//綁定數(shù)據(jù)
SQLBindCol(serverhstmt,1, SQL_C_CHAR, (void*)cno,sizeof(cno), &length);
SQLBindCol(serverhstmt,2, SQL_C_CHAR, (void*)cname,sizeof(cname), &length);
SQLBindCol(serverhstmt,3, SQL_C_CHAR, (void*)semester,sizeof(semester), &length);
//將光標移動到下行,即獲得下行數(shù)據(jù)
while(SQL_NO_DATA != SQLFetch(serverhstmt))
{
cout<<"cno:"<<cno<<" cname:"<<cname<<" semester:"<<semester;
cout<<endl;
}
}
//釋放語句句柄
ret=SQLFreeHandle(SQL_HANDLE_STMT,serverhstmt);
if(SQL_SUCCESS!=ret && SQL_SUCCESS_WITH_INFO != ret)
cout<<"free hstmt error!"<<endl;
//斷開數(shù)據(jù)庫連接
ret=SQLDisconnect(serverhdbc);
if(SQL_SUCCESS!=ret&&SQL_SUCCESS_WITH_INFO!=ret)
cout<<"disconnected error!"<<endl;
//釋放連接句柄
ret=SQLFreeHandle(SQL_HANDLE_DBC,serverhdbc);
if(SQL_SUCCESS!=ret&&SQL_SUCCESS_WITH_INFO!=ret)
cout<<"free hdbc error!"<<endl;
//釋放環(huán)境句柄句柄
ret=SQLFreeHandle(SQL_HANDLE_ENV,serverhenv);
if(SQL_SUCCESS!=ret&&SQL_SUCCESS_WITH_INFO!=ret)
cout<<"free henv error!"<<endl;
system("pause");
}
四、運行結果
? 代碼其實就是執(zhí)行如下指令
insert into course values('C01','數(shù)據(jù)庫概論',01,6,'秋');
1、mysql部分
1)Codeblocks運行結果
2)數(shù)據(jù)庫結果
2、SQL Server部分
1)Codeblocks運行結果
2)數(shù)據(jù)庫結果
五、遇到的問題
一)32位而非64位
?問題:下載了MySQL的64位的8.0.29版本的驅動程序,配置完成后卻連接不到數(shù)據(jù)源
?解決:查詢網(wǎng)上資料,發(fā)現(xiàn)Codeblocks是32位的,需要對應的32位程序才能正常運行,所以下載MySQL的32位的8.0.29版本的驅動程序
二)8.0.21而非8.0.29
?問題:安裝了MySQL的32位的8.0.29版本的驅動程序,創(chuàng)建新數(shù)據(jù)源里卻看不到相關的選項
?解決:由于中途曾經(jīng)配過Ubuntu中的數(shù)據(jù)源,發(fā)現(xiàn)8.0.29版本的驅動程序經(jīng)常出問題,所以改成8.0.21版本的驅動程序
三)無法連接數(shù)據(jù)源
?問題:按照教程配置好數(shù)據(jù)源,代碼卻顯示連接不到數(shù)據(jù)源
?解決:在同學的幫助下,發(fā)現(xiàn)代碼的藍框部分應當填寫數(shù)據(jù)源的名稱(原先填的是數(shù)據(jù)庫名稱)
四)添加use語句
?問題:對于SQL Server,發(fā)現(xiàn)始終無法進入這個if語句之中
?解決:回看MySQL的配置步驟,發(fā)現(xiàn)數(shù)據(jù)源中已經(jīng)寫好了連接的數(shù)據(jù)庫名稱,但是SQL Server并沒有寫明,這就導致了insert語句和select語句執(zhí)行時并沒有進入對應數(shù)據(jù)庫,因此需要加入一條use語句進入數(shù)據(jù)庫(即圖中注釋部分)
五)Ubuntu下安裝部分
? Ubuntu下的安裝,起始于Windows下安裝失敗,決定轉戰(zhàn)Ubuntu,使用Postgresql和MySQL完成實驗,但在配完了MySQL的數(shù)據(jù)源后,發(fā)現(xiàn)代碼部分基本都有include <windows.h>
,尋找良久,沒有好的解決方案,于是重回Windows,下面是Ubuntu下的安裝過程記錄:
1、使用下面語句下載unixodbc及相關軟件包
sudo apt-get install unixodbc
sudo apt-get install unixodbc unixodbc-dev
2、手動下載unixODBC
1)解壓縮
tar xvf unixODBC-2.3.9.tar.gz
2)進入文件夾
cd unixODBC-2.3.9
3)編譯
./configure
make
make install
4)測試安裝結果(安裝成功則顯示版本號和驅動地址)
odbcinst -j
3、使用下面語句安裝數(shù)據(jù)庫
sudo apt-get install mysql-server mysql-client
4、手動安裝驅動程序mysql_odbc_connector
1)剛開始下載最新版的8.0.29
2)不知道啥原因,我用8.0.29會報錯
3)點擊上圖中的Archives,將驅動程序的版本換成8.0.21
5、配置驅動程序
1)使用下面語句打開相關文件(即測試安裝結果中的DRIVERS)
sudo gedit /etc/odbcinst.ini
2)內(nèi)容如下(我這里自動配好的)
[MySQL ODBC 8.0 Unicode Driver]
Driver=/usr/lib/x86_64-linux-gnu/odbc/libmyodbc8w.so
UsageCount=1
[MySQL ODBC 8.0 ANSI Driver]
Driver=/usr/lib/x86_64-linux-gnu/odbc/libmyodbc8a.so
UsageCount=1
6、配置數(shù)據(jù)源
1)使用下面語句打開相關文件(即測試安裝結果中的SYSTEM DATA SOURCES)
sudo gedit /etc/odbc.ini
2)內(nèi)容如下
[MYSQL]
Driver = MySQL ODBC 8.0 ANSI Driver
Description = connection to MYSQL
Server = 127.0.0.1
Host = 127.0.0.1
Port = 3306
Database = mysql
CHARSET = UTF8
User = root
Password = 123456
SSLMODE = DISABLED
7、嘗試連接數(shù)據(jù)庫
發(fā)現(xiàn)無法連接,錯誤如下:
嘗試使用mysql -u root -p進行連接,發(fā)現(xiàn)也無法連接,想起數(shù)據(jù)庫剛安裝,沒有設置root用戶的密碼
8、設置MySQL的root用戶的密碼
1)使用下面指令查找數(shù)據(jù)庫設置的隨機賬戶和密碼
sudo gedit /etc/mysql/debian.cnf
2)使用隨機賬戶debian-sys-maint登錄MySQL(密碼隨機生成,不要修改)
mysql -u debian-sys-maint -p
3)使用下面的SQL語句修改root用戶的密碼
use mysql;
update user set authentication_string='' where user='root';
alter user 'root'@'localhost' identified with mysql_native_password by '123456';
9、再次嘗試連接
? 成功!文章來源:http://www.zghlxwxcb.cn/news/detail-470752.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-470752.html
到了這里,關于《數(shù)據(jù)庫系統(tǒng)概論》實驗7報告的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!