兩大類數據訪問方式:sql
1.輕量級:SqlConnection,SqlCommand,SqlDataReader數據庫
2.重量級(內存佔用量比較大):SqlConnection,SqlDataAdapter,DataTableexpress
步驟:服務器
一、創建連接對象——建一個通向數據庫的通道。函數
二、打開通道優化
三、操做數據庫ui
四、關閉通道spa
五大對象:code
連接對象,命令對象,讀取器對象,適配器對象,數據集(數據表)server
對象介紹:
操做SQLServer數據庫:
using System.Data;
using System.Data.SqlClient; //針對SqlServer進行優化了的數據訪問類的空間
System.Data.OleDB;System.Data.ODBC; //命名空間通用數據訪問類的空間。
ODBC——Open DataBase Connection開放式數據互聯
(一)構造:
SqlConnection()
SqlConnection(鏈接字符串)
鏈接字符串的寫法。
第一種:手寫 "server=.;database=mydb;uid=sa;pwd=sa";
第二種:使用服務器資源管理器,經過添加連接用可視化界面生成連接對象,經過查看屬性來得到鏈接字符串。(菜單欄中「視圖」→「服務器資源管理器」→右鍵→「添加鏈接」→選擇「Sql Server」→VS窗口右邊的「屬性」→「連接字符串」)
(二)屬性:
ConnectionString:字符串,設置或獲取連接對象的鏈接字符串。
State:ConnectionState枚舉類型,返回當前鏈接狀態。
(三)方法:
Open():void,打開鏈接
Close():void,關閉鏈接
CreateCommand():SqlCommand,建立命令對象,生成一個經過本連接對象來訪問數據庫的SqlCommand實例。(好處是,不用對命令對象單獨設置Connection屬性)
(四)代碼:
SqlConnection conn = new SqlConnection("server=.;database=mydb;uid=sa;pwd=sa");//建立鏈接通道
try
{
conn.Open();
....
}
finally
{
conn.Close();
}
如何在App.Config配置文件中配置數據庫鏈接字符串
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<connectionStrings>
<add name="sql" connectionString="server=.\sqlexpress;database=mydb;uid=sa;pwd=sa"/>
</connectionStrings>
讀取App.Config中的連接字符串
public class DBConnection
{
public static SqlConnection Connection
{
get
{
//從配置文件中讀取連接字符串
string connectionString = ConfigurationManager.ConnectionStrings["sql"].ConnectionString;
SqlConnection conn = new SqlConnection(connectionString);
return conn;
}
}
}
string connectionString = ConfigurationManager.ConnectionStrings["sql"].ConnectionString;
注意: 1.須要添加System.Configuration引用。
2.需using System.Configuration命名空間。
(一)構造:
SqlCommand()
SqlCommand(string sql)
SqlCommand(string sql,SqlConnection conn)
conn.CreateCommand() //經過鏈接通道建立命令對象。
(二)屬性:
CommandText //string,要執行的SQL命令——SQL語句,存儲過程名。
CommandType //Commandtype,枚舉類型
CommandType.Text //SQL語句(默認)。
CommandType.StoredProcedure //存儲過程。
如何調用存儲過程?
1.把CommandText賦爲存儲過程的名。
2.把CommandType賦爲CommandType.StoredProcedure。
3.使用cmd.Parameters.AddWithValue()爲存儲過程參數賦值。
Connection //SqlConnection對象。執行命令時,所使用鏈接對象。
Parameters //SqlParameterCollection,當CommandText中使用SqlServer局問變量時,須要經過該屬性來對變量賦值。
(三)方法:
ExecuteNonQuery(); //int,執行SQL命令,返回影響的行數。通常用來執行增、刪、改
ExecuteReader(); //SqlDataReader,執行SQL命令,返回數據讀取器。通常用來執行查詢
ExecuteScalar(); //object,執行SQL命令,返回首行首列,通常用來執行統計(count(),sum(),avg(),max(),min())查詢的。
例:int count=(int)ExecuteScalar();
(四)重要代碼:
SqlConnection conn = new SqlConnection("server=.;database=mydb;uid=sa;pwd=sa"); //建立鏈接
//SqlCommand cmd = new SqlCommand();
//cmd.Connection = conn;
SqlCommand cmd = conn.CreateCommand(); //建立命令對象
//設置命令的類型
cmd.CommandType = CommandType.Text; //若是要調用存儲過程:cmd.CommandType = CommandType.StoredProcedure;
//指定SQL命令
cmd.CommandText = "insert into nation values(@code,@name) ";
//添加命令參數
cmd.Parameters.AddWithValue("@code","n005");
cmd.Parameters.AddWithValue("@name","壯族"); //爲SQL命令中的變量賦值。下面爲另外一種變量賦值方式
//SqlParameter paramCode = new SqlParameter("@code","n005");
//cmd.Parameters.Add(paramCode);
//SqlParameter paramName = new SqlParameter("@name","壯族");
//cmd.Parameters.Add(paramName);
try
{
conn.Open();
cmd.ExecuteNonQuery();
}
finally
{
conn.Close();
}
SQL注入攻擊,原理分析及對策(單引號替換,使用SQL局部變量)。
所謂SQL注入,就是經過把SQL命令插入到Web表單遞交或輸入域名或頁面請求的查詢字符串,最終達到欺騙服務器執行惡意的SQL命令。
規避辦法:
1.把單引號替換成雙引號;
2.修改查詢語句,使用SQLSERVER的局部變量來傳遞參數。(使用cmd.Parameters.AddWithValue()來解決)
只讀,只向前的數據讀取對象。
它不是結果集,它內存中只佔一條數據的空間。每次讀取下一條時,會把內存中當前條的內容覆蓋。
(一)構造:
不能直接new出來,緣由是,它的構造函數是非public的。
只有惟一的生成方式:cmd.ExecuteReader([CommandBehavior.CloseConnection]);
例:SqlDataReader dr = cmd.ExecuteReader();
(二)屬性:
.HasRows //返回bool型數據,判斷讀取器中是否查出數據。
(三)方法:
.Read(); //讀取下一條數據到內存中來。返回bool型數據。
.Close(); //關閉讀取器。通常不會關閉連接,但若是讀取器生成的時候Command對象的ExecuteReader()方法中帶有CommandBehavior枚舉型參數的話,可能把鏈接也給關掉。
dr[「列名」]; //讀取內存中當前SqlDataReader對象中的某列數據,讀出來的數據是Object類型。
dr[索引號]; //讀取內存中當前SqlDataReader對象中的某列數據,讀出來的數據是Object類型。
dr.GetString(索引號),dr.Getint(索引號)……
(四)重要代碼:
string connectionString = @"server=.\sqlexpress;database=mydb;uid=sa;pwd=sa";
SqlConnection conn = new SqlConnection(connectionString);
SqlCommand cmd = new SqlCommand();
cmd.Connection = conn;
cmd.CommandText = "select * from info";
conn.Open();
SqlDataReader dr = cmd.ExecuteReader();
while (dr.Read())
{
Console.WriteLine(dr["Code"].ToString()+dr["Name"].ToString());
}
conn.Close();
注意事情:
1.登陸判斷。
查詢返回SqlDataReader,使用HasRows屬性來判斷是否查出記錄來,登陸是否成功。
SqlDataReader dr = cmd.ExecuteReader();
if(dr.HasRows)
{
}
2.查詢多行數據出來,演示多行顯示
SqlDataReader dr = cmd.ExecuteReader();
while(dr.Read())
{
Console.WriteLine(dr["列名"].ToString()+(bool)dr[1]); //dr[經常使用的兩種方式];dr[0],dr["列名"]返回的都是object
}
DataSet至關於內存中的數據庫,其中包括多個DataTable。
DataTable至關於內存中的數據表。其中包括兩個最重要的屬性:Rows(DataRowCollection),Columns(DataColumnCollection)。分表表明:表的行集合和列集合。
(一)手動造DataTable
//造表
DataTable table = new DataTable();
//造列
DataColumn col1 = new DataColumn("列名","類型","長度");
DataColumn col2 = new DataColumn("列名","類型","長度");
DataColumn col3 = new DataColumn("列名","類型","長度");
table.Columns.Add(col1);
table.Columns.Add(col2);
table.Columns.Add(col3);
//造行
DataRow row1 = table.NewRow(); //用表對象來生成行結象
row1[0] = "";
row1["列名"] = "";
row1[2] = "";
table.Rows.Add(row1);
DataRow row2 = table.NewRow(); //用表對象來生成行結象
row2[0] = "";
row2["列名"] = "";
row2[2] = "";
table.Rows.Add(row2);
DataRow row3 = table.NewRow(); //用表對象來生成行結象
row3[0] = "";
row3["列名"] = "";
row3[2] = "";
table.Rows.Add(row3);
假設表中已經查出數據來了,我要取某個數據,怎麼取法?
例如:假設查出一個數據表table的數據來。
1.我要操做第3行第5列的數據。(假設我從1開始數的列號和行號)。不能先讀取列,由於一行纔是一條完整的記錄。
string s = table.Rows[2][4].ToString(); //取值
table.Rows[2][4] = "hello world";//賦值
2.我要操做全部的數據
for(int i=0;i<table.Rows.Count;i++)
{
for(int j=0;j<table.Columns.Count;j++)
{
Console.Write(table.Rows[i][j].ToString());
}
}
3.控件綁定:
xxx.DataSource = table;
(二)使用可視化界面造
適本器對象中包含四大SqlCommand屬性:
SelectCommand
InsertCommand
DeleteCommand
UpdateCommand
兩大方法:
Fill(DataTable/DataSet)
Update(DataTable/DataSet)
數據訪問有兩種不一樣的方式,一種是用Connection, Command , DataReader來進行數據對數據的操做,另外一種是用DataAdapter(適配器)來進行數據操做,而數據則通常放在內存中的數據集合DataSet,這種方式能夠在內存中對數據操做,而後在合適的時間再將修改傳到數據庫。
(一)手寫代碼操做(簡單瞭解)
(二)可視化界面操做。
一、創建數據集。
1)、在解決方案上點右鍵→「添加」→「新建項」→在左側「數據」列表中找到「數據集」
2)、在服務器資源管理器中添加鏈接
3)、在數據庫中找到須要的表,而後選中並拖動到右側的數據集中
二、在數據集中添加新查詢
1)、選中一個TableAdapter,右鍵→「配置」→打開「高級選項」→去掉後兩項
2)、右鍵TableAdapter→「添加查詢」→「使用SQL語句」→選擇SQL語句類型→編寫SQL語句→修改方法名稱→完成
三、使用
1)、 造適配器對象:
InfoTableAdapter info = new InfoTableAdapter();
2)、造內存表對象
Mydb.InfoDataTable table = new Mydb.InfoDataTable();
3)、 查詢返回
table = info.GetData();
4)、修改
InfoTableAdapter adp = new InfoTableAdapter();
info.UpdateBycode(name, sex, nation, birthday, code);
數據訪問相關類的封裝:鏈接類,實體類,數據訪問類
裝箱與拆箱:Boxing,Unboxing
值類型數據與引用類型數據之間的轉化。
裝箱:把數據從值類型變成引用類型;把數據由棧空間轉型到堆空間。
拆箱:把數據從引用類型變成值類型;把數據由堆空間轉型到棧空間。
int n = 19;
object obj = n; //裝箱
n = 20;
int m = (int)obj;//拆箱
有什麼壞處?
裝箱:佔空間,佔時間,運行慢。
拆箱:佔用時間,可能出現類型異常