本文介绍原生的ado.net(访问sql server数据库)
写在前面
- 数据库连接字符串
过时的写法 string str = "server=localhost;database=my_db;uid=sa;pwd=123"; 主流的写法 sql验证写法 string str = "Data Source=localhost;Initial Catalog=my_db;User ID=sa;Password=123"; windows验证写法 string str = "Data Source=localhost;Initial Catalog=my_db;integrated Security=true"; Data Source 表示数据源 Initial Catalog 表示数据库
- 连接池技术
ado.net默认采用连接池技术,当close了一个连接,会将连接对象放进程序池中,下次open,如果对象没有占用,会直接拿来用,当有其他并发用户同时操作时,会创建多个连接对象,这时拼的就是连接池容量了 你可以在连接字符串中添加 Pooling=false 禁用连接池技术
联接模型(不缓存数据,每次查询都要重新访问数据库)
- Connection对象
此对象用来连接数据库 string str = "server=localhost;database=my_db;uid=sa;pwd=123"; using(SqlConnection con = new SqlConnection(str)) { con.Open(); if(con.State == ConnectionState.Open) { Console.WriteLine("连接成功"); } //con.Close(); 关闭实例,可以使用Open再次打开 //con.Dispose(); 销毁实例 } ConnectionState还有如下几个属性 Broken 与数据源中断 Closed 连接处于关闭状态 Connecting 连接正在进行 Executing 表示sql命令正在运行 Fetching 正在检索数据 Open 连接处于打开状态
- Command对象
使用流程 string str = "server=localhost;database=my_db;uid=sa;pwd=123"; using(SqlConnection con = new SqlConnection(str)) { SqlCommand cmd = new SqlCommand(); // 创建command对象,用来执行sql语句 cmd.Connection = con; // 设置连接对象 cmd.CommandText = "select count(*) from [dbo].[Product]"; cmd.CommandType = CommandType.Text; // 设置sql命令为字符串类型 // 执行sql con.Open(); if(con.State == ConnectionState.Open) { var i = cmd.ExecuteScalar(); Console.WriteLine(i); } } 带参数sql语句的使用(防止sql注入攻击) string str = "Data Source=localhost;Initial Catalog=my_db;User ID=sa;Password=123"; using (SqlConnection con = new SqlConnection(str)) { using(SqlCommand cmd = new SqlCommand()) { cmd.Connection = con; // 设置连接对象 cmd.CommandText = "select count(*) from [dbo].[ProductAddress] where productAdressID > @id"; cmd.CommandType = CommandType.Text; cmd.Parameters.Add(new SqlParameter("@id", SqlDbType.Int) { Value = 3 }); // 添加参数 // 简写形式,不推荐,因为可以传递任意值 cmd.Parameters.AddWithValue("@id", 3); // SqlParameter parmId = new SqlParameter("@id", 0); 这样写报错,不推荐 con.Open(); if (con.State == ConnectionState.Open) { var i = cmd.ExecuteScalar(); Console.WriteLine(i); } } } 执行sql语句的方法 ExecuteScalar 执行的结果只有一行一列数据,如果执行的新增sql语句带有output参数,那么返回值是新增的id insert into mytable output ... ExecuteNonQuery 不需要返回结果,也就是完成增删改 ExecuteReader 执行的结果多行多列,完成查询操作 用法和上面有点区别,如下 using(var items = cmd.ExecuteReader()) { if(items.HasRows) { while (items.Read()) { // 每一行数据 for(var i = 0; i < items.FieldCount; i ++) { // 每一列数据 Console.Write(items[i]); } Console.WriteLine(""); } } } 执行存储过程 string str = "server=localhost;database=my_db;uid=sa;pwd=123"; using(SqlConnection con = new SqlConnection(str)) { SqlCommand cmd = new SqlCommand(); // 创建command对象,用来执行sql语句 cmd.Connection = con; // 设置连接对象 cmd.CommandText = "[dbo].[myTest]"; cmd.CommandType = CommandType.StoredProcedure; // 设置sql命令为存储过程 cmd.Parameters.Add("@p1", SqlDbType.Int); // 添加参数 cmd.Parameters["@p1"].Value = 3; // 设置参数值 // 执行sql con.Open(); if(con.State == ConnectionState.Open) { var items = cmd.ExecuteReader(); while (items.Read()) { // 每一行数据 for (var i = 0; i < items.FieldCount; i++) { // 每一列数据 Console.Write(items[i]); } Console.WriteLine(""); } } }
非联接模型(将数据缓存在DataSet中,这种方式针对于windows控件使用比较好)
- DataAdapter对象
string str = "server=localhost;database=my_db;uid=sa;pwd=123"; using(SqlConnection con = new SqlConnection(str)) { SqlCommand cmd = new SqlCommand(); // 创建command对象,用来执行sql语句 cmd.Connection = con; // 设置连接对象 cmd.CommandText = "select * from [dbo].[Product]"; cmd.CommandType = CommandType.Text; // 设置sql命令为字符串类型 // 执行sql con.Open(); if(con.State == ConnectionState.Open) { SqlDataAdapter sda = new SqlDataAdapter(); // 创建SqlDataAdapter对象 sda.SelectCommand = cmd; // 设置sql命令对象 /* SelectCommand 发送查询语句,在调用Fill方法时触发 DeleteCommand 发送删除语句,在调用Updata方法时触发 InsertCommand 发送插入语句,在调用Updata方法时触发 UpdateCommand 发送更新语句,在调用Updata方法时触发 */ DataSet ds = new DataSet(); // 创建一个DataSet对象,内存数据库 sda.Fill(ds, "myTable"); // 调用此法会自动执行SelectCommand,将查询的数据放到ds中,第二个参数是内存表名 var table = ds.Tables["myTable"]; // 获取表 sda.FillSchema(table, SchemaType.Mapped); // 将数据库表结构加载到内存表中 var t = ds.Tables["myTable"].Rows.Find(3); // 找出主键为3的行 t["ProductName"] = "护眼台灯"; // 修改数据 // 创建SqlCommandBuilder方便执行数据库更新操作,相当于在执行Insert,Update,Delete操作时,自动生成了sql脚本, // 从而在调用Update方法是可以直接更新数据,方便快捷 SqlCommandBuilder scb = new SqlCommandBuilder(sda); sda.Update(table); } }
- DataSet和DataTable的使用
创建一个DataSet数据库 DataSet ds = new DataSet("myDb"); 创建一张表 DataTable dt = new DataTable("mytb"); 创建列 DataColumn mydc1 = new DataColumn("id", typeof(int)); DataColumn mydc2 = new DataColumn("Name", typeof(string)); 设置列的自动编号 mydc1.AutoIncrement = true; mydc1.AutoIncrementSeed = 1; mydc1.AutoIncrementStep = 1; 设置列非空 mydc2.AllowDBNull = false; 将列添加到表中 dt.Columns.Add(mydc1); 创建行 DataRow mydr = dt.NewRow(); mydr["Name"] = "叶家伟"; 将行添加到表中 dt.Rows.Add(mydr); 将表添加到数据库中 ds.Tables.Add(dt);
ado.net代码封装
- 配置连接字符串
将连接字符串提取出来方便以后修改 在App.config配置文件中的configuration节点下添加如下代码 <connectionStrings> <add name="mssqlserver" connectionString="Data Source=localhost;Initial Catalog=my_db;User ID=sa;Password=123"/> </connectionStrings> 在程序中要获取这段xml配置,需要添加 System.Configuration 引用
- 封装代码
public static class HandleAdoNet { private static readonly string constr = ConfigurationManager.ConnectionStrings["mssqlserver"].ConnectionString; public static int HandleExecuteNonQuery(string sqlstr, params SqlParameter[] param) { using(SqlConnection con = new SqlConnection(constr)) { using(SqlCommand cmd = new SqlCommand(sqlstr, con)) { if(param != null) { cmd.Parameters.AddRange(param); } con.Open(); return cmd.ExecuteNonQuery(); } } } public static object HandleExcuteScalar(string sqlstr, params SqlParameter[] param) { using(SqlConnection con = new SqlConnection(constr)) { using(SqlCommand cmd = new SqlCommand(sqlstr, con)) { if(param != null) { cmd.Parameters.AddRange(param); } con.Open(); return cmd.ExecuteScalar(); } } } public static SqlDataReader HandleExcuteReader(string sqlstr, params SqlParameter[] param) { SqlConnection con = new SqlConnection(constr); // 此链接对象需要在外界关闭 using(SqlCommand cmd = new SqlCommand(sqlstr, con)) { if(param != null) { cmd.Parameters.AddRange(param); } con.Open(); try { return cmd.ExecuteReader(CommandBehavior.CloseConnection); // 表示此方法调用成功,自动关闭连接对象 } catch { con.Close(); con.Dispose(); throw; } } } public static DataTable HandleSqlDataAdapter(string sqlstr, params SqlParameter[] param) { DataTable dt = new DataTable(); using (SqlDataAdapter sda = new SqlDataAdapter(sqlstr, constr)) { if(param != null) { sda.SelectCommand.Parameters.AddRange(param); } sda.Fill(dt); } return dt; } }
原文地址:https://www.cnblogs.com/ye-hcj/p/8191284.html
时间: 2024-10-13 04:06:40