一、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 UserName=@UserName and Password=@Password"; 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()