SQL Server知识点回忆篇(三):ADO.NET之C#操作数据库
1.连接数据库
(1)创建连接字符串:
使用windows身份验证时的连接字符串:
private string conStr="Data Source=MyTestDB;Initial Catalog=tbUsers;Integrated Security=True";
使用用户名和密码时的连接字符串:
private string conStr="Data Source=MyTestDB;Initial Catalog=tbUsers;uid=sa;pwd=test";
(2)创建连接对象:
SqlConnection con=new SqlConnection(Constr);
(3)打开连接:
con.Open();
(4)关闭连接,释放资源:
强烈建议在使用完连接时一定要关闭连接,以便连接可以返回到ADO.NET连接池中。
con.Close();
con.Dispose();
2. 连接数据库执行sql语句 -- ExecuteNonQuery()的使用
.NET Framework 提供的 SqlCommand 对象,用于执行SQL语句。
调用ExecuteNonQuery()方法执行sql语句,返回一个 int 类型的数据,值是影响的行数,在使用insert,update, delete语句时可调用该方法执行sq语句。
public static int ExeNoQuery(string sql) { using (SqlConnection con=new SqlConnection(Constr)) { using (SqlCommand cmd=new SqlCommand(sql,con)) { con.Open(); return cmd.ExecuteNonQuery(); } } }
3. 连接数据库执行sql语句 -- ExecuteScalar()的使用
调用 ExecuteScalar() 方法执行sql语句,返回一个 object 类型的数据,值是执行sql语句的结果,在使用聚合函数时可调用该方法执行sq语句。
public static object ExeScalar(string sql) { using (SqlConnection con = new SqlConnection(Constr)) { using (SqlCommand cmd = new SqlCommand(sql, con)) { con.Open(); return cmd.ExecuteScalar(); } } }
4. 连接数据库执行sql语句 -- ExecuteReader()的使用
使用ExecuteReader()方法执行sql语句,返回值为SqlDataReader类型,可以从返回的SqlDataReader中一条一条取数据,该方法用于查询多行多列结果时。
SqlDataReader只读取数据,只能前进不能后退。使用SqlDataReader时必须保证连接是打开状态。
SqlDataReader使用完毕后,要把SqlDataReader关闭,释放。
public static SqlDataReader ExeReader(string sql) { SqlConnection con = new SqlConnection(Constr); SqlCommand cmd = new SqlCommand(sql, con); con.Open(); SqlDataReader reder = cmd.ExecuteReader(CommandBehavior.CloseConnection); return reder; }
5. 连接数据库执行sql语句 -- SqlDataAdapter的使用
使用SqlDataAdapter,可以将查询的结果填充在datatable中返回。
public static DataTable ExeAdapter(string sql) { using (SqlConnection con =new SqlConnection(Constr)) { using (SqlCommand cmd = new SqlCommand(sql,con)) {using (SqlDataAdapter da = new SqlDataAdapter(cmd)) { DataTable dt = new DataTable(); con.Open(); da.Fill(dt); return dt; } } } }
6. 使用带参数的 sql 语句
为了安全的使用sql语句,防止sql注入,请不要直接使用用户输入的值来拼接sql语句,应使用参数的方式将值传入sql语句执行。
带参数的sql语句:
string strsql = "insert into tbUsers(UserName,Age,Email,DepartmentID) values(@uName,@uAge,@uEmail,@uDeptID)"; SqlParameter[] ps = new SqlParameter[] { new SqlParameter("@uName",SqlDbType.VarChar) {Value="小明"}, new SqlParameter("@uAge",SqlDbType.Int) {Value=25 }, new SqlParameter("@uEmail",SqlDbType.VarChar) {Value="xiaoming@qq.com" }, new SqlParameter("@uDeptID",SqlDbType.VarChar) {Value="1001" } }; int iRow = ExeNoQuery(strsql, ps); if (iRow>0) { Console.WriteLine("影响的行数:{0}",iRow); } Console.ReadKey();
执行带参数的sql语句:
public static int ExeNoQuery(string sql, SqlParameter[] para) { using (SqlConnection con = new SqlConnection(Constr)) { using (SqlCommand cmd = new SqlCommand(sql, con)) { if (para != null) { cmd.Parameters.AddRange(para); } con.Open(); return cmd.ExecuteNonQuery(); } } }
7. ADO.NET连接池
(1) 连接池使新连接必须打开的次数得以减少。
(2) 启用ADO.NET连接池后,创建一个连接对象,不会立刻关闭。后面的其他连接对象可以直接使用。
(3) 连接池中的对象过一段时间没有被访问会自动销毁。(如果空闲时间达到大约 4-8 分钟,或池进程检测到与服务器的连接已断开,连接池进程会将该连接从池中移除。)
(4) 默认情况下,在 ADO.NET 中连接池是启用的。