ADONET連線
一、ADONET連線: 1、//實現了IDisposible介面的物件都可以用using進行回收
//ExecuteNonQuery一般用來執行Update、Delete、Insert語句 using(SqlConnection conn = new SqlConnection( @"Data Source = .;Initial Catalog=mydb;User ID=sa;Password=700513" )) { conn.Open(); using(SqlCommand cmd = conn.CreateCommand()) { cmd.CommandText = "Insert into T_Student(Name,Age) values('元芳',200)"; cmd.ExecuteNonQuery(); } }
2、//查詢,ExecuteScalar 一般用來執行有且只有一行一列返回值得SQL語句 using (SqlConnection conn = new SqlConnection(@"Data Source = .; Initial Catalog=tempdb;User ID=sa;Password=700513")) { conn.Open(); using (SqlCommand cmd = conn.CreateCommand()) { cmd.CommandText = "select count(*) from T_Student"; int i = (int)cmd.ExecuteScalar(); MessageBox.Show(i + "條資料"); } }
3、如何獲得剛插入一行記錄的Id號(獲得自增欄位的值) insert into T_Student(Name,Age) output inserted.Id values('aaa',123)
4、執行查詢時,有多行結果集用executeReader: using (SqlConnection conn = new SqlConnection("Data Source=.;Initial Catalog=tempdb;User ID=sa;Password=700513")) { conn.Open(); using (SqlCommand cmd = conn.CreateCommand()) { cmd.CommandText = "select * from T_Student"; using (SqlDataReader reader = cmd.ExecuteReader()) { while (reader.Read()) { long id = reader.GetInt64(0); string name = reader.GetString(1); MessageBox.Show(id + "," + name); } }
} }
5、SqlDataReader是連線相關的,SqlDataReader中的查詢結果並不是放到程式中的,而是放到資料庫伺服器中,SqlDataReader只是相當於放了一個指標(遊標),只能讀取當前遊標指向的行,一旦連線斷開就不能再讀取。這樣做的好處就是無論查詢結果有多少條,對程式佔用的記憶體都幾乎沒有影響。 SqlDataReader對於小資料量的資料來書帶來的只有麻煩。ADO.Net中提供了資料集的機制,將查詢結果填充到本地記憶體中,這樣連線斷開、伺服器斷開都不影響資料的讀取。 DataSet dataset = new DataSet(); SqlDataAdapter adapter = new SqlDataAdapter(cmd); adapter.Fill(dataset); DataSet包含若干表Data Table,Data Table包含若干行DataRow。 foreach(DataRow row in dataset.Tables[0].Rows) row["Name"]。 連線例項: using (SqlConnection conn = new SqlConnection("Data Source=.;Initial Catalog=tempdb;User ID=sa;Password=700513")) { conn.Open(); using (SqlCommand cmd = conn.CreateCommand()) { cmd.CommandText = "select * from T_Student where Age<@aaa"; cmd.Parameters.Add(new SqlParameter("@aaa", 100)); //SqlDataAdapter是一個把SqlCommand查詢結果填充到DataSet中的類 SqlDataAdapter adapter = new SqlDataAdapter(cmd); //DataSet 相當於本地一個複雜的集合(List<string>) DataSet dataset = new DataSet(); adapter.Fill(dataset); DataTable table = dataset.Tables[0]; DataRowCollection rows = table.Rows; for (int i = 0; i < rows.Count; i++) { DataRow row = rows[i]; int age = (int)row["Age"]; string name = (string)row["Name"]; MessageBox.Show(age+"--"+name); } } }
二、連線字串的配置化: 將連線字串寫在程式碼中的缺點:多次重負,如果要修改連線字串就要修改程式碼。將連線字串寫在App.Config中:
1、在App.Config中新增connectionStrings段,新增一個add項,用name屬性起一個名字(比如DbConnStr),connectionString屬性指定連線字串。
2、在“引用”節點上點右鍵“新增引用”,找到System.configuration。不是所有.Net中的類都能直接呼叫,類所在的Assembly要被新增到專案的引用中才可以。
3、ConfigurationManager》ConnectionStrings["DbConnStr"].ConnectionString得到連線字串。
4、如何在部署的程式中修改配置 例項: string connStr = System.Configuration.ConfigurationManager.ConnectionStrings["dbConnStr"].ConnectionString;
四、當有多條查詢結果時,用ExecuteReader(): using (SqlConnection conn = new SqlConnection (@"Data Source=.;Initial Catalog=AdventureWorks;User ID=sa;Password=700513")) { conn.Open(); using( SqlCommand cmd = conn.CreateCommand()) { cmd.CommandText = "select * from T_Student"; using(SqlDataReader reader = cmd.ExecuteReader()) { while(reader.Read()) { string name = reader.GetString(1); int age = reader.GetInt32(2); MessageBox.Show(name+","+age); } } } }
五、查詢引數: 拼接SQL會造成注入漏洞攻擊。 SQL語句使用@UserName表示“此處用引數代替”,向SqlCommand的Parameters中新增引數: cmd.CommandText = "select * from T_Users where [email protected] and [email protected]"; cmd.Parameters.Add(new SqlParameter("@UserName","admin")); cmd.Parameters.Add(new SqlParameter("@Password","password"));
六、設計使用者登入:
1、使用者資料庫欄位 Id、UserName、Password、ErrorTimes
2、資料匯入:從文字檔案匯入使用者資訊。易錯點:Parameter的重複新增。 File.ReadAllLines()
3、資料匯入:將使用者資訊匯出到文字檔案。File.WriteAllLines()