《C#語言和數據庫技術基礎》
第一章
1..NET Framework 框架
2.sharp 尖銳,強烈的
3.application 應用程序
4.developer 開發者
5.network 網絡
6.build 建立,構造
7.console 控制台
8.debug 調試
9.namespace 命名空間
10.project 項目
11.solution 解決方案
12.watch 監視
第二章
1.break 中斷
2.continue 繼續
3.switch 開關,選擇結構
4.array 數組
5.each 每個
6.while 一會兒,時間
第三章
1.private 私人
2.public 公開
3.get 得到
4.set 設置
5.value 價值
6.this 這,這個
7.property 屬性
8.ref 參考
第四章
1.format 格式
2.equals 等於
3.convert 轉換
4.index 索引
5.join 加入
6.split 分裂
7.substring 子鏈,連接
8.trim 修剪,整理
第六章
1.database 數據庫
2.edition 版本
3.studio 工作室
4.analysis 分析
5.table 表
6.relationship 關系
7.management 管理
8.administrator 管理員
9.record 記錄
10.row 行
11.entity 實體
12.transaction 事物
13.DBMS 數據庫管理系統
14.DBS 數據庫系統
15.DBA 數據庫管理員
第七章
1.constraint 約束
2.primary 初級
3.binary 二進制
4.foreign 國外的有
5.check 檢查
6.course 課程
7.score 評分
第八章
1.structured 結構
2.query 查詢
3.language 語言
4.transact 辦理
5.insert 插入
6.update 更新
7.delete 刪除
8.truncate 截斷
9.employee 員工人數
10.default 默認
11.manipulation 操縱
12.definition 定義
第九章
1.recordset 記錄設置
2.order 訂購
3.null 空
4.trim 修剪
5.replace 替換
6.floor 樓層
7.ceiling 天花板
8.round 回合
9.convert 轉換
10.length 長度
第十章
1.between 在…之間
2.business 業務范圍
3.count 計數
4.landlord 房東
5.exchange 交流
6.salary 工資
7.education 教育
第十一章
1.group 組
2.join 加入
3.left 左
4.right 右
5.outer 外
6.client 客戶端
第十三章
1.online 在線
2.nickname 昵稱
3.province 省
4.relation 關系
5.base 基地
6.master 主人,雇主
第十四章
1.active 活動
2.object 爸爸,對象
3.connection 連接
3.command 命令
4.execute 執行
5.query 查詢
6.scalar 標量
第十五章
1.operation 操作
2.read 閱讀
3.append 附加
4.manager 經理
5.grade 等級
第十七章
1.primary 初級
2.reference 參考
3.check 檢查
4.handle 句柄,把柄
5.online 在線
6.level 級別
第一章
第一個C#程序
本章技能目標
1.掌握簡單C#程序的開發步驟
2.掌握C#中的變量類型及命名規則
3.使用Console類實現控制台輸入輸出信息
4.掌握C#中定義類、對象和方法的語法
★1..NET與C#
1..NET概述與C#應用
2.ID環境
★2.第一個C#程序
▲1.新建程序
1.啟動Visual Studio 2012
2.新建項目
3.生成可執行文件
4.開始運行
新建項目
1.在Visual Studio 菜單欄中選擇“文件”→“項目”選項,打開“新建項目”
2.在左側的項目類型中選擇“Visual C#”,在右側的模板列表中選擇
“控制台應用程序”。
3.在“名稱”中輸入“HelloWorld”。
4.為項目選擇一個保存的位置,例如D:\。
5.在Main()方法中添加如下代碼。
Console.WriteLine(“Hello World”);
Console.ReadLine();
經驗
1.運行的快捷鍵:F5:啟動。
2.運行的快捷鍵:Ctrl+F5:開始執行不調試。
★3.認識控制台應用程序文件夾的結構
看不到解決方案資源管理器怎么辦?
1.在Visual Studio的菜單中選擇 “視圖”→ “解決方案資源管理器”選項,
就可以顯示了,快捷鍵為Ctrl+Alt+L。
2.在Visual Studio的菜單中選擇 “工具” → “選項”選項,打開 “選項”
對話框,在左邊選擇“項目和解決方案”,在右邊選中“總是顯示解決方案”
復選框即可。1.在Visual Studio的菜單中選擇 “視圖”→ “解決方案資源
管理器”選項,就可以顯示了,快捷鍵為Ctrl+Alt+L。
3.在Visual Studio的菜單中選擇 “工具” → “選項”選項,打開 “選項”
對話框,在左邊選擇“項目和解決方案”,在右邊選中“總是顯示解決方案”
復選框即可。
★4.認識C#程序
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace HelloWorld
{
class Program
{
static void Main(string[ ] args)
{
Console.WriteLine("Hello World");
Console.ReadLine();
}
}
}
1.namespace
namespace(命名空間)是C#中組織代碼的方式,它的作用類似於Java中的package
(包)。
2.using
在Java中,如果導入其他包,應該使用import。而在C#中,使用using來引用其
他命名空間。
3.class
與Java一樣
4.Main()方法
與Java一樣,但C#中的Main()方法首字母必須大定民,Main()方法的返回值可以
是void或者int類型。
C# 的 Main( ) 方法
Main 首字母大寫
返回值可以為 void 或者 int
命令行參數是可選的
四種 Main() 方法:
static void Main ( string[ ] args ) { }
static int Main ( string[ ] args ) { }
static void Main ( ) { }
static int Main ( ) { }
對比:
組織代碼方式:C#使用命名空間(namespace),Java使用包(package)
引入命名空間或包的關鍵字:C#使用using,Java使用import
程序入口:C#的Main()有四種形式,Java的main()有一種形式。
★5.C#中的變量和常量
1.C#中數據類型
常用數據類型
Java C#
整型 int int
浮點型 float float
字符串 String string
布爾型 boolean bool
2.C#中的變量
語法:
數據類型 變量名稱;
C#的變量命名規則:
C#的變量命名規則與Java也基本相同,只是“$”符號在C#中是不能使用的,因此變
量的命名規則可以簡單總結為以下三條。
1.組成:52個英文字母(A~Z,a~z),10個數字(0~9),下划線(_),除此之
外不能含有其他的字符。
2.開頭:只能以字母或下划線開頭。
3.不能使用的:不能是C#中的關鍵字。
C#的變量的命名規范:
1.變量的名稱要有意義
2.避免使用單個字符作為變量名
3.當使用多個單詞組成變量名時,應該使用駱駝(Camel)命名法。
★6.為什么使用常量
下面代碼的輸出結果是什么?
static void Main(string[] args)
{
int dayMax = 7;
int today = 1;
Console .WriteLine("一周有幾天:" );
Console .WriteLine(dayMax );
Console .WriteLine("今天是周:" );
dayMax = dayMax +1;
Console .WriteLine(dayMax );
}
語法正確可邏輯錯誤如何避免?
使用常量可以很容易的避免這種錯誤
★7.什么是常量
const 數據類型 常量名稱 = 值;
常量命名規則:
1.有意義
2.均大寫
3.長度不宜長
什么時候使用常量?
1.多處用到(用於在程序中被經常引用的值)
2.其值不易理解(例如一個程序中多次用到的值0或1)
3.其值不變(用於在程序中一旦設定就不允許被修改的值)
★8.Console類
向控制台輸出:
Console.WriteLine()方法——輸出后換行
Console.Write()方法——輸出后不換行
從控制台讀入:
Console.ReadLine();
返回值為string類型
向控制台輸出的幾種方式
Console.WriteLine();// 相當於換行
Console.WriteLine(要輸出的值);// 輸出一個值
Console.WriteLine("格式字符串", 變量列表);
string course = "C#"; //課程名稱
……
Console.WriteLine( "我的課程名稱是:" + course);
Console.WriteLine( "我的課程名稱是:{0}" , course );
Console.ReadLine();
{0}:占位符
依次使用{0}、{1}、{2}…與變量列表中的變量對應
可以在字符串中使用 \n 、 \t 來控制換行或制表
讀取一行並返回字符串( string) 類型
Console.ReadLine( );
讀取整數
int.Parse (Console.ReadLine());//表示將字符串轉換為整數
★9.類和對象
什么是方法?使用方法有什么好處?
類的行為,便於修改、增加可讀性、可重用、封裝…
訪問修飾符 返回類型 方法名 ( 參數列表 )
{
// 方法的主體…
}
注釋類型
Java C#
行注釋 // … // …
塊注釋 /*… /*…
*/ */
文檔注釋 /**… /// …
*/ /// …
經驗
將每個方法都折疊成一句並提供說明,做法是:把方法的代碼寫在
#region和#endregion之間。在#region后面就可以添加說明。
規范
1.關鍵性的語句要使用注釋,如變量聲明、條件判斷、循環等。
2.類名前應使用文檔注釋,說明類的簡單功能和使用方法。
3.方法前應使用注釋,說明方法的功能、參數的含義、返回值等。
★10.Visual Studio調試技巧
▲1.設置斷點(斷點:breakpoint)
小技巧
程序調試時常用快捷鍵如下
1.F5--開始調試
2.Shift+F5--停止調試
3.F9--設置或刪除斷點
4.Ctrl+F9--取消斷點
5.F10--單步執行
6.F2--轉到所調用過程或變量的定義。
7.Ctrl+F2--將焦點轉移到類的下拉框。
▲2.監視變量值
將變量添加到監視窗口的二種方法
1.選中並右擊需要關注的變量,如對象student的成員,選擇快捷菜單占的
"添加監視"命令。
2.在監視1窗口中單擊名稱下的空白單元格,輸入"student",按Enter鍵。
小技巧
如果在你的Visual Studio中沒有出現監視窗口或者不小心把它關閉了,怎么辦?
在Visual Studio的菜單欄中通過選擇“調試”→“窗口”→“監視”→“監視1”選
項,可以打開一個監視窗口,也可以通過這種方式打開多個監視窗口。
本章總結
★1.使用Visual Studio創建和運行C#控制台應用程序的步驟如下。
1.啟動Visual Studio 2010。
2.新建項目
3.生成可執行文件
4.開始運行
★2.C#采用命名空間組織程序,引入其他命名空間用using關鍵字。
★3.C#中使用控制台類Console的ReadLing()和WriteLine()方法輸入和輸出信息。
★4.C#中Main()方法的首字母大寫,根據返回值和參數的不同Main()方法有四種形式。
★5.C#中布爾類型使用bool關鍵字。
★6.C#中使用const關鍵字聲明常量。
★7.C#中有三種注釋類型,其中文檔注釋使用///表示。
★8.類是創建對象的模板,對象是類的一個具體實例。
★9.調試程序的步驟如下。
1.設置斷點:按F9快捷鍵。
2.啟動調度:按F5快捷鍵。
3.在監視窗口中查看變量的當前值。
第二章
C#語法快速熱身
1.掌握C#中的條件結構
2.掌握C#中的循環結構
3.掌握C#中的數組用法
4.掌握冒泡排序算法
★1.條件結構
1.if結構
2.switch結構
經驗
switch結構中case子句的擺放是沒有順序的,可以把default子句放在最前面,
但要注意任何兩個case語句不能具有相同的值。
case中的值必須是常量表達式,不允許使用變量。
★2.數組與循環
1.一維數組
經驗
如果在程序中需要得到數組的長度,應該使用“數組名.Length”語句獲得,而不
是用數組定義的長度。這樣一旦數組長度發生變化,可以及時獲得數組當前的元素
個數。
2.循環結構
while do-while for foreach
經驗
1.while循環是先判斷條件表達式是否成立。若成立則執行循環體;否則結束循環。
2.do-while循環先執行一次循環體再判斷條件表達式是否成立。若成立則繼續循
環;否則結束循環。
3.for循環必須使用整型變量做循環計算器,通過條件表達式限定計數器變量值來控制循環。
4.foreach()自動遍歷給定集合的所有值。
5.break語句
除了在switch語句中可以使用break語句退出某個case語句外,也可以把它用於for、
while、do-while、foreach循環結構。break語句將使程序跳出當前循環結構,並繼續執行
該循環后面的語句。
6.continue語句
continue語句與break語句類似,它必須出現在for、while、do-while、foreach的循環結構
中。但continue語句的作用是退出當前循環結構的本次循環,並開始執行當前循環結構
的下一次循環,而不是退出當前循環結構。
★3.二重循環
★4.冒泡排序
▲1.冒泡排序算法
1.當i=0時,是第一輪比較,數組中所有的元素都參與比較。
2.當i=1時,因為scores[4]已經是最大的數了,所以不參加比較。
3.當i=2時,scores[3]也不參與比較,只需要比較到scores[2],這輪一共比較2次。
4.當i=3時,scores[2]不參與比較,只需要比較scores[0]和scores[1],一共比較1次。
經驗
冒泡排序速記口決(升序):
1.N個數字來排隊,兩兩相比小靠前。
2.外層循環N-1,內層循環N-1-i。
3.如果要降序排序,只要把程序中的大於號換成小於號就行了。
本章總結
1.C#一維數組的聲明和初始化與Java略有不同,聲明時不能將數組名放在數據類型
和方括號之間。
2.C#中有四種循環結構:while、do-while、for、foreach、其中foreach用來遍歷集合
或者數組中的每個元素。
3.二重循環就是在一個循環中嵌套另一個循環,必須將內層循環完整地包含在外層循
環的循環體內。
4.break和continue語句用在內層循環時,只對內層循環的執行有影響,並不影響外層
循環。
5.使用二重循環可以實現冒泡排序算法,排序的過程是比較相鄰的兩個數並交換,直
到所有的數都比較過並排好順序。
第三章
本章技能目標
1.掌握C#中的訪問修飾符
2.掌握C#中的屬性
3.掌握C#中的值傳遞和引用傳遞
★1.private訪問修飾符
1.生活中的訪問級別
2.訪問修飾符
訪問修飾符 訪問權限 訪問級別
public 不受任何限制 最高
private 只有類的內部可以使用 最低
注意
如果在成員定義之前沒有指定訪問修飾符,那么這個類成員的訪問權限默認為
internal,它只能在本項目內訪問。
★2.this關鍵字
private string _name;
public void SetName(string _name)
{
//this就是當前對象的本身
this._name = _name;//前對象本身的名字等於方法傳進來的本身
}
this關鍵字可以區分局部變量和成員變量。
★3.C#中屬性
1.用方法保證數據安全
2.用屬性實現字段封裝
class Student
{
private string _name = "灰太狼";
private int _age;
public string _cardID;
public int Age
{
get
{
return _age;
}
set
{
if(value<0||value>100)
{
_age = 19;
}
else
{
_age = value;
}
}
}
}
class Program
{
static void Main(string[] args)
{
Student student = new Student();
//執行Age屬性的set訪問器代碼
student.Age = -20;
//執行Age屬性的get訪問器代碼
Console.WriteLine("年齡是{0}",student.Age);
student.Age = 40;
Console.WriteLine("年齡是{0}",student.Age);
}
}
2.屬性的數據類型
定義類中的一個屬性時,屬性的數據類型必須與它所訪問的字段類型一致。
3.屬性的訪問類型
屬性除了可以約束數據訪問外,還可以設置讀,寫屬性來限定它的訪問類型。屬性的訪
問類型分為以下三種。
1.只讀屬性,只包含get訪問器。
2.只寫屬性,只包含set訪問器。
3.讀寫屬性,包含get和set訪問器。
4.在編碼中如何快速地創建屬性
選中這個字段,右擊鼠標,在彈出的快捷菜單中,選擇“重構”→“封裝字段”命令,
選擇“封裝字段”選項后,Visual Studio 會彈出一個窗口。你可以修改屬性的名稱,在
單擊“確定”
小技巧
封裝字段的快捷鍵是Ctrl+R+E。
1:C#中,字段和屬性的區別是什么?
答案:通常將字段指定為private,在類內部使用。將屬性指定為public,對外部公
開,通過get或set訪問器對字段提供安全,有效范圍的保護。
2:C#中,屬性和方法的區別是什么?
答案:C#中的屬性set訪問器和get訪問器后不使用"()",因為訪問器沒有返回
值,所以也不需要指定void。
面向對象的特征這————封裝
顧名思義,封裝表示將東西打包,使其以新的完整的形式出現。
封裝可以為我們帶來如下這些好處。
第五章
指導學習:庫存管理
1.使用類和屬性封裝貨品信息
2.使用對象數組存儲貨品信息
3.使用輸入輸出語句獲取、顯示貨品信息
4.使用類型轉換獲取用戶輸入的貨品作息
5.使用條件結構實現菜單管理
6.使用循環結構實現菜單管理
7.使用自定義方法完成特定的功能
8.使用String類方法實現字符串處理
★1.C#基本語法
1.變量、方法
2.Console類
3.數組
★2.流控制
1.條件語句
2.循環
★3.類和對象
1.屬性、方法
2.值傳遞和引用傳遞
值傳遞把值復制到里面,原來的值沒有改變。
引用傳遞是把地址復制到里面,原來的值會改變。
★4.屬性
1.不會直接訪問類中的字段,通過get和set訪問器訪問
2.get返回相應的私有字段的值
3.set設定相應的私有字段的值
5
ERP--企業資源管理器
1.掌握數據庫的基本概念
2.掌握SSMS的基本操作
3.掌握如何創建和配置SQL Server數據庫
數據庫(Database,簡稱DB)技術是程序開發人員必須掌握的技術之一,在前面學習的
C#語言中,數據都是使用變量保存承內存中,一旦程序運行完畢,內存中的這些數據
信息也會隨之消失。
1.使用數據庫的必要性
使用數據庫可以高效且條理分明地存儲數據,它使人們能夠更加迅速和方便地管理數
據,主要體現在以下幾個方面。
1.可以結構化存儲大量的數據信息,方便用戶進行有效的檢索和訪問。
2.可以有效地保持數據信息的一致性、完整性、降低數據冗余。
3.可以滿足應用的共享和安全方面的要求。
4.數據庫技術能夠方便智能化地分析,產生新的有用信息。
第六章
程序數據集散地:數據庫
本章技能目標
1.掌握數據庫的基本概念
2.掌握SSMS的基本操作
3.掌握如何創建和配置SQL Server數據庫
數據庫(Database,簡稱 DB)技術是程序開發人員必須掌握的技術之一,在前面學習的
C#語言中,數據都是使用變量保存在內存中,一旦程序運行完畢,內存中的這些數據
信息也會隨之消失。
第七章
用表組織數據
★1.表相關的幾個基本概念
數據完整性
1.實體完整性約束
實體完整性要求表中的每一行數據都反映不同的實體,不能存在相同的數據行。
通過索引,唯一約束,主鍵約束或標識列屬性。
2.域完整性約束
域完整性指的是給定列輸入的有效性。
通過限制數據類型,檢查約束,輸入格式,外鍵約束,默認值,非空約束等多種方法,
可以實現表的域完整性。
3.引用完整性約束
在輸入或刪除數據時,引用完整性約束用來保持表之間已定義的關系。
4.自定義完整性約束
用戶自定義完整性用來定義特定的規則。
★2.主鍵和外鍵
1.主鍵Primary Key
2.外鍵Foreign Key
★3.創建數據庫表
1.在SQL Server Management Studio 中建立數據庫表
2.確定列的數據類型
Unicode是一種在計算機上使用的字符編碼,它為每種語言中的每個字符設定了統一
並且唯一的二進制編碼,以滿足跨語言,跨平台進行文本轉換,處理的要求。
3.保存數據庫表
★4.完善表的設計結構
1.是否允許為空值
2.建立主鍵
3.默認值
4.標識列
★5.向表中插入數據
★6.建立表間關系
1.如何建立表間關系
2.建立數據庫關系圖
★7.建立檢查約束
1.如何建立檢查約束
★8.刪除數據庫表
第八章
用SQL語句操作數據
本章技能目標
1.使用T-SQL向表中插入數據
2.使用T-SQL更新表中數據
3.使用T-SQL刪除表中數據
★1.SQL簡介
1.SQL能做什么
SQL是針對數據庫而言的一門語言,它可以創建數據庫,數據表,可以針對數據庫的數
據進行增、刪、改、查等操作,可以創建視圖,存儲過程,可以賦予用戶權限等。
2.SQL和T-SQL
SQL全稱是“結構化查詢語言(Stuctured Query Language)”
SQL語言不同於C#這樣的程序設計語言,它是只能被數據庫識別的指令,但是在程序
中,可以利用其他編程語言組織SQL語句發送給數據庫,數據庫再執行相應的操作。
3.SQL的組成
DML(Data Manipulation Language,數據操作語言,也稱為數據操縱語言):用來插
入,修改和刪除數據庫中的數據,如INSERT,U
第九章
數據查詢基礎
本章技能目標
1.理解查詢的機制
2.使用SELECT語句進行條件查詢
3.掌握查詢排序
4.使用表達式、運算符和函數實現查詢
★1.T-SQL查詢基礎
1.查詢機制簡介
查詢是針對表中已經存在的數據行而言的,可以簡單地理解為“篩選”,將一定條件的
數據抽取出來。
數據表在接受查詢請求的時候,可以簡單地理解為“它將逐行判斷”,判斷是否符合查
詢條件。如果符合查詢條件就提取出來,然后把所有被選中的行組織在一起,形成另外
一個類似於表的結構,構成查詢的結果,通常叫做記錄集(RecordSet)。
由於記錄集的結構實際上和表的結構類似,都是由行組成的,因此在記錄集上依然可以
進行再次查詢。
★2.使用SELECT語句進行查詢
查詢使用SELECT語句,最簡單的查詢語句的格式可以表示為:
★語法
SELECT<列名>
FROM<表名>
[WHERE <查詢條件表達式>]
[ORDER BY <排序的列名>[ASC或DESC]]
其中,WHERE的條件是可選的,如果不限制,則查詢返回所有行的數據項。ORDER BY 是
用來排序的,后續內容將會詳細介紹。
經驗
查詢語句可以分為多個子句部分,例如,上面的查詢語法可以划分為SELECT……
FROM……WHERE……ORDER BY……四個子句,對於復雜多行的SQL語句,可以將每個
子句單獨寫成一行,以方便調試和查找錯誤。
1.查詢所有的數據行和列
把表中的所有行和列都列舉出來比較簡間,這時候可以使用“*”表示所有的列:
SELECT * FROM Students
2.查詢部分行或列
查詢部分列需要列舉不同的列名,而查詢部分行需要使用WHERE子句進行條件限制,
查詢地址為“河南新鄉”的學生,並且只顯示編號,姓名和地址列。
SELECT Scode,SName,SAddress
FROM Students
WHERE SAddress = '河南新鄉'
3.在查詢中使用列的別名
AS子句可以用來改變結果集列的名稱,也可以為組合或者計算出的列指定名稱。
SELECT Scode AS 學生編號,SName AS 學生姓名,SAddress AS 學生地址
FROM Students
WHERE SAddress <> '河南新鄉'
假設在某數據庫的雇員表Employees存在FirstName列和LastName列,現在需要將這兩列
合並成一個叫做“姓名”的列,可以使用以下查詢語句:
SELECT FirstName+'.'+LastName AS 姓名
FROM Employees
重新命名列名還有一種方法,就是采用“=”來命名,例如:
SELECT 姓名 = FirstName+'.'+LastName
FROM Employees
4.查詢空值
第十章
模糊查詢和聚合函數
本章技能目標
1.使用LIKE、BETWEEN、IN進行模糊查詢
2.使用聚合函數統計和匯總查詢信息
★1.模糊查詢
模糊查詢提取的數據不一定是確切的,查詢者對查詢條件也是模糊的,大概的,不特別
明確的。
前面章節學習過的IS NULL查詢嚴格說也是一種模糊查詢。
★2.通配符
簡單地講,通配符是一類字符,它可以代替一個或多個真正的字符,查找信息時作為替
代字符出現。T-SQL中的通配符必須與LIKE關鍵字一起使用,以完成特殊的約束或要求。
通配符 解釋
_ 一個字符
A LIKE 'C_'
CS、Cd等
% 任意長度的字符串
B LIKE 'CO_%'
CONST、COKE等
[ ] 括號中所指定范圍內的一個字符
C LIKE '9W0[1-2]'
9W01或9W02
[^] 不在括號中所指定范圍內的一個字符
D LIKE '%[A-D][^1-2]'
9W03或9W07等
★3.使用LIKE進行模糊查詢
LIKE運算符用於匹配字符串或字符串的一部份(稱為子串)。由於該運算符只用於字符
串,所以僅與字符數據類型(char或varchar等)聯合使用。
查找姓張的學生信息
SELECT * FROM Students WHERE SName LIKE '張%'
或者查詢住址包含“北京”字樣的學生信息
SELECT * FROM Students WHERE SAddress LIKE '%北京%'
★4.使用BETWEEN在某個范圍內進行查詢
使用關鍵字 BETWEEN 可以查找那些介於兩個已知值之間的一組未知值。要實現這種查
找,必須知道查找的初值和終值,並且初值小於等於終值,初值和終值用單詞 AND 分
開,例如:
查詢分數在60(含)到80(含)之間的信息如下:
SELECT * FROM SCore WHERE Score BETWEEN 60 AND 80
如果寫成如下形式;
SELECT * FROM Score WHERE Score BETWEEN 80 AND 60
則不會報語法錯,但也不會查詢到任何信息。
查詢不在2010年1月1號2010年8月1號之間訂購的圖書列表
SELECT * FROM Sales WHERE ord_date NOT BETWEEN '2010-1-1' AND '2010-8-1'
★5.使用IN在列舉值內進行查詢
查詢的值是指定的某些值之一,可以使用帶列舉值的IN關鍵字來進行查詢。將列舉值
放在小括號里,用逗號分開,例如:
查詢北京,廣州或者上海的學生姓名:
SELECT SName AS 學生姓名
FROM Students
WHERE SAddress IN ('北京','廣州','上海')
ORDER BY SAddress
同樣可以把 IN 關鍵字和 NOT 關鍵字合起來使用,這樣可以得到所有不匹配列舉值
的行。
★6.T-SQL中的聚合函數
聚合函數能夠基於列進行計算,將多個值合並為一個值,其作用是對一組值進行計算
,並返回計算后的值。
1.SUM()
SUM()返回表達式中所有數值的總和。
SUM()只能用於數字類型的列,不能夠匯總字符,日期等其他數據類型。
查詢學生編號為23的學生總分。
SELECT SUM(Score) AS 學號為23的學生總分
FROM Score
WHERE StudentID=23
注意這種查詢只返回一個數值,因此,不能夠直接與可能返回多行的列一起使用來進行
查詢
SELECT SUM(Score) AS 學號為23的學生總分,CourseID AS 科目編號
FROM Score
WHERE StudentID=23
2.AVG()
AVG()函數返回表達式中所有數值的平均值。
AVG()函數也只能用於數字類型的列。
查詢及格線以上學生的平均成績。
SELECT AVG(Score) AS 平均成績
FROM Score
WHERE Score>=60
3.MAX()和MIN()
MAX()返回表達式中的最大值,MIN()返回表達式中的最小值,
它們都可以用於數字型、字符型以及日期/時間類型的列。
查詢平均成績,最高分,最低分。
SELECT AVG(Score) AS 平均成績,MAX(Score) AS 平均成績,MIN(Score) AS 最低分
FROM Score
WHERE Score >=60
4.COUNT()
COUNT()返回提供的組或記錄集中的計數。COUNT()可以用於數字和字符類型的列。另
外,也可以使用星號(*)作為COUNT的表達式,使用星號可以不必指定特定的列而計算
所有的行數。
查詢及格人數的語句
SELECT COUNT(*) AS 及格人數
FROM Score
WHERE Score>=60
本章總結
1.通配符是一類字符,它可以代替一個或多個真正的字符,查找信息時作為替代字符
出現。
2.“_”和“%”分別匹配一個字符和多個字符。
3.使用LIKE、BETWEEN、IN關鍵字,能夠進行模糊查詢。
4.聚合函數能夠對列進行計算,對於分析和統計非常有用。
5.常用的聚合函數如SUM()、AVG()、MAX()、MIN()、COUNT()。
第十一章
聯接查詢和分組查詢
本章技能目標
1.使用GROUP BY 進行分組查詢
2.掌握多表聯接查詢
★1.分組查詢
1.使用GROUP BY進行分組查詢
采用分組查詢實現的T-SQL語句如下:
SELECT CourseID,AVG(Score) AS 課程平均成績
FROM Score
GROUP BY CourseID
1.查詢男女學生的人數各是多少
SELECT COUNT(*) AS 人數,SSex FROM Students
GROUP BY SSex
2.查詢每個年級的總人數
SELECT COUNT(*) AS 年級人數,SGrade FROM Students
GROUP BY SGrade
3.查詢每個科目的平均分,並且按照由低到高的順序排列顯示
對比
思路同前面的一樣,按照科目進行分組。
分數由高到低進行排序,需要用到ORDER BY子句,問題是這個ORDER BY子句
放在哪個位置?GROUP BY 子句之前還是之后?現在來仔細想一下,進行排序時,
應該是對分完組后的平均分進行一個排序,這樣想來應該放在GROUP BY子句之
完整的T-SQL語句如下。
SELECT CourseID,AVG(Score) AS 課程平均成績 FROM Score
GROUP BY CourseID
ORDER BY AVG(Score) DESC
★2.多列分組查詢
分組查詢有時候可能還要按照多個列來進行分組。例如,學生信息表Students中記錄了
每個學生的信息,包括所屬年級和性別等。
如果要統計每個學期的男女學生人數,則理論上先把每個學期分開,然后針對每個學
期,把男女學生人數各自統計,也就是需要按照兩個列進行分組,所屬年級和性別。
SELECT COUNT(*) AS 人數,SGrade AS 年級,SSex AS 性別 FROM Students
GROUP BY SGrade,SSex
ORDER BY SGrade
不難理解,使用GROUP BY 關鍵字時,在SELECT列表中可以指定的列是有限制的,僅
允許以下幾項。
1.被分組的列。
2.為每個分組返回一個值的表達式,例如聚合函數計算出的列。
★3.使用HAVING子句進行分組篩選
1.查詢年級總人數超過15的年級
首先可以通過分組查詢獲取每個年級的總人數。
SELECT COUNT(*) AS 人數,SGrade AS 年級 FROM Students
GROUP BY SGrade
但是還有一個條件:人數超過15的年級。這個時候,牽扯到分組統計后的條件限制。
限制條件為COUNT(*)>15。這時候使用WHERE子句是不能滿足查詢要求的,因為
WHERE子句只能對沒有分組統計前的數據行進行篩選。對分組后的條件的篩選必須使用
HAVING子句,簡單地說,HAVING子句用來對分組后的數據進行篩選,將“組”看做
“列”來限定條件。
SELECT COUNT(*) AS 人數,SGrade AS 年級 FROM Students
GROUP BY SGrade
HAVING COUNT(*)>15
2.查詢平均分及格的課程信息。
在查詢每個科目平均分的基礎上,增加了一個條件:平均分及格的科目。這樣按照科目
進行分組后,使用AVG(Score)>=60控制及格件即可。
SELECT CourseID AS 課程編號,AVG(Score) AS 課程平均成績
FROM Score
GROUP BY CourseID
HAVING AVG(Score)>=60
HAVING和WHERE子句可以在同一個SELECT語句中一起使用,使用順序應如下。
WHERE→GROUP BY→HAVING
在SELECT語句中,WHERE,GROUP BY,HAVING子句和聚合函數的執行次序
如下:WHERE子句從數據源中去掉不符合其搜索條件的數據:GROUP BY 子句搜
集數據行到各個組中,統計函數為各個組計算統計值:HAVING子句去掉符合其
組搜索條件的各組數據行。
3.查詢每門課程及格總人數和及格學生的平均分
分析
通過需求了解到所查詢的信息,都是要求及格的統計,這樣就首先從數據源中將不
及格的進行濾除,然后對符合及格要求的數據再進行分組處理。
SELECT COUNT(*) AS 人數,AVG(Score) AS 平均分,CourseID AS 課程 FROM Score
WHERE Score>=60
GROUP BY CourseID
4.查詢每門課程及格總人數和及格平均分在80分以上的記錄
分析
同上一個查詢需求思路一致,只是加了一個對分組后數據的條件:及格平均分在80
分以上,增加HAVING子句即可
SELECT COUNT(*) AS 人數,AVG(Score) AS 平均分,CourseID AS 課程 FROM Score
WHERE Score>=60
GROUP BY CourseID
HAVING AVG(Score)>=80
5.在按照部門分類的員工表中,查詢“有多個員工的工資不低於2000的部門編號”
分析
利用WHERE子句首先濾除工資低於2000的記錄,然后再按照部門進行分組,最后
對分組后的記錄進行條件限定。
SELECT 部門編號,COUNT(*) FROM 員工信息表
WHERE 工資 >= 2000
GROUP BY 部門編號
HAVING COUNT(*) > 1
★4.多表聯接查詢
▲1.多表聯接查詢的分類
多表聯接查詢實際上是通過各個表之間共同列的關聯性來查詢數據的,它是關系數據庫
查詢最主要的特征。
以下是幾種常用的聯接:內聯接,外聯接。
1.內聯接
內聯接是最典型,最常用的聯接查詢,它根據表中共同的列來進行匹配。特別是兩個表
存在主外鍵關系時通常會使用到內聯接查詢。
2.外聯接
外聯接是至少返回一個表中的所有記錄,根據匹配條件有選擇性地返回另一張表的記錄。
外聯接可以是左外聯接,右外聯接。
★5.內聯接查詢
內聯接查詢通常會使用像“=”或“<>”等比較運算符來判斷兩列數據值是否相等。
上面所說的根據學生學號來判斷出學生姓名的聯接就是一種內聯接。
內聯接使用INNER JOIN…ON關鍵字或WHERE子句來進行表之間的關聯。內聯接查詢可
以通過兩種方式實現。
1.在WHERE子句中指定聯接條件
例如查詢學生姓名和成績
SELECT Students.SName,Score.CourseID,Score.Score
FROM Students,Score
WHERE Students.SCode = Score.StudentID
2.在FROM 子句中使用INNER JOIN…ON
SELECT S.SName,C.CourseID,C.Score
FROM Students AS S
INNER JOIN Score AS C ON (S.SCode = C.StudentID)
在上面的內聯接查詢中:
INNER JOIN 用來聯接兩個表。
INNER 可以省略。
ON 用來設置條件。
AS 指定表的“別名”。如果查詢的列名在用到的兩個或多個表中不重復,則對這
一列的引用不必用表名來限定。
查詢科目編號為1的及格學生的姓名和分數。WHERE子句用來限定查詢條件。
SELECT S.SName,C.CourseID,C.Score
FROM Students AS S
INNER JOIN Score AS C ON (S.SCode=C.StudentID)
WHERE C.Score>=60 AND C.CourseID=1
內聯接查詢通常不僅僅聯接兩個表,有時候還會牽涉到三個表或者更多表。
例如,除了學生信息表,學生成績表之外,還存在課程名稱表。上面的查詢不僅僅
要顯示學生姓名,分數,而且要通過課程編號來顯示課程名稱表中對應課程的名稱。
可以使用以下三表聯接查詢。
SELECT S.SName AS 學生姓名,CS.CourseName AS 課程名稱,C.Score AS 考試成績
FROM Students AS S
INNER JOIN Score AS C ON (S.SCode=C.StudentID)
INNER JOIN Course AS CS ON (CS.CourseID=C.CourseID)
★6.外聯接查詢
內聯接的結果是從兩個或兩個以上表的組合中挑選出符合聯接條件的數據,
如果數據無法滿足聯接條件則將其丟棄。在內部聯接中,參與聯接表的地位是平等的。
與內部聯接相對的方式稱為外部聯接。在外部聯接中參與聯接的表有主從之分,以主表
的每行數據匹配從表的數據列,將符合聯接條件的數據直接返回到結果集中,對那些不
符合聯接條件的列,將被填上NULL值(空值)后再返回到結果集中。
1.左外聯接查詢
左外聯接的結果集包括LEFT JOIN子句中指定的左表的所有行,而不僅僅是聯接列所匹
配的行。如果左表的某行在右表中沒有匹配行,則在相關聯的結果集行中右表的所有選
擇列均為空值。
左外聯接使用LEFT JOIN…ON或LEFT OUTER JOIN…ON關鍵字來進行表之間的關聯。
SELECT S.SName,C.CourseID,C.Score
FROM Students AS S
LEFT OUTER JOIN Score AS C ON S.SCode = C.StudentID
有部分學生可能沒有參加過任何科目的考試,所以成績表中沒有相關的考試記錄,對應
的科目編號和成績以NULL(空值)填充。
SELECT CS.CourseName,C.StudentID,C.Score
FROM Course AS CS
LEFT OUTER JOIN Score AS C ON CS.CourseID=C.CourseID
2.右外聯接查詢
右外聯接查詢與左外聯接查詢類似,只不過要包含右表中所有匹配的行。如果右表中有
的項在左表中沒有對應的項,則以NULL值填充。
右外聯接使用RIGHT JOIN…ON 或RIGHT OUTER JOIN…ON關鍵字來進行表之間的關聯。
本章總結
1.分組查詢是針對表中不同的組分類統計和輸出的,GROUP BY 子句通常會結合聚合
函數一起來使用。
2.HAVING子句能夠在分組的基礎上,再次進行篩選。
3.多個表之間通常使用聯接查詢。
4.最常見的聯接查詢是內聯接(INNER JOIN…ON),通常會在相關表之間提取引用
列的數據項。
第十三章
項目案例:QQ數據庫管理
本章技能目標
1.掌握創建數據庫並為數據表添加約束
2.掌握創建數據表之間的關系
3.使用T-SQL語句對數據進行綜合管理
4.使用管理器進行數據庫的管理
▲1.用例1:創建QQ數據庫及登錄名
使用管理器創建QQ數據庫,並為其創建登錄名QQMaster,要求如下。
1.數據文件初始大小為10MB,文件按15%自動增長,最大文件大小不受限制。
2.日志文件初始大小為5MB,文件按1MB自動增長,最大文件大小為50MB。
QQMaster權限等同管理員權限,自動創建關聯數據庫用戶QQMaster。
★提示
注意保存到本地磁盤的位置
▲2.用例2:創建表結構
在管理器中根據以上分析的QQ數據庫的表結構創建用戶表QQUser,用戶基本信息表
BaseInfo和用戶關系表Relation
★提示
根據實際情況,注意設置主鍵,數據類型長度,不允許為空的列等基本表結構要求。
▲3.用例3:添加約束
根據問題分析,歸納總結三個表所有的約束條件如下。
1.QQ密碼不得少於6位。
2.在線狀態的值必須為0,1,2, 0表示在線,1表示離線,2表示隱身。
3.用戶等級默認值為0。
4.性別允許為空值,但如果輸入值就必須為0或1,0表示男,1表示婦。
5.年齡必須是在1~100之間的整數。
6.用戶關系只能是數字0,1, 0表示好友,1表示黑名單人物。
▲4.用例4:建立關系
1.用戶表和基本信息表是--對應的關系,一個QQ號碼對應着一個用戶記錄和一個
基本信息記錄。
2.關系表中存在的QQ必然是在用戶表中存在的用戶QQ,並且一個QQ可以有多個
好友,多個黑名單人物,也可以是別人的好友,黑名單人物。
--▲5.用例5:插入數據
--請根據表提供的信息要求,在查詢窗口中使用T-SQL語句把表中的數據
--插入到對應的數據表中。
INSERT INTO QQUser (
[QQID]
,[PassWord]
,[LastLogTime]
,[Online]
,[Level])
SELECT '54789625','add512#&','2008-02-16 17:01:35',2,1 UNION
SELECT '88662753','admin0219','2008-02-19 21:08:50',0,5 UNION
SELECT '8855678','guest0221','2008-02-21 16:28:20',1,6
INSERT INTO BaseInfo ([QQID]
,[NickName]
,[Sex]
,[Age]
,[Province]
,[City]
,[Address]
,[Phone])
SELECT '54789625','蝴蝶飛飛',1,16,'北京','朝陽區','亞運村','37547388157668' UNION
SELECT '88662753','秋芙蓉',0,20,'河南省','南陽','方城博望','88715783657725' UNION
SELECT '8855678','雙眼皮の瀦',1,38,'北京','海淀區','雙榆樹東里','65794968876143'
INSERT INTO Relation ([QQID]
,[RelationQQID]
,[RelationStatus])
SELECT '54789625','88662753',0 UNION
SELECT '88662753','8855678',1 UNION
SELECT '8855678','8855678',0
SELECT * FROM QQUser
SELECT * FROM BaseInfo
SELECT * FROM Relation
--利用導入/導出向導將提供的文本文件中用戶信息,用戶基本信息,用戶關系信息的數
--據導入到相對應的數據表中。
--★提示
--導入用戶關系數據時,一定要注意三個QQ用戶已經使用T-SQL語句插入成功,因
--為其中的數據用到了這三個用戶。
--▲6.用例6:查詢數據
--編寫T-SQL語句按以下要求查詢數據。
--1.查詢QQ號碼為88662753的用戶的所有好友信息,包括QQ號碼(QQID),昵稱
--(NickName),年齡(Age)。
--★提示
--利用內聯接實現。
SELECT R.RelationQQID AS 好友QQ號碼,B.NickName AS 昵稱,B.Age AS 年齡
FROM BaseInfo AS B
INNER JOIN Relation AS R ON (B.QQID=R.RelationQQID)
WHERE R.QQID='88662753' AND R.RelationStatus=0
--2.查詢當前在線用戶的信息。
SELECT *
FROM BaseInfo AS B
INNER JOIN QQUser AS Q ON (Q.QQID=B.QQID)
WHERE Q.Online=0
--3.查詢北京的,年齡在18至45歲之間的在線用戶的信息。
SELECT *
FROM BaseInfo AS B
INNER JOIN QQUser AS Q ON (Q.QQID=B.QQID)
WHERE Q.Online=0 AND B.Province ='北京市' AND Age>=18 AND Age<=45
--4.查詢昵稱為“小笨豬”的用戶信息。
SELECT *
FROM BaseInfo AS B
WHERE B.NickName='小笨豬'
--5.查詢QQ號碼為54789625的用戶的好友中每個省份的總人數,並且按總人數由大
--到小排序。
--★提示
--利用SELECT…FROM…WHERE…GROUP BY…ORDER BY…實現,其
--中內聯接條件WHERE的T-SQL語句可參考如下。
--WHERE(Relation.QQID=54789625 AND Relation.RelationStatus=0 AND
--Relation.RelationQQID=BaseInfo.QQID)
SELECT B.Province AS 省份,COUNT(*) AS 好友總人數
FROM BaseInfo AS B,Relation AS R
WHERE(R.QQID='54789625' AND R.RelationStatus=0 AND
R.RelationQQID=B.QQID)
GROUP BY B.Province
ORDER BY COUNT(*) DESC
--6.查詢至少有150天未登錄QQ賬號的用戶信息,包括QQ號碼,最后一次登錄時
--間,等級,昵稱,年齡,並按時間的降序排列。
--★提示
--利用日期函數DATEDIFF()計算出超過150未登錄過的QQ號碼,再利用聯接查詢獲
--取相應的信息。
SELECT B.QQID AS QQ號碼,LastLogTime AS 最后一次登錄時間,Level AS 等級
,NickName AS 昵稱,Age AS 年齡
FROM BaseInfo AS B
INNER JOIN QQUser AS Q ON (Q.QQID=B.QQID)
WHERE DATEDIFF(DD,Q.LastLogTime,GETDATE())>=150
--7.查詢QQ號碼為54789625的好友中等級為10級以上的“月亮”級用戶信息。
--★提示
--利用三表聯接查詢。
SELECT B.QQID AS 好友QQ號碼,B.NickName AS 昵稱,B.Age AS 年齡,Q.Level AS 等級
FROM BaseInfo AS B
INNER JOIN Relation AS R ON (B.QQID=R.RelationQQID)
INNER JOIN QQUser AS Q ON (Q.QQID=B.QQID)
WHERE R.QQID='54789625' AND Q.Level>=10 AND R.RelationStatus=0
ORDER BY B.QQID
--8.查詢QQ號碼為54789625的好友中隱身的用戶信息。
SELECT B.QQID AS 好友QQ號碼,B.NickName AS 昵稱,B.Age AS 年齡
FROM BaseInfo AS B
INNER JOIN Relation AS R ON (B.QQID=R.RelationQQID)
INNER JOIN QQUser AS Q ON (Q.QQID=B.QQID)
WHERE R.QQID='54789625' AND Q.Online=2 AND R.RelationStatus=0
--9.查詢好友超過20個的用戶QQ號碼及其好友總數。
--★提示
--利用分組查詢,並且增加分組條件HAVING COUNT(*)>=20。
SELECT R.QQID AS 超過20個的用戶QQ號碼,COUNT(*) AS 好友總數
FROM Relation AS R
WHERE R.RelationStatus=0
GROUP BY R.QQID
HAVING COUNT(*)>=20
--10.為了查看信譽度,管理員需要查詢被當做黑名單人物次數排名前20的用戶。
--★提示
--利用分組查詢,注意需求,按照關系用戶QQ號碼RelationQQID進行分組。
SELECT TOP 20 (R.RelationQQID) AS 黑名單人物次數排名前20的用戶,COUNT(*) AS 黑名單次數
FROM Relation AS R
WHERE R.RelationStatus=1
GROUP BY R.RelationQQID
ORDER BY COUNT(*) DESC
--▲用例7:修改數據
--編寫T-SQL語句使其按以下要求修改數據。
--1.假設我的QQ號碼為8855678,今天我隱身登錄。
UPDATE QQUser
SET Online=2
WHERE QQID='8855678'
--2.假設我的QQ號碼為8855678,修改我的昵稱為“被淹死的魚”,地址為“解放中
--路6號院106室”。
UPDATE BaseInfo
SET NickName='被淹死的魚',Address='解放中路6號院106室'
WHERE QQID='8855678'
--3.假設我的QQ號碼為8855678,將我的好友“248624066”拖進黑名單。
UPDATE Relation
SET RelationStatus=1
WHERE QQID='8855678' AND RelationQQID='248624066'
--4.為了提高QQ用戶的聊天積極性,把等級小於6級的用戶等級都升升1個級別。
UPDATE QQUser
SET Level=Level+1
WHERE Level<6
--5.管理員將超過365天沒有登錄過的QQ鎖定(即將等級值設定為-1)。
UPDATE QQUser
SET Level=-1
WHERE DATEDIFF(DD,LastLogTime,GETDATE())>365
--6.為了獎勵用戶,將好友數量超過20的用戶等級提升1個級別。
--★提示
--首先,獲取好友超過20個的用戶QQ號碼結果集,參考用例7的需要9。
--其次,利用IN關鍵字模糊匹配結果集中的QQID進行更新。
--UPDATE QQUser SET…WHERE QQID IN (SELECT QQID FROM Relation…)
UPDATE QQUser
SET Level=Level+1
WHERE QQID IN (
SELECT QQID
FROM Relation AS R
WHERE R.RelationStatus=0
GROUP BY R.QQID
HAVING COUNT(*)>=20)
--7.把QQ號碼為286314的用戶的好友“嘟嘟魚”拖進黑名單中。
--★提示
--完成思路參考需求6,使用IN關鍵字進行模糊匹配。
UPDATE Relation
SET RelationStatus=1
WHERE QQID='286314' AND RelationQQID IN (
SELECT B.QQID
FROM BaseInfo AS B,Relation AS R
WHERE R.RelationStatus=0 AND B.NickName='嘟嘟魚')
--▲用例8:刪除數據
--1.把QQ號碼為54789625的用戶的黑名單中的用戶刪除。
DELETE FROM Relation WHERE QQID='54789625' AND RelationStatus=1
--2.QQ號碼為622009019用戶多次在QQ中發布違法信息,造成了很壞的影響,因此
--管理員決定將其刪除。
--★提示
--此需求需要從三張表中刪除相關信息,注意從各表刪除的先后次序。
DELETE FROM Relation WHERE QQID='622009019' OR RelationQQID='622009019'
DELETE FROM BaseInfo WHERE QQID='622009019'
DELETE FROM QQUser WHERE QQID='622009019'
--3.管理員將超過1000天沒有登錄過的QQ刪除。
--★提示
--實現此需求,需要分四步走。
--第一步:查詢超過1000天沒有登錄過的QQID集。
SELECT QQID FROM QQUser WHERE DATEDIFF(DD,LastLogTime,GETDATE())>=1000
--第二步;刪除Relation表中的數據,利用IN關鍵字模糊匹配QQID集。參孝如下的
--T-SQL語句。
--DELETE FROM Relation
--WHERE QQID IN(…) OR RelationQQID IN(…)
DELETE FROM Relation
WHERE QQID IN(SELECT QQID FROM QQUser WHERE DATEDIFF(DD,LastLogTime,GETDATE())>=1000)
OR RelationQQID IN(SELECT QQID FROM QQUser WHERE DATEDIFF(DD,LastLogTime,GETDATE())>=1000)
--第三步:刪除BaseInfo表中的數據,同理利用IN關鍵字模糊匹配QQID集。
DELETE FROM BaseInfo
WHERE QQID IN(SELECT QQID FROM QQUser WHERE DATEDIFF(DD,LastLogTime,GETDATE())>=1000)
--第四步;刪除QQUser 表中的數據。
DELETE FROM QQUser
WHERE QQID IN(SELECT QQID FROM QQUser WHERE DATEDIFF(DD,LastLogTime,GETDATE())>=1000)
--▲用例9:分離數據庫
第十四章
使用ADO.NET 訪問數據庫
本章技能目標
1.了解ADO.NET的功能和組成
2.會使用Connection對象連接數據庫
3.會使用Command對象查詢單個值
4.會捕獲和處理程序中的異常
★1.ADO.NET概述
在信息系統中,常用的數據庫有很多種,比如有SQL Server、Access、Oracle等。為了
使客戶端能夠訪問數據庫服務器上的數據,就需要用到數據庫訪問的方法和技術,
ADO.NET(ActiveX Data Objects)就是這種技術之一。
1.ADO.NET簡介
ADO.NET是,NET Framework中不可缺少的一部分,它是一組類。通過這些類,NET應
用程序就可以訪問數據庫了。ADO.NET的功能非常強大,它提供了對關系數據庫。XML
以及其他數據存儲的訪問。應用程序可以通過ADO.NET技術與這些數據源進行連接。
對數據進行增、刪、改、查等操作。
ADO.NET技術的一個非常大的優點是,它與數據源斷開連接時也可以使用數據。
ADO.NET可以把從數據源檢索到的數據保存在本地一個叫做“數據集”的地
方,這樣應用程序就可以直接操作本地的數據,而數據源可以為更多的應用程序提供服
務。這就是ADO.NET的斷開連接模型。
★2.ADO.NET的主要組件
ADO.NET提供了兩個組件,用來訪問和處理數據:NET Framework數據提供程序和
DataSet(數據集)
.NET Framework數據提供程序是專門為數據處理以及快速地只進、只讀訪問數據而
設計的組件。使用它可以連接數據源、執行命令和檢索結果,直接對數據源進行操
作。
DataSet是專門為獨立於任何數據源的數據訪問而設計的。使用它,可以不必直接
和數據源打交道,可以大批量地操作數據,也可以將數據綁定在控件上。
ADO.NET 的主要組件
.NET Framework 數據提供程序--用於連接到數據庫、執行命令和檢索結果
DataSet(數據集)--獨立於數據源的數據訪問
.NET 數據提供程序類型
.NET Framework 數據提供程序
SQL Server .NET 數據提供程序
說 明
Microsoft SQL Server 數據源
System.Data.SqlClient 命名空間
OLE DB .NET 數據提供程序
說 明
OLE DB 公開的數據源
System.Data.OleDb 命名空間
ODBC .NET 數據提供程序
說 明
ODBC 公開的數據源
System.Data.Odbc 命名空間
Oracle .NET 數據提供程序
說 明
Oracle 數據源
System.Data.OracleClient 命名空間
★3..NET Framework數據提供程序的四個核心對象
1.Connection--建立與特定數據源的連接
2.Command--對數據源執行命令
3.DataReader--從數據源中讀取只進且只讀的數據流
4.DataAdapter--用數據源填充DataSet並解析更新
★4.使用Connection對象
當應用程序要訪問數據的時候,怎樣能夠找到數據庫呢?這就需要Connection對象。它
就像是車間到倉庫的一條路,有了Connection對象,應用程序就能夠與數據庫建立連
接,完成數據訪問操作。
★5.認識Connection對象
不同命名空間的 Connection 對象
命名空間對應的 Connection 對象
System.Data.SqlClient
SqlConnection
System.Data.OleDb
OleDbConnection
System.Data.Odbc
OdbcConnection
System.Data.OracleClient
OracleConnection
Connection 主要成員
屬性名稱
ConnectionString
說 明
連接字符串
方法 說 明
Open() 打開數據庫連接
Close() 關閉數據庫連接
連接數據庫步驟
1、定義連接字符串
★語法
Data Source=服務器名;Initial Catalog=數據庫名; User ID=用戶名;Pwd=密碼
2、創建 Connection 對象
★語法
SqlConnection connection = new SqlConnection(connString);
3、打開與數據庫的連接
★語法
connection.Open( );
使用Visual Studio 的服務資源管理器獲得連接字符串。方法如下。
1.在Visual Studio 中,選擇菜單中的“視圖”→“服務器資源管理器”命令,或按快
捷鍵Ctrl+Alt+S。
2.在打開的服務器資源管理器中,用鼠標右鍵單擊“數據連接”,選擇“添加連接”
命令,
3.在彈出的“添加連接”對話框中,選擇數據源,輸入服務器名,選擇身份驗證,選
擇要連接的數據庫,確定后,就在服務器資源管理器中添加了一個數據連接。
4.選中新添加的連接,在“屬性”窗口中就能夠找到連接字符串了,可以將它選中復
制到代碼中。
★注意
打開數據庫連接,執行命令后,要確保關閉數據庫連接。
★6.連接數據庫示例
string strConn = "Data Source=R0OM9WXPH5ENXXY;Initial Catalog=MySchoolBase;User ID=sa;Password=123";
★7.常見錯誤
1.數據庫連接字符串中各參數之間的分隔符錯誤
string strConn = "Data Source=R0OM9WXPH5ENXXY,Initial Catalog=MySchoolBase,User ID=sa,Password=123";
2.數據庫連接字符串中參數名稱拼寫錯誤
string strConn = "DataSource=R0OM9WXPH5ENXXY;Initial Catalog=MySchoolBase;User ID=sa;Password=123";
3.數據庫連接字符串中引號出現的位置不正確
string strConn = "Data Source=R0OM9WXPH5ENXXY;Initial Catalog=MySchoolBase;User ID="sa";Password="123";
在拼寫數據庫連接字符串時注意引號出現的位置。如果在數據庫連接字符串中需要用
到單、雙引號時,可以使用"+"符號實現字符串的連接。
★8.異常處理
程序員編寫應用程序難免會發生錯誤。有的錯誤是在編譯時產生的,這就是編譯錯誤。
有的錯誤是在程序運行的過程中出現的,這種錯誤就是異常。有些異常可能無法避免但
是可以預知,比如我們的程序正要讀取數據庫,網絡突然斷了,程序無法控制網絡是否
暢通,但可以預測到可能會有這種情況出現。為了保證應用程序正常運行,程序員要對
程序運行中可能發生的錯誤進行編碼處理,這就是異常處理。
★9.如何處理異常
.NET提供了try-catch語句塊來捕獲和處理異常。
★語法
try
{
//包含可能出現異常的代碼
}
catch(處理的異常類型)
{
//處理異常的代碼
}
try-catch語句是把可能出現異常的代碼放在try塊中。如果在程序運行過程中發生了異
常,就會跳轉到catch塊中進行錯誤處理,這個過程叫做捕獲了異常。如果程序執行沒
有發生異常,那么將會正常執行try塊中的全部語句,但不會執行catch塊中的語句。
異常也有很多種類型,本課程我們只需關注Exception類。這是.NET提供的一個異常類,
表示應用程序在運行時出現的錯誤。
try
{
conn.Open();
//……省略其他操作
conn.Close();
}
catch(Exception ex)
{
//處理異常的代碼
}
前面強調過。數據庫連接必須顯式關閉。但是,如果在數據庫連接關閉之前就出現了異
常,程序就會跳轉到catch塊當中,那么try塊當中的數據庫連接關閉方法就不會執行。
這時應該怎么辦呢?這個問題.NET早就想到了,它提供了一個finally塊,無論是否發
生異常,出現在finally塊中的語句都會執行。這樣就可以把關閉數據庫連接的語句寫在
finally塊中。
try
{
conn.Open();
//……省略其他操作
}
catch(Exception ex)
{
//處理異常的代碼
}
finally
{
conn.Close();
}
這樣就確保了無論程序是否發生異常,在程序結束運行之前都會關閉數據庫連接。
★注意
程序在執行了try塊或catch塊之后總會將控制權傳遞給finally塊,與try塊的退出方
式無關。
★10.處理數據庫操作異常示例
★技巧
使用Visual Studio的“外側代碼”功能來添加try塊。方法很簡單,在Visual Studio
的代碼編輯器中,選中可能會出現異常的代碼,單擊鼠標右鍵,選擇“外側代碼”
在出現的外側代碼選擇器中找到try。
★11.使用Command對象
我們已經知道了如何建立應用程序和數據庫的連接,那么打開數據庫連接后,應該怎樣
操作數據呢?這就需要Command對象。Command對象可以對數據庫執行增、刪、改、
查的操作。
1.認識Command對象
.NET數據提供程序及相應的命令類
SQL數據提供程序
包括在System.Data.SqlClient命名空間中
連接類
SqlCommand
OLE DB數據提供程序
包括在System.Data.OleDb 命名空間
連接類
OleDbCommand
ODBC數據提供程序
包括在System.Data.Odbc 命名空間
連接類
OdbcCommand
Oracle數據提供程序
包括在System.Data.OracleClient 命名空間
連接類
OracleCommand
★Command 的主要成員
屬性名稱 說 明
Connection Command對象使用的數據庫連接
CommandText 執行的SQL語句
方法 說 明
ExecuteNonQuery 執行不返回行的語句,如UPDATE等
ExecuteReader 返回DataReader對象
ExecuteScalar 返回單個值,如執行COUNT(*)
本章主要介紹Command對象ExecuteScalar()方法的用法。ExecuteScalar()方法只返回查
詢結果中第一行第一列的值。當查詢結果只有一個數值時,通常調用這個方法,比如使
用聚合函數完成查詢時。一般情況下,這個方法的返回值需要進行顯式類型轉換后才能
使用。
要使用Command對象,必須有一個可用的Connection對象,使用Command對象的步驟
包括以下幾步。
1.創建數據庫連接。
按照前面進過的步驟創建一個Connection對象。
2.定義執行的SQL語句。
將對數據庫執行的SQL語句賦給一個字符串。
3.創建Command對象。
使用已有的Connection對象和SQL語句字符串創建一個Command對象。
4.執行SQL語句。
使用Command對象的某個方法執行命令。
★11.數據庫查詢示例
★12.常見錯誤
1.沒有打開或關閉數據庫連接
在使用Command對象執行命令前,如果沒有執行connection.Open()語句,將會發生如
常見錯誤4所示的異常。
2.ExecuteScalar()方法的返回值沒有進行類型轉換
int num=comm.ExecuteScalar();
應該改成
int num=(int)comm.ExcuteScalar();
因為ExecuteScalar()方法的返回值是Object類型的,所以用該方法的返回值為其他變量
做賦值操作時,必須進行顯式的類型轉換。
本章總結
本章介紹了ADO.NET的結構,利用ADO.NET技術可以實現應用程序對數據庫的訪問操作。
1.ADO.NET是.NET Framework中的一組允許應用程序與數據庫交互的類。
2.ADO.NET的兩個主要組件是.NET Framework數據提供程序和DataSet。
3.NET 數據提供程序包括四個核心對象:Connection,Command,DataAdapter,DataReader。
4.Connection 對象用於建立應用程序和數據庫之間的連接,需要定義連接字符串,必
須顯式打開和關閉數據庫連接。
5.Command對象允許向數據庫傳遞請求,檢索和操作數據庫中的數據。
6.Command對象的ExecuteScalar()方法可以檢索數據庫並返回一個值。
7.數據庫操作過程中可能出現異常,可以使用try-catch-finally語句處理異常。