2017-5-5
實驗目的
1.熟悉JDBC的配置和使用
2.熟悉ODBC的配置和使用
3.鞏固SQL的知識
實驗用時:兩次上機
實驗要求
1.對上述的程式,要求除錯成功,在實驗報告中對每個實驗要求的實現程式碼片段、實驗結果顯示等內容截圖並進行說明。
2.分析JDBC程式設計的主要結構。
3.分析ODBC程式設計的主要架構。
4.比較並分析JDBC程式設計與ODBC程式設計的異同點。
5.記錄實驗過程,並對各活動(包括錯誤活動)作分析說明。
實驗內容
一、JDBC的配置與使用:
1.對程式Demo.java做適當修改,使之可以在本地系統上可以執行。然後編譯執行,檢視執行結果。
執行結果如下所示
實驗內容:在dbcourse資料庫上使用JDBC呼叫實現下面的功能:
a)練習executeQuery:從authors表中選出每個學者的名字列(name),性別列(sex),年齡列(age),並在逐行列印出來,每列之間以空格分隔。
程式碼:
long start = System.currentTimeMillis();
ResultSet rs = st.executeQuery("select *from authors");
while (rs.next()) {
System.out.println(rs.getString(1) + "" +
rs.getString("name")+""+rs.getString("sex")+""+rs.getString("age"));
}
long end = System.currentTimeMillis();
System.out.println((end-start)/1000.0 +"s");
rs.close();
結果如下
b)練習executeUpdate:將authors表中所有30-50歲的男性學者的年齡加1,並列印出受影響的行數。
程式碼:
int rowCount = st.executeUpdate("update authors set age=age+1 where sex='男'and age>=30 and age<=50");
System.out.println(rowCount + "行受影響");
c)練習executeBatch:向authors表中使用executeBatch功能向authors表中插入如下兩個資料,並按照示例程式中所示列印兩個受影響行數:
程式碼:
st.addBatch("insert into authors
values('1000000','張三test','男','30')");
st.addBatch("insert into authors values('2000000','李四test','女','40')");
int[] rowCounts = st.executeBatch();
System.out.println(rowCounts[0] + "行受影響");
System.out.println(rowCounts[1] + "行受影響");
d)練習PreparedStatement:使用PreparedStatment方法向authors表中插入如下兩個資料,並按示例程式中所示列印受影響行數:
程式碼:
PreparedStatementps =conn.prepareStatement
("insertinto authors values(?,?,?,?)");//?傳遞引數
ps.setString(1,"3000000");
ps.setString(2,"張三test2");
ps.setString(3,"男");
ps.setString(4,"30");
introwCount = ps.executeUpdate();
System.out.println(rowCount+ "行受影響");
ps.setString(1,"2000000");
ps.setString(2,"李四test2");
ps.setString(3,"女");
ps.setString(4,"40");
rowCount= ps.executeUpdate();
System.out.println(rowCount+ "行受影響");
思考問題:
a)executeQuery,executeUpdate和executeBatch三種方法的區別,各有怎樣的當然適用環境。
b)Statement和PreparedStatement的區別。
二、ODBC的配置與使用:
1.啟動SQLSERVER服務。
2.在dbcourse庫中建立test表(id varchar(200),name varchar(200))。
createtable
test(idvarchar(200),namevarchar(200));
3.依照實驗要求操作建立系統DNS
4.開啟vc6.0
點選檔案->新建->工程->Win32consoleapplication->一個空的工程。
5.在工程中新增原始檔:檔案->新建->文字檔案,檔名寫demo.c,將demo.c程式碼拷入,適當修改程式碼使之能在本地系統上執行,根據程式碼的註釋完成test表的插入、刪除、更新等操作。
對test表的插入SQL語句:
(1)直接執行:
插入一行:
aaa 100
UCHAR sql[37]="insert into testvalues('aaa','100')";
SQLExecDirect (hstmt1,sql,37);
刪除該行:
UCHARsql[37]= "delete from test where id=’aaa’";
SQLExecDirect (hstmt1,sql,37);
更改操作:
UCHARsql[37] = "update test set name=’300’ where id=’bbb’";
SQLExecDirect (hstmt1,sql,37);
(id為bbb的name屬性都被改成了300)
(2)引數編譯執行
插入:
UCHAR pre_sql[37] = "insert into testvalues(‘ccc’,’666’)";
p = SQL_NTS; //1預編譯
SQLPrepare(hstmt1,pre_sql,37);//第三個引數與陣列大小相同,而不是資料庫列相同
SQLBindParameter(hstmt1,1,SQL_PARAM_INPUT,SQL_C_CHAR,SQL_CHAR,200,0,&a,0,&p);SQLBindParameter(hstmt1,2,SQL_PARAM_INPUT,SQL_C_CHAR,SQL_CHAR,200,0,&b,0,&p);//3執行
SQLExecute(hstmt1);
刪除:
UCHAR pre_sql[37] = "delete from test whereid='ccc'";
p = SQL_NTS; //1預編譯
SQLPrepare(hstmt1,pre_sql,37);//第三個引數與陣列大小相同,而不是資料庫列相同
SQLBindParameter(hstmt1,1,SQL_PARAM_INPUT,SQL_C_CHAR,SQL_CHAR,200,0,&a,0,&p);SQLBindParameter(hstmt1,2,SQL_PARAM_INPUT,SQL_C_CHAR,SQL_CHAR,200,0,&b,0,&p);//3執行
SQLExecute(hstmt1);
更改;
UCHAR pre_sql[50] = "update test setname=’666’
where id=’bbb’";
p = SQL_NTS;//1預編譯
SQLPrepare(hstmt1,pre_sql,50);//第三個引數與陣列大小相同,而不是資料庫列相同
SQLBindParameter(hstmt1,1,SQL_PARAM_INPUT,SQL_C_CHAR,SQL_CHAR,200,0,&a,0,&p);SQLBindParameter(hstmt1,2,SQL_PARAM_INPUT,SQL_C_CHAR,SQL_CHAR,200,0,&b,0,&p);//3執行
SQLExecute(hstmt1);
執行結果如下:
(3)通過查閱資料比較直接執行方式和引數預編譯執行方式的不同
直接執行方式是直接對語句逐步分析解釋且立即執行
引數預編譯方式是將源程式分為編譯與執行兩個階段,即先對語句進行翻譯,然後再執行
三、分析JDBC程式設計的主要結構
1.載入驅動
2.建立連線
3.建立statement
4.執行SQL
5.關閉連線
四、分析ODBC程式設計的主要架構
1.分配環境控制程式碼
2.分配連線控制程式碼
3.建立資料來源
4.分配語句控制程式碼
5.執行SQL語句
6.結束應用程式
7.錯誤處理
五、比較並分析JDBC程式設計與ODBC程式設計的異同點
對於支援SQL語言的異構資料庫系統,JDBC和ODBC就提供了訪問其異構成員的統一的方式。
ODBC
ODBC(Open DataBase Connectivity)是微軟倡導的、當前被業界廣泛接受的、用於資料庫訪問的應用程式程式設計介面(API),它以X/Open和ISO/IEC的呼叫級介面(CLI)規範為基礎,並使用結構化查詢語言(SQL)作為其資料庫訪問語言。
它包括四個元件:
1,應用程式 執行並呼叫ODBC API函式,以提交SQL語句和檢索結果。
2,驅動程式管理器 根據應用程式的需要載入/解除安裝驅動程式,處理ODBC函式呼叫,並把它送入驅動程式。
3,驅動程式 處理ODBC函式呼叫,並把SQL請求提交給一個指定的資料來源,並返回結果集給應用程式。
4,資料來源 包括要訪問的資料及其相關的作業系統,DBMS及用於訪問DBMS的網路平臺。
ODBC驅動程式把應用程式從具體的資料庫呼叫中隔離出來,驅動程式管理器針對特定資料庫的各個驅動程式進行集中管理,並嚮應用程式提供統一的標準介面。
其實這些東西說白了,就是開發了一箇中介軟體,將兩個耦合度高的東西松開了。其實以前要寫的訪問不同資料庫的東西現在都變成了不同的驅動程式而已。相當於把那些程式碼提出來以便重用。
JDBC
JDBC(Java DataBase Connectivity)是Java與資料庫的介面規範,JDBC定義了一個支援標準SQL功能的通用低層的應用程式程式設計介面(API),它由Java語言編寫的類和介面組成,旨在讓各資料庫開發商為Java程式設計師提供標準的資料庫API。
它也包括四個元件,而且其原理與ODBC是一樣的。都是通過驅動程式管理器載入不同的驅動程式來訪問不同的資料庫系統。
不同之處在於:
ODBC是用C來寫的,而JDBC是用JAVA來寫的,這就造就了他們之間一個很大的不同。用JAVA寫的JDBC具有很強的移植性,而ODBC不具備這種特性。
引用:
JDBC除了具有ODBC的上述特點外,更具有對硬體平臺、作業系統異構性的支援。這主要是因為ODBC使用的是C語言,而JDBC使用的是Java語言。Java語言具有與平臺無關、移植性強、安全性高、穩定性好、分散式、物件導向等眾多優點,而JDBC確保了“100%純Java”的解決方案,利用Java的平臺無關性,JDBC應用程式可以自然地實現跨平臺特性,因而更適合於Internet上異構環境的資料庫應用。
相同之處:
除了原理相同外,JDBC和ODBC還有其他相同之處,下面的JDBC同樣具有
ODBC是為最大的互用性而設計的,要求一個應用程式有用相同的原始碼(不用重新編譯或重新連結)訪問不同的資料庫管理系統(DBMS)的能力,這體現了ODBC的資料庫獨立性。
六、遇到的問題
1.在設定SQL ServerBrower時出現了“遠端過程呼叫失敗”的問題,詢問後發現是不相容的問題,所以在刪除Microsoft SQLServer2012
express local DB後,就可以設定了。
2.在做ODBC配置與使用的實驗時,前幾次按照實驗指導書進行配置,最終程式碼執行的結果都是“連線失敗”。最後發現應該把配置的“系統DSN”換成“使用者DSN”即可連線成功