访问数据库
1. 连接数据库
在做项目的时候,我们都需要通过程序来访问SQL Server
通过ADO.NET 这一技术,我们可以在程序中,向数据库提交执行SQL语句的一堆类。
本机访问直接访问“Windows验证”,但是一般项目都是单独的数据库服务器,程序在另外一台电脑上连接SQLServer,保障安全操作。
在做项目过程中不要启用sa账户,而是建立专用的账户,这是基于安全考虑。
启用sa账户的方法:进入属性页面后,可以启用sa账户和修改密码
2. 连接数据库的字符串
在C#代码中,用来连接数据库的字符串格式:
Data Source=127.0.0.1,1433;
Initial Catalog=mydb;
User ID=sa;
Password=123456
Data Source 要连接的数据库的IP地址和端口,IP地址,端口,IP地址必须填写,端口可以不填写。连接本机的话填 . 或者127.0.0.1 就可以了; 其他机子的话,填写IP地址,如192.168.1.100。
Initial Catalog 要访问的数据库名
User ID 用户名
Password 密码
3. 使用代码连接数据库
要想使用SqlConnection类 必须引用下面的命名空间: using System.Data.SqlClient;
通过SqlConnection类创建到SQLServer的连接,SqlConnection代表一个数据库连接。
string strConn = "Data Source=127.0.0.1,1433;Initial Catalog=MyTest;User ID=sa;Password=sqlserver2012"; using (SqlConnection conn = new SqlConnection(strConn))
{ conn.Open();
// do something }
为什么连接数据库的时候,使用了关键字 using ?
1. 通过使用using,可以达到简化资源释放的目的,凡是继承了IDisposable 接口的类都可以通过using来达到自动释放资源的目的。执行到 } 这里的时候,就会自动执行释放资源的方法。我们不必再写close()、Dispose()等方法来关闭和释放资源。这也是微软提供的一个简化资源释放的方式。
2. 如果数据库的连接一直被占用的话,假如占用的客户端很多时,服务器就会不堪重负了。另外,由于网络的不稳定性,容易造成不必要的麻烦。所以在需要对数据库进行操作的时候,去开启数据库的连接,不需要的时候及时地关闭。这样服务器就可以同时承受更多客户端的访问。
1 string strConn = "Data Source=127.0.0.1,1433;Initial Catalog=MyTest;User ID=sa;Password=sqlserver2012"; 2 using (SqlConnection conn = new SqlConnection(strConn)) 3 { 4 conn.Open(); 5 //通过SqlCommand类向数据库发出指令 6 using (SqlCommand cmd = conn.CreateCommand()) 7 { 8 //直接拼接字符串的查询语句,在输入 1‘ or ‘1‘ = ‘1 后,会出现SQL注入漏洞攻击 9 //cmd.CommandText = "select Salary from T_Staff WHERE Name = ‘" + tBoxStaffName.Text + "‘"; 10 11 //可以拥有多个参数 12 cmd.CommandText = "select Salary from T_Staff where Name = @Name and Age = @Age"; 13 //需要对多个参数进行依次赋值 14 cmd.Parameters.Add(new SqlParameter("@Name", tBoxStaffName_Copy.Text)); 15 cmd.Parameters.Add(new SqlParameter("@Age", tBoxStaffAge.Text)); 16 17 //用来从服务器中读取数据的类 18 using (SqlDataReader reader = cmd.ExecuteReader()) 19 { 20 while (reader.Read()) 21 { 22 MessageBox.Show(tBoxStaffName_Copy.Text + "的年龄是" + tBoxStaffAge.Text + ",工资是:" + reader["Salary"]); 23 } 24 } 25 } 26 }
4. SQLCommand类
向数据库发出指令的类
要执行的SQL语句存储在 CommandText 这个属性中。
常用的方法:
1. void ExecuteNonQuery() 一般用来执行Update、Delete、Insert类型的sql语句 ,也就是执行非查询类型的sql语句。
2. Object ExecuteScalar() 返回一个Object类型的值,一般用来执行只有一行或一列的返回值的SQL语句。
3. SqlDataReader ExecuteReader() 用来执行有多条查询结果的SQL语句。
4. SQLDataReader类
通过它,我们可以从服务器中读取数据,一般来说这些数据会比较大。它所获得的查询结果是放在数据库中的,如果将这些数据传到客户端的话,会占用客户端太多的内存。所以这个类在查询结果数据量较大的时候使用。
读取这些数据的方法:
我们可以通过索引器或者GetString、GetInt32等方法来获取数据。注意,通过索引器来读取数据时,获取的数据的类型是Object类型,在项目中要将这些数据强转为对应的类型。
while ( reader.Read() ) { Console.WriteLine( reader[0] ): //获取第一列的数据 Console.WriteLine( reader["Name"] ): //获取列名为Name这一列的数据 Console.WriteLine( reader.GetString(1) ): //第2列为string类型,获取第2列的数值,string类型
}
初始时,指针指向第一条数据之前,每调用一次 Reader指针向下移动一格,只要没有移动到最后一格之后,Read() 的返回值就为true。
5. DataSet类
它相当于一个复杂集合,如 List
与SqlDataReader 不同的是,我们需要先将数据从服务器传送到客户端的DataSet中,然后客户端直接从这里面获取数据。所以,在所查询的数据量较小的时候,使用DataSet可以减轻服务器的负担。
使用DataSet来读取数据:
1 string strConn = "Data Source=127.0.0.1,1433;Initial Catalog=MyTest;User ID=sa;Password=sqlserver2012"; 2 using (SqlConnection conn = new SqlConnection(strConn)) 3 { 4 conn.Open(); 5 using (SqlCommand cmd = conn.CreateCommand()) 6 { 7 cmd.CommandText = "select * from T_Staff"; 8 9 //SqlDataAdapter是一个帮我们把SqlCommand查询结果填充到DataSet中的类 10 SqlDataAdapter adapter = new SqlDataAdapter(cmd); 11 //DataSet相当于本地的一个复杂的集合(就像List一样) 12 DataSet dataSet = new DataSet(); 13 //执行查询语句,并且将查询结果填充到DataSet中 14 adapter.Fill(dataSet); 15 16 //把查询的结果放入表中 17 DataTableCollection tableColl = dataSet.Tables; 18 DataTable table = tableColl[0]; 19 //集合中放的是每一行的数据 20 DataRowCollection rowsColl = table.Rows; 21 22 //使用循环来获取每一行的数据 23 foreach (DataRow row in rowsColl) 24 { 25 lStaff.Add(new Staff() 26 { 27 Name = (string)row["Name"], 28 Age = (int)row["Age"], 29 Sex = (bool)row["Sex"], 30 Height = (decimal)row["Height"], 31 Salary = (decimal)row["Salary"], 32 Department = (string)row["Department"] 33 }); 34 } 35 } 36 }
7. SQL语句参数化查询
采用直接拼接sql语句字符串的方法
cmd.CommandText = "select Salary from T_Staff WHERE Name = ‘" + tBoxStaffName.Text + "‘";
这里的tBoxStaffName.Text 通常是客户端的文本框上的内容,这样做容易出现SQL注入漏洞攻击。
cmd.CommandText = "select Salary from T_Staff WHERE Name = ‘1‘ or ‘1‘ = ‘1‘";
执行上的语句后,会把表中所有员工的工资都查出来,造成了数据的泄漏。
为了避免这样的问题,我们使用参数化查询。
1. 先将参数放入sql语句中,参数的格式: @Name ,必须以@开头
2. 对参数进行赋值
//直接拼接字符串的查询语句,在输入 1‘ or ‘1‘ = ‘1 后,会出现SQL注入漏洞攻击 //cmd.CommandText = "select Salary from T_Staff WHERE Name = ‘" + tBoxStaffName.Text + "‘"; //可以拥有多个参数 cmd.CommandText = "select Salary from T_Staff where Name = @Name and Age = @Age"; //需要对多个参数进行依次赋值 cmd.Parameters.Add(new SqlParameter("@Name", tBoxStaffName_Copy.Text)); cmd.Parameters.Add(new SqlParameter("@Age", tBoxStaffAge.Text));
注意:参数不能用来替换表名、字段名、select之类的关键字等。
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。