代码改变世界

ADONET连接

2019-01-01 10:47  枫丹之梦  阅读(300)  评论(0编辑  收藏  举报

一、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()