Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537
DO.NET 也是 .NET 框架的組成部分。ADO.NET 用于處理數(shù)據(jù)訪問。通過 ADO.NET,您可以操作數(shù)據(jù)庫。
數(shù)據(jù)庫連接 - 綁定到 DataList 控件
數(shù)據(jù)庫連接 - 綁定到 Repeater 控件
什么是 ADO.NET?
ADO.NET 是 .NET 框架的組成部分
ADO.NET 由一系列用于處理數(shù)據(jù)訪問的類組成
ADO.NET 完全基于 XML
ADO.NET 沒有 Recordset 對(duì)象,這一點(diǎn)與 ADO 不同
創(chuàng)建數(shù)據(jù)庫連接
在我們的實(shí)例中,我們將使用 Northwind 數(shù)據(jù)庫。
首先,導(dǎo)入 "System.Data.OleDb" 命名空間。我們需要這個(gè)命名空間來操作 Microsoft Access 和其他 OLE DB 數(shù)據(jù)庫提供商。我們將在 Page_Load 子例程中創(chuàng)建這個(gè)數(shù)據(jù)庫的連接。我們創(chuàng)建一個(gè) dbconn 變量,并為其賦值一個(gè)新的 OleDbConnection 類,這個(gè)類帶有指示 OLE DB 提供商和數(shù)據(jù)庫位置的連接字符串。然后我們打開數(shù)據(jù)庫連接:
<%@ Import Namespace="System.Data.OleDb" %>
<script runat="server">
sub Page_Load
dim dbconn
dbconn=New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;
data source=" & server.mappath("northwind.mdb"))
dbconn.Open()
end sub
</script>
注釋:這個(gè)連接字符串必須是沒有折行的連續(xù)字符串!
創(chuàng)建數(shù)據(jù)庫命令
為了指定需從數(shù)據(jù)庫取回的記錄,我們將創(chuàng)建一個(gè) dbcomm 變量,并為其賦值一個(gè)新的 OleDbCommand 類。這個(gè) OleDbCommand 類用于發(fā)出針對(duì)數(shù)據(jù)庫表的 SQL 查詢:
<%@ Import Namespace="System.Data.OleDb" %>
<script runat="server">
sub Page_Load
dim dbconn,sql,dbcomm
dbconn=New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;
data source=" & server.mappath("northwind.mdb"))
dbconn.Open()
sql="SELECT * FROM customers"
dbcomm=New OleDbCommand(sql,dbconn)
end sub
</script>
創(chuàng)建 DataReader
OleDbDataReader 類用于從數(shù)據(jù)源中讀取記錄流。DataReader 是通過調(diào)用 OleDbCommand 對(duì)象的 ExecuteReader 方法來創(chuàng)建的:
<%@ Import Namespace="System.Data.OleDb" %>
<script runat="server">
sub Page_Load
dim dbconn,sql,dbcomm,dbread
dbconn=New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;
data source=" & server.mappath("northwind.mdb"))
dbconn.Open()
sql="SELECT * FROM customers"
dbcomm=New OleDbCommand(sql,dbconn)
dbread=dbcomm.ExecuteReader()
end sub
</script>
綁定到 Repeater 控件
然后,我們綁定 DataReader 到 Repeater 控件:
實(shí)例
<%@ Import Namespace="System.Data.OleDb" %>
<script runat="server">
sub Page_Load
dim dbconn,sql,dbcomm,dbread
dbconn=New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;
data source=" & server.mappath("northwind.mdb"))
dbconn.Open()
sql="SELECT * FROM customers"
dbcomm=New OleDbCommand(sql,dbconn)
dbread=dbcomm.ExecuteReader()
customers.DataSource=dbread
customers.DataBind()
dbread.Close()
dbconn.Close()
創(chuàng)建測試數(shù)據(jù)
接下來我們?cè)?MySQL 中創(chuàng)建 RUNOOB 數(shù)據(jù)庫,并創(chuàng)建 websites 數(shù)據(jù)表,表結(jié)構(gòu)如下:
CREATE TABLE `websites` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` char(20) NOT NULL DEFAULT '' COMMENT '站點(diǎn)名稱',
`url` varchar(255) NOT NULL DEFAULT '',
`alexa` int(11) NOT NULL DEFAULT '0' COMMENT 'Alexa 排名',
`country` char(10) NOT NULL DEFAULT '' COMMENT '國家',
PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8;
插入一些數(shù)據(jù):
INSERT INTO `websites` VALUES ('1', 'Google', 'https://www.google.cm/', '1', 'USA'), ('2', '淘寶', 'https://www.taobao.com/', '13', 'CN'), ('3', '菜鳥教程', 'http://www.runoob.com', '5892', ''), ('4', '微博', 'http://weibo.com/', '20', 'CN'), ('5', 'Facebook', 'https://www.facebook.com/', '3', 'USA');
數(shù)據(jù)表顯示如下:
SELECT操作
接下來的這個(gè)例子告訴我們?nèi)绾问褂肑STL SQL標(biāo)簽來運(yùn)行SQL SELECT語句:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%><%@ page import="java.io.*,java.util.*,java.sql.*"%><%@ page import="javax.servlet.http.*,javax.servlet.*" %><%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%><%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql"%>
<html><head><title>SELECT 操作</title></head><body><!--
JDBC 驅(qū)動(dòng)名及數(shù)據(jù)庫 URL
數(shù)據(jù)庫的用戶名與密碼,需要根據(jù)自己的設(shè)置
useUnicode=true&characterEncoding=utf-8 防止中文亂碼
--><sql:setDataSource var="snapshot" driver="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/RUNOOB?useUnicode=true&characterEncoding=utf-8"
user="root" password="123456"/>
<sql:query dataSource="${snapshot}" var="result">SELECT * from websites;</sql:query><h1>JSP 數(shù)據(jù)庫實(shí)例 - 菜鳥教程</h1><table border="1" width="100%"><tr>
<th>ID</th>
<th>站點(diǎn)名</th>
<th>站點(diǎn)地址</th></tr><c:forEach var="row" items="${result.rows}"><tr>
<td><c:out value="${row.id}"/></td>
<td><c:out value="${row.name}"/></td>
<td><c:out value="${row.url}"/></td></tr></c:forEach></table>
</body></html>
訪問這個(gè)JSP例子,運(yùn)行結(jié)果如下:
INSERT操作
這個(gè)例子告訴我們?nèi)绾问褂肑STL SQL標(biāo)簽來運(yùn)行SQL INSERT語句:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%><%@ page import="java.io.*,java.util.*,java.sql.*"%><%@ page import="javax.servlet.http.*,javax.servlet.*" %><%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%><%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql"%>
<html><head><title>SELECT 操作</title></head><body><!--
JDBC 驅(qū)動(dòng)名及數(shù)據(jù)庫 URL
數(shù)據(jù)庫的用戶名與密碼,需要根據(jù)自己的設(shè)置
useUnicode=true&characterEncoding=utf-8 防止中文亂碼
--><sql:setDataSource var="snapshot" driver="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/RUNOOB?useUnicode=true&characterEncoding=utf-8"
user="root" password="123456"/><!--
插入數(shù)據(jù)
--><sql:update dataSource="${snapshot}" var="result">INSERT INTO websites (name,url,alexa,country) VALUES ('菜鳥教程移動(dòng)站', 'http://m.runoob.com', 5093, 'CN');</sql:update><sql:query dataSource="${snapshot}" var="result">SELECT * from websites;</sql:query><h1>JSP 數(shù)據(jù)庫實(shí)例 - 菜鳥教程</h1><table border="1" width="100%"><tr>
<th>ID</th>
<th>站點(diǎn)名</th>
<th>站點(diǎn)地址</th></tr><c:forEach var="row" items="${result.rows}"><tr>
<td><c:out value="${row.id}"/></td>
<td><c:out value="${row.name}"/></td>
<td><c:out value="${row.url}"/></td></tr></c:forEach></table>
</body></html>
訪問這個(gè)JSP例子,運(yùn)行結(jié)果如下:
DELETE操作
這個(gè)例子告訴我們?nèi)绾问褂肑STL SQL標(biāo)簽來運(yùn)行SQL DELETE語句:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%><%@ page import="java.io.*,java.util.*,java.sql.*"%><%@ page import="javax.servlet.http.*,javax.servlet.*" %><%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%><%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql"%>
<html><head><title>SELECT 操作</title></head><body><!--
JDBC 驅(qū)動(dòng)名及數(shù)據(jù)庫 URL
數(shù)據(jù)庫的用戶名與密碼,需要根據(jù)自己的設(shè)置
useUnicode=true&characterEncoding=utf-8 防止中文亂碼
--><sql:setDataSource var="snapshot" driver="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/RUNOOB?useUnicode=true&characterEncoding=utf-8"
user="root" password="123456"/><!--
刪除 ID 為 11 的數(shù)據(jù)
--><sql:update dataSource="${snapshot}" var="count">
DELETE FROM websites WHERE Id = ? <sql:param value="" /></sql:update><sql:query dataSource="${snapshot}" var="result">SELECT * from websites;</sql:query><h1>JSP 數(shù)據(jù)庫實(shí)例 - 菜鳥教程</h1><table border="1" width="100%"><tr>
<th>ID</th>
<th>站點(diǎn)名</th>
<th>站點(diǎn)地址</th></tr><c:forEach var="row" items="${result.rows}"><tr>
<td><c:out value="${row.id}"/></td>
<td><c:out value="${row.name}"/></td>
<td><c:out value="${row.url}"/></td></tr></c:forEach></table>
</body></html>
訪問這個(gè)JSP例子,運(yùn)行結(jié)果如下:
UPDATE操作
這個(gè)例子告訴我們?nèi)绾问褂肑STL SQL標(biāo)簽來運(yùn)行SQL UPDATE語句:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%><%@ page import="java.io.*,java.util.*,java.sql.*"%><%@ page import="javax.servlet.http.*,javax.servlet.*" %><%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%><%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql"%>
<html><head><title>SELECT 操作</title></head><body><!--
JDBC 驅(qū)動(dòng)名及數(shù)據(jù)庫 URL
數(shù)據(jù)庫的用戶名與密碼,需要根據(jù)自己的設(shè)置
useUnicode=true&characterEncoding=utf-8 防止中文亂碼
--><sql:setDataSource var="snapshot" driver="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/RUNOOB?useUnicode=true&characterEncoding=utf-8"
user="root" password="123456"/><!--
修改 ID 為 3 的名字:菜鳥教程改為 RUNOOB
--><c:set var="SiteId" value="3"/>
<sql:update dataSource="${snapshot}" var="count">
UPDATE websites SET name = 'RUNOOB' WHERE Id = ? <sql:param value="${SiteId}" /></sql:update><sql:query dataSource="${snapshot}" var="result">SELECT * from websites;</sql:query><h1>JSP 數(shù)據(jù)庫實(shí)例 - 菜鳥教程</h1><table border="1" width="100%"><tr>
<th>ID</th>
<th>站點(diǎn)名</th>
<th>站點(diǎn)地址</th></tr><c:forEach var="row" items="${result.rows}"><tr>
<td><c:out value="${row.id}"/></td>
<td><c:out value="${row.name}"/></td>
<td><c:out value="${row.url}"/></td></tr></c:forEach></table>
</body></html>
訪問這個(gè)JSP例子,運(yùn)行結(jié)果如下:
如您還有不明白的可以在下面與我留言或是與我探討QQ群308855039,我們一起飛!
. ODBC數(shù)據(jù)庫接口
ODBC即開放式數(shù)據(jù)庫互連(Open Database Connectivity),是微軟公司推出的一種實(shí)現(xiàn)應(yīng)用程序和關(guān)系數(shù)據(jù)庫之間通訊的接口標(biāo)準(zhǔn)。符合標(biāo)準(zhǔn)的數(shù)據(jù)庫就可以通過SQL語言編寫的命令對(duì)數(shù)據(jù)庫進(jìn)行操作,但只針對(duì)關(guān)系數(shù)據(jù)庫。目前所有的關(guān)系數(shù)據(jù)庫都符合該標(biāo)準(zhǔn)(如SQL Server,Oracle,Access,Excel等)。ODBC本質(zhì)上是一組數(shù)據(jù)庫訪問API(應(yīng)用程序編程接口),由一組函數(shù)調(diào)用組成,核心是SQL語句,其結(jié)構(gòu)如圖1.8所示:
圖 1.8 ODBC數(shù)據(jù)庫接口
1.3.1 數(shù)據(jù)庫的連接方式
2. OLE DB數(shù)據(jù)庫接口
OLE DB即數(shù)據(jù)庫鏈接和嵌入對(duì)象(Object Linking and Embedding DataBase)。OLE DB是微軟提出的基于COM思想且面向?qū)ο蟮囊环N技術(shù)標(biāo)準(zhǔn),目的是提供一種統(tǒng)一的數(shù)據(jù)訪問接口訪問各種數(shù)據(jù)源,這里所說的“數(shù)據(jù)”除了標(biāo)準(zhǔn)的關(guān)系型數(shù)據(jù)庫中的數(shù)據(jù)之外,還包括郵件數(shù)據(jù)、Web上的文本或圖形、目錄服務(wù)(DirectoryServices)、以及主機(jī)系統(tǒng)中的文件和地理數(shù)據(jù)以及自定義業(yè)務(wù)對(duì)象等。OLE DB標(biāo)準(zhǔn)的核心內(nèi)容就是提供一種相同的訪問接口,使得數(shù)據(jù)的使用者(應(yīng)用程序)可以使用同樣的方法訪問各種數(shù)據(jù),而不用考慮數(shù)據(jù)的具體存儲(chǔ)地點(diǎn)、格式或類型,其結(jié)構(gòu)圖如圖1.9所示:
圖1.9 OLE DB數(shù)據(jù)庫接口
1.3.1 數(shù)據(jù)庫的連接方式
3. ADO數(shù)據(jù)庫接口
ADO(ActiveX Data Objects)是微軟公司開發(fā)的基于COM的數(shù)據(jù)庫應(yīng)用程序接口,通過ADO連接數(shù)據(jù)庫,可以靈活地操作數(shù)據(jù)庫中的數(shù)據(jù)。
圖1.10展示了應(yīng)用程序通過ADO訪問SQL Server數(shù)據(jù)庫接口。從圖中可看出,使用ADO訪問SQL Server數(shù)據(jù)庫有兩種途徑:一種是通過ODBC驅(qū)動(dòng)程序,另一種是通過SQL Server專用的OLE DBProvider,后者有更高的訪問效率。
圖1.10 ADO訪問SQLServer的接口
1.3.1 數(shù)據(jù)庫的連接方式
4. ADO.NET數(shù)據(jù)庫接口
ASP.Net使用 ADO.NET 數(shù)據(jù)模型。該模型從ADO 發(fā)展而來,但它不只是對(duì) ADO的改進(jìn),而是采用了一種全新的技術(shù)。主要表現(xiàn)在以下幾個(gè)方面:
● ADO.NET 不是采用ActiveX 技術(shù),而是與.NET框架緊密結(jié)合的產(chǎn)物。
● ADO.NET 包含對(duì) XML標(biāo)準(zhǔn)的完全支持,這對(duì)于跨平臺(tái)交換數(shù)據(jù)具有重要的意義。
● ADO.NET 既能在與數(shù)據(jù)源連接的環(huán)境下工作,又能在斷開與數(shù)據(jù)源連接的條件下工作。特別是后者,非常適合于網(wǎng)絡(luò)應(yīng)用的需要。因?yàn)樵诰W(wǎng)絡(luò)環(huán)境下,保持與數(shù)據(jù)源連接,不符合網(wǎng)站的要求,不僅效率低,付出的代價(jià)高,而且常常會(huì)引發(fā)由于多個(gè)用戶同時(shí)訪問時(shí)帶來的沖突。因此 ADO.NET 系統(tǒng)集中主要精力用于解決在斷開與數(shù)據(jù)源連接的條件下數(shù)據(jù)處理的問題。
ADO.NET 提供了面向?qū)ο蟮臄?shù)據(jù)庫視圖,并且在 ADO.NET 對(duì)象中封裝了許多數(shù)據(jù)庫屬性和關(guān)系。最重要的是,ADO.NET 通過很多方式封裝和隱藏了很多數(shù)據(jù)庫訪問的細(xì)節(jié)。可以完全不知道對(duì)象在與 ADO.NET 對(duì)象交互,也不用擔(dān)心數(shù)據(jù)移動(dòng)到另外一個(gè)數(shù)據(jù)庫或者從另一個(gè)數(shù)據(jù)庫獲得數(shù)據(jù)的細(xì)節(jié)問題。如圖1.11顯示了 ADO.NET架構(gòu)總覽。
1.3.1 數(shù)據(jù)庫的連接方式
圖1.11 通過ADO.NET訪問數(shù)據(jù)庫的接口模型
1.3.1 數(shù)據(jù)庫的連接方式
5. JDBC數(shù)據(jù)庫接口
JDBC(JavaData Base Connectivity)是JavaSoft公司開發(fā)的,一組Java語言編寫的用于數(shù)據(jù)庫連接和操作的類和接口,可為多種關(guān)系數(shù)據(jù)庫提供統(tǒng)一的訪問方式。通過JDBC完成對(duì)數(shù)據(jù)庫的訪問包括四個(gè)主要組件:Java應(yīng)用程序、JDBC驅(qū)動(dòng)器管理器、驅(qū)動(dòng)器和數(shù)據(jù)源。
在JDBC?API中有兩層接口:應(yīng)用程序?qū)雍万?qū)動(dòng)程序?qū)樱罢呤归_發(fā)人員可以通過SQL調(diào)用數(shù)據(jù)庫和取得結(jié)果,后者處理與具體數(shù)據(jù)庫驅(qū)動(dòng)程序的所有通訊。
使用JDBC接口對(duì)數(shù)據(jù)庫操作有如下優(yōu)點(diǎn):
(1).JDBC?API與ODBC十分相似,有利于用戶理解;
(2)使編程人員從復(fù)雜的驅(qū)動(dòng)器調(diào)用命令和函數(shù)中解脫出來,而致力于應(yīng)用程序功能的實(shí)現(xiàn);
(3)JDBC支持不同的關(guān)系數(shù)據(jù)庫,增強(qiáng)了程序的可移植性。
使用JDBC的主要缺點(diǎn):訪問數(shù)據(jù)記錄的速度會(huì)受到一定影響,此外,由于JDBC結(jié)構(gòu)中包含了不同廠家的產(chǎn)品,這給數(shù)據(jù)源的更改帶來了較大麻煩。
4. 數(shù)據(jù)庫連接池技術(shù)
對(duì)于網(wǎng)絡(luò)環(huán)境下的數(shù)據(jù)庫應(yīng)用,由于用戶眾多,使用傳統(tǒng)的JDBC方式進(jìn)行數(shù)據(jù)庫連接,系統(tǒng)資源開銷過大成為制約大型企業(yè)級(jí)應(yīng)用效率的瓶頸,采用數(shù)據(jù)庫連接池技術(shù)對(duì)數(shù)據(jù)庫連接進(jìn)行管理,可以大大提高系統(tǒng)的效率和穩(wěn)定性。
1.3.2 客戶/服務(wù)器(C/S)模式應(yīng)用系統(tǒng)
Microsoft公司開發(fā)的SQL Server數(shù)據(jù)庫管理系統(tǒng)當(dāng)前最流行的版本仍然是SQL Server2000,本書介紹SQL Server2000。
數(shù)據(jù)庫管理系統(tǒng)通過命令和適合專業(yè)人員的界面操作數(shù)據(jù)庫。對(duì)于SQL Server2000數(shù)據(jù)庫管理系統(tǒng),用戶在SQL Server 2000的查詢分析器中輸入SQL命令,系統(tǒng)執(zhí)行的結(jié)果返回到查詢分析器上顯示。用戶可以直接通過SQL Server 2000的企業(yè)管理器的界面操作數(shù)據(jù)庫。
圖1.12 數(shù)據(jù)庫應(yīng)用程序與數(shù)據(jù)庫、數(shù)據(jù)庫管理系統(tǒng)之間的關(guān)系
1.3.3 三層客戶/服務(wù)器(B/S)模式應(yīng)用系統(tǒng)
基于Web的數(shù)據(jù)庫應(yīng)用采用三層客戶/服務(wù)器模式,也稱B/S結(jié)構(gòu)。第一層為瀏覽器,第二層為Web服務(wù)器,第三層為數(shù)據(jù)庫服務(wù)器。瀏覽器是用戶輸入數(shù)據(jù)和顯示結(jié)果的交互界面,用戶在瀏覽器表單中輸入數(shù)據(jù),然后將表單中的數(shù)據(jù)提交并發(fā)送到Web服務(wù)器,Web服務(wù)器應(yīng)用程序接受并處理用戶的數(shù)據(jù),通過數(shù)據(jù)庫服務(wù)器,從數(shù)據(jù)庫中查詢需要的數(shù)據(jù)(或把數(shù)據(jù)錄入數(shù)據(jù)庫)送Web服務(wù)器,Web服務(wù)器把返回的結(jié)果插入HTML頁面,傳送到客戶端,在瀏覽器中顯示出來。如圖1.13所示。
1.3.3 三層客戶/服務(wù)器(B/S)模式應(yīng)用系統(tǒng)
基于Web的數(shù)據(jù)庫應(yīng)用采用三層客戶/服務(wù)器模式,也稱B/S結(jié)構(gòu)。第一層為瀏覽器,第二層為Web服務(wù)器,第三層為數(shù)據(jù)庫服務(wù)器。瀏覽器是用戶輸入數(shù)據(jù)和顯示結(jié)果的交互界面,用戶在瀏覽器表單中輸入數(shù)據(jù),然后將表單中的數(shù)據(jù)提交并發(fā)送到Web服務(wù)器,Web服務(wù)器應(yīng)用程序接受并處理用戶的數(shù)據(jù),通過數(shù)據(jù)庫服務(wù)器,從數(shù)據(jù)庫中查詢需要的數(shù)據(jù)(或把數(shù)據(jù)錄入數(shù)據(jù)庫)送Web服務(wù)器,Web服務(wù)器把返回的結(jié)果插入HTML頁面,傳送到客戶端,在瀏覽器中顯示出來。如圖1.13所示。
*請(qǐng)認(rèn)真填寫需求信息,我們會(huì)在24小時(shí)內(nèi)與您取得聯(lián)系。