本文轉(zhuǎn)載自:http://www.youarebug.com/forum.php?mod=viewthread&tid=57&page=1&extra=#pid63
這是本人在學(xué)習(xí)ADP.NET過程中所作的筆記,可作為ADO.NET入門或者復(fù)習(xí)的教程。連接字符串:DataSource=localhost; AttchDBFilename=|DataDirectory|/Database1.mdf; InitialCatalog=UserDate; Integrated Security=True參數(shù)說明:Data Source表示數(shù)據(jù)源,其值為服務(wù)器地址和實(shí)例名,如果是正式版則不用加SQLEXPRESS,如果是免費(fèi)版,必須加上SQLEXPRESS,即連接本機(jī)可以寫成“./ SQLEXPRESS”;AttchDBFilename表示附加數(shù)據(jù)庫,其值為附加數(shù)據(jù)庫的地址,DataDirectory代表當(dāng)前項(xiàng)目目錄下的App_data目錄,是數(shù)據(jù)庫的默認(rèn)存儲(chǔ)路徑;Initial Catalog為數(shù)據(jù)庫,其值為當(dāng)前連接所要連接的數(shù)據(jù)庫名稱注:如果要使用Sqlconnection對象,必須導(dǎo)入System.Data.Sqlclient命名空間ADO.NET中的連接等資源都實(shí)現(xiàn)了IDisposable接口,可以使用using進(jìn)行資源管理。也可以使用try……catch語句塊括起來,但是using是最簡單的。代碼語句:using (SqlConnection con = new SqlConnection("Data Source=localhost;Initial Catalog=UserDate;Integrated Security=True")){ 程序語句塊;}或者:
SqlConnection cnn = new SqlConnection();//創(chuàng)建SqlConnection對象的一個(gè)實(shí)例 cnn.ConnectionString = "Data Source=localhost;Initial Catalog=UserDate;Integrated Security=True";cnn.Open();注:using的作用是及時(shí)的釋放資源,在花括號結(jié)束的時(shí)候,程序會(huì)自動(dòng)釋放語句所申請的內(nèi)存,以達(dá)到程序的最優(yōu)。一、通過SqlCommand對象執(zhí)行SQL語句SqlCommand對象可以執(zhí)行SQL語句完成對數(shù)據(jù)庫的增、刪、改、查等數(shù)據(jù)操作。在SqlCommand類中,最主要的屬性有CommandText,該屬性用于接收要執(zhí)行的SQL語句,例如cmd.CommandText = "INSERT INTOb1(name, company, position, shijian) VALUES(@Name, @Company, @Position,@Datetime)",除了CommandText屬性,主要還有Connection屬性,用來接收數(shù)據(jù)庫連接,還有Transaction屬性,用來接收事物。其還有三個(gè)比較常用的方法,第一個(gè)是ExecuteNonQuery()方法,主要用來提交無查詢結(jié)果的SQL語句,如UPDATE,INSERT,DELETE等語句,其返回值為數(shù)據(jù)庫中被SQL語句影響的行數(shù),第二個(gè)是ExecuteReader()方法,主要用來提交SELECT語句,返回值是一個(gè)數(shù)據(jù)流,里面是SELECT語句的查詢結(jié)果,可以用SqlDataReader對象來接收,然后調(diào)用其Read()方法來逐行讀出查詢結(jié)果。第三個(gè)是ExexuteScalar()方法,主要也是用來提交SELECT語句,但是其返回值是查詢結(jié)果的第一行第一列,所以適用于例如COUNT等聚合查詢。二、SQL注入與參數(shù)化查詢SQL注入是通過特殊的SQL語句非法獲取數(shù)據(jù)庫的內(nèi)容。為了保證系統(tǒng)不被黑客進(jìn)行SQL注入攻擊,在SqlCommand執(zhí)行SQL語句時(shí),可以對提交的數(shù)據(jù)先進(jìn)行參數(shù)化處理,參數(shù)化處理主要是通過SqlCommand對象的Parameters屬性的Add方法來完成,參數(shù)化處理有兩種方法,第一種既是在“執(zhí)行Insert操作”中提到的,還有另外一種代碼如下:
cmd.CommandText = "INSERT INTO b1(name, company, position, shijian) VALUES(@Name, @Company, @Position, @Datetime)"; cmd.Parameters.Add(new SqlParameter("Name", Name.Text)); cmd.Parameters.Add(new SqlParameter("Company", Company.Text)); cmd.Parameters.Add(new SqlParameter("Position", Position.Text)); cmd.Parameters.Add(new SqlParameter("Datetime", DateTime.Parse(Datetime.Text))); cmd.ExecuteNonQuery();注:以上的代碼中需要注意一點(diǎn),在第一種代碼中,顯示的對各個(gè)參數(shù)的數(shù)據(jù)進(jìn)行了定義,但是在上面這種代碼中,并未對參數(shù)進(jìn)行數(shù)據(jù)定義,所以需要在提供數(shù)據(jù)時(shí)對數(shù)據(jù)進(jìn)行適時(shí)的轉(zhuǎn)換,例如“shijian”在數(shù)據(jù)庫中定義為DateTime類型,但是其在文本框中獲得的為string類型,所以需要調(diào)用DateTime的Parse方法對數(shù)據(jù)進(jìn)行轉(zhuǎn)換,如果數(shù)據(jù)庫中的數(shù)據(jù)是int型,在賦值時(shí)也應(yīng)進(jìn)行相應(yīng)的轉(zhuǎn)換。三、執(zhí)行Insert操作首先,需要申明一個(gè)SqlCommand對象;其次,用SqlConnection的CreateCommand()函數(shù),創(chuàng)建一個(gè)SqlCommand對象,然后將所要執(zhí)行的SQL語句賦值給SqlCommand的CommandText屬性;最后,調(diào)用SqlCommand類的ExexuteNonQuery()方法,執(zhí)行CommandText的SQL語句。代碼語句:using(SqlCommand cmd = con.CreateComand()){ cmd.CommandText = “INSERT INTO b1(name, company, position) VALUES(“whh”, “UVGE”, “coder”)”;cmm.ExecuteNonQuery();}或者:
using(SqlCommand cmd = con.CreateComand()){ //設(shè)置SQL語句 cmm.CommandText = "INSERT INTO b1(name, company, position, shijian) VALUES(@Name, @Company, @Position, @Datetime)"; //創(chuàng)建參數(shù),并定義其數(shù)據(jù)類型,要和數(shù)據(jù)庫中對應(yīng)的字段保持相同 cmm.Parameters.Add("@Name", SqlDbType.NVarChar); cmm.Parameters.Add("@Company", SqlDbType.NVarChar); cmm.Parameters.Add("@Position", SqlDbType.NVarChar); cmm.Parameters.Add("@Datetime", SqlDbType.DateTime); //設(shè)置參數(shù)的值,這些值來自前段的輸入信息 cmm.Parameters["@Name"].Value = Name.Text; cmm.Parameters["@Company"].Value = Company.Text; cmm.Parameters["@Position"].Value = Position.Text; cmm.Parameters["@Datetime"].Value = Datetime.Text; //執(zhí)行SQL語句 cmm.ExecuteNonQuery();}注:SqlCommand類的ExecuteNonQuery()方法的返回值是當(dāng)前執(zhí)行的SQL語句影響的行數(shù)四、執(zhí)行select語句首先,申明SqlCommand對象其次,用SqlConnection的CreateCommand()函數(shù),創(chuàng)建一個(gè)SqlCommand對象,然后將所要執(zhí)行的SQL語句賦值給SqlCommand的CommandText屬性;第三,調(diào)用SqlCommand類的ExecuteReader ()方法,執(zhí)行CommandText的SQL語句。第四,申明SqlDataReader對象,并用其承接ExecuteReader ()方法所返回的數(shù)據(jù)流;第五,用SqlDataReader類的Read()方法逐行讀取數(shù)據(jù)流中的逐句,取出其中所需要字段的數(shù)據(jù)進(jìn)行處理代碼語句:using(SqlCommand cmd = con.CreateComand()){ Cmd.CommandText = “SELECT語句”; using(SqlDataReader reader = cmd.ExecuteReader()){While(reader.Read()){ String name = reader.GetString(reader.GetOrdinal(“name”)); //數(shù)據(jù)處理語句塊; }}}或者:
using(SqlCommand cmd = con.CreateComand()){ using(SqlDataReader reader = cmd.ExecuteReader()){While(reader.Read()){ String name = reader.[“name”].ToString(); //數(shù)據(jù)處理語句塊;}}}注:1、User是SQL SERVER的關(guān)鍵字,在表名中應(yīng)盡量避免,如果必須是User表,可以用SELECT * FROM [User]這樣的語句來查詢該表的內(nèi)容2、SqlCommand 類的ExecuteScalar()方法返回的是查詢結(jié)果的第一行第一列的數(shù)據(jù)3、在插入數(shù)據(jù)的同時(shí)想要獲得當(dāng)前插入數(shù)據(jù)的id(主鍵)號,可以通過output語法和ExecuteScalar方法實(shí)現(xiàn),這是在SQLSERVER 2005以后的版本中都有的,具體語法如下:cmd.CommandText = “INSERT INTO T_Users(UserName,PassWord) OUTPUT inserted.Id Values(“admin”, “123456”)”;int id = Convert.ToInt32(cmd.ExecuteScalar());五、using和closeusing對實(shí)現(xiàn)了IDisposable接口的類進(jìn)行了資源管理,只要在其作用域內(nèi)using就會(huì)自動(dòng)進(jìn)行資源管理,當(dāng)程序執(zhí)行出了其作用范圍,程序會(huì)自動(dòng)close和dispose資源,保證資源的及時(shí)釋放和回收。而Close只是關(guān)閉了當(dāng)前的連接或者資源,只要其后沒有dispose,還可以繼續(xù)open連接,即close并未釋放資源,只做了關(guān)閉處理,當(dāng)close和dispose連用時(shí),和using作用相同,但考慮到異常處理等情況,所以最好使用using,少用close和dispose。六、通過數(shù)據(jù)集操作數(shù)據(jù)數(shù)據(jù)集是最常用的訪問數(shù)據(jù)的方式,其主要流程是連接數(shù)據(jù)庫、進(jìn)行數(shù)據(jù)查詢、將查詢結(jié)果填充到數(shù)據(jù)集、對數(shù)據(jù)集中的數(shù)據(jù)進(jìn)行展示和操作、將操作后的數(shù)據(jù)集提交數(shù)據(jù)庫,通過這一系列操作實(shí)現(xiàn)對數(shù)據(jù)庫的修改,此過程主要通過DataSet、DataAdapter、DataTable、DataRow、DataColumn、SqlCommandBuilder等類實(shí)現(xiàn)。根據(jù)上面所說到過程,逐步分析:1、數(shù)據(jù)查詢,這里的數(shù)據(jù)查詢不再是通過Command對象實(shí)現(xiàn),而是通過DataAdapter類的實(shí)例來實(shí)現(xiàn),具體代碼如下:
SqlDataAdapter sqldadp = new SqlDataAdapter("SELECT name, company, position, shijian FROM [UserDate].[dbo].[b1] WHERE shijian > '2010-01-21'", con)上面的代碼里面的con是SqlConnection對象的實(shí)例,即數(shù)據(jù)庫鏈接2、將數(shù)據(jù)填充到數(shù)據(jù)集,數(shù)據(jù)集也就是DataSet對象的實(shí)例了,代碼如下:DataSet order_daset = new DataSet();//創(chuàng)建DataSet對象實(shí)例sqldadp.Fill(order_daset);//填充DataSet對象注意填充語句中的參數(shù)以及方法,是用SqlDataAdapter對象的實(shí)例來填充DataSet對象的實(shí)例3、對數(shù)據(jù)集中的數(shù)據(jù)進(jìn)行展示和操作,這步也是這項(xiàng)技術(shù)中最重要、最麻煩的一步,主要是通過DataTable對象的實(shí)例對數(shù)據(jù)進(jìn)行展示和修改,而DataTable類具有很多的屬性和方法,常用的屬性有:Columns能夠得到數(shù)據(jù)集中的字段的數(shù)據(jù)類型、大小、字段名等信息,DataSet能夠獲得當(dāng)前DataTable實(shí)例所屬的數(shù)據(jù)集,Rows可以通過下標(biāo)及字段名(類似于二維數(shù)組)的方式獲得指定行列的數(shù)據(jù),常用的方法有:NewRow()方法能夠創(chuàng)建一個(gè)空白行,可以在添加數(shù)據(jù)的時(shí)候使用,AcceptChanges()方法能夠?qū)?shù)據(jù)表中修改提交給數(shù)據(jù)庫,Clear()方法可以清楚DataTable對象中的所有數(shù)據(jù)。具體代碼如下:
DataTable dt = new DataTable();//創(chuàng)建數(shù)據(jù)表對象dt = order_daset.Tables[0];//填充數(shù)據(jù)表Response.Write("<table border='1'><tr><th>姓名</th><th>公司</th><th>職位</th><th>入職時(shí)間</th></tr>");for (int i = 0; i < dt.Rows.Count; i++){ //按照字段,逐行取出
新聞熱點(diǎn)
疑難解答
圖片精選