在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
SQLServer数据访问两大类数据访问方式: 1.轻量级:SqlConnection,SqlCommand,SqlDataReader 2.重量级(内存占用量比较大):SqlConnection,SqlDataAdapter,DataTable
步骤: 1、建立链接对象——建一个通向数据库的通道。 2、打开通道 3、操作数据库 4、关闭通道
五大对象: 链接对象,命令对象,读取器对象,适配器对象,数据集(数据表)
对象介绍: 命名空间:操作SQLServer数据库: using System.Data; using System.Data.SqlClient; //针对SqlServer进行优化了的数据访问类的空间 System.Data.OleDB;System.Data.ODBC; //命名空间通用数据访问类的空间。
ODBC——Open DataBase Connection开放式数据互联
一、连接对象(SqlServer):SqlConnection(一)构造: SqlConnection() SqlConnection(连接字符串)
连接字符串的写法。 第一种:手写 "server=.;database=mydb;uid=sa;pwd=sa"; 第二种:使用服务器资源管理器,通过添加链接用可视化界面生成链接对象,通过查看属性来获得连接字符串。(菜单栏中“视图”→“服务器资源管理器”→右键→“添加连接”→选择“Sql Server”→VS窗口右边的“属性”→“链接字符串”)
(二)属性: ConnectionString:字符串,设置或获取链接对象的连接字符串。 State:ConnectionState枚举类型,返回当前连接状态。
(三)方法: Open():void,打开连接 Close():void,关闭连接 CreateCommand():SqlCommand,创建命令对象,生成一个通过本链接对象来访问数据库的SqlCommand实例。(好处是,不用对命令对象单独设置Connection属性)
(四)代码: SqlConnection conn = new SqlConnection("server=.;database=mydb;uid=sa;pwd=sa");//创建连接通道 try { conn.Open(); .... } finally { conn.Close(); }
如何在App.Config配置文件中配置数据库连接字符串 <?xml version="1.0" encoding="utf-8" ?> <configuration> <connectionStrings> <add name="sql" connectionString="server=.\sqlexpress;database=mydb;uid=sa;pwd=sa"/> </connectionStrings>
读取App.Config中的链接字符串 public class DBConnection { public static SqlConnection Connection { get { //从配置文件中读取链接字符串 string connectionString = ConfigurationManager.ConnectionStrings["sql"].ConnectionString;
SqlConnection conn = new SqlConnection(connectionString);
return conn; } } }
string connectionString = ConfigurationManager.ConnectionStrings["sql"].ConnectionString; 注意: 1.需要添加System.Configuration引用。 2.需using System.Configuration命名空间。
二、命令对象(SqlServer):SqlCommand(一)构造: SqlCommand() SqlCommand(string sql) SqlCommand(string sql,SqlConnection conn) conn.CreateCommand() //通过连接通道创建命令对象。
(二)属性: CommandText //string,要执行的SQL命令——SQL语句,存储过程名。 CommandType //Commandtype,枚举类型 CommandType.Text //SQL语句(默认)。 CommandType.StoredProcedure //存储过程。 如何调用存储过程? 1.把CommandText赋为存储过程的名。 2.把CommandType赋为CommandType.StoredProcedure。 3.使用cmd.Parameters.AddWithValue()为存储过程参数赋值。
Connection //SqlConnection对象。执行命令时,所使用连接对象。 Parameters //SqlParameterCollection,当CommandText中使用SqlServer局问变量时,需要通过该属性来对变量赋值。
(三)方法: ExecuteNonQuery(); //int,执行SQL命令,返回影响的行数。一般用来执行增、删、改 ExecuteReader(); //SqlDataReader,执行SQL命令,返回数据读取器。一般用来执行查询 ExecuteScalar(); //object,执行SQL命令,返回首行首列,一般用来执行统计(count(),sum(),avg(),max(),min())查询的。 例:int count=(int)ExecuteScalar();
(四)重要代码: SqlConnection conn = new SqlConnection("server=.;database=mydb;uid=sa;pwd=sa"); //创建连接
//SqlCommand cmd = new SqlCommand(); //cmd.Connection = conn; SqlCommand cmd = conn.CreateCommand(); //创建命令对象
//设置命令的类型 cmd.CommandType = CommandType.Text; //如果要调用存储过程:cmd.CommandType = CommandType.StoredProcedure;
//指定SQL命令 cmd.CommandText = "insert into nation values(@code,@name) ";
//添加命令参数 cmd.Parameters.AddWithValue("@code","n005"); cmd.Parameters.AddWithValue("@name","壮族"); //为SQL命令中的变量赋值。下面为另一种变量赋值方式 //SqlParameter paramCode = new SqlParameter("@code","n005"); //cmd.Parameters.Add(paramCode); //SqlParameter paramName = new SqlParameter("@name","壮族"); //cmd.Parameters.Add(paramName);
try { conn.Open(); cmd.ExecuteNonQuery(); } finally { conn.Close(); }
SQL注入攻击,原理分析及对策(单引号替换,使用SQL局部变量)。 所谓SQL注入,就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。 规避办法: 1.把单引号替换成双引号; 2.修改查询语句,使用SQLSERVER的局部变量来传递参数。(使用cmd.Parameters.AddWithValue()来解决)
三、读取器对象(SqlServer):SqlDataReader只读,只向前的数据读取对象。 它不是结果集,它内存中只占一条数据的空间。每次读取下一条时,会把内存中当前条的内容覆盖。
(一)构造: 不能直接new出来,原因是,它的构造函数是非public的。 只有唯一的生成方式:cmd.ExecuteReader([CommandBehavior.CloseConnection]); 例:SqlDataReader dr = cmd.ExecuteReader(); (二)属性: .HasRows //返回bool型数据,判断读取器中是否查出数据。
(三)方法: .Read(); //读取下一条数据到内存中来。返回bool型数据。 .Close(); //关闭读取器。一般不会关闭链接,但如果读取器生成的时候Command对象的ExecuteReader()方法中带有CommandBehavior枚举型参数的话,可能把连接也给关掉。 dr[“列名”]; //读取内存中当前SqlDataReader对象中的某列数据,读出来的数据是Object类型。 dr[索引号]; //读取内存中当前SqlDataReader对象中的某列数据,读出来的数据是Object类型。 dr.GetString(索引号),dr.Getint(索引号)……
(四)重要代码: string connectionString = @"server=.\sqlexpress;database=mydb;uid=sa;pwd=sa"; SqlConnection conn = new SqlConnection(connectionString);
SqlCommand cmd = new SqlCommand(); cmd.Connection = conn; cmd.CommandText = "select * from info";
conn.Open(); SqlDataReader dr = cmd.ExecuteReader(); while (dr.Read()) { Console.WriteLine(dr["Code"].ToString()+dr["Name"].ToString()); } conn.Close();
注意事情: 1.登录判断。 查询返回SqlDataReader,使用HasRows属性来判断是否查出记录来,登录是否成功。 SqlDataReader dr = cmd.ExecuteReader(); if(dr.HasRows) { } 2.查询多行数据出来,演示多行显示 SqlDataReader dr = cmd.ExecuteReader(); while(dr.Read()) { Console.WriteLine(dr["列名"].ToString()+(bool)dr[1]); //dr[常用的两种方式];dr[0],dr["列名"]返回的都是object }
四、DataTable/DataSetDataSet相当于内存中的数据库,其中包括多个DataTable。 DataTable相当于内存中的数据表。其中包括两个最重要的属性:Rows(DataRowCollection),Columns(DataColumnCollection)。分表代表:表的行集合和列集合。 (一)手动造DataTable //造表 DataTable table = new DataTable(); //造列 DataColumn col1 = new DataColumn("列名","类型","长度"); DataColumn col2 = new DataColumn("列名","类型","长度"); DataColumn col3 = new DataColumn("列名","类型","长度"); table.Columns.Add(col1); table.Columns.Add(col2); table.Columns.Add(col3); //造行 DataRow row1 = table.NewRow(); //用表对象来生成行结象 row1[0] = ""; row1["列名"] = ""; row1[2] = ""; table.Rows.Add(row1); DataRow row2 = table.NewRow(); //用表对象来生成行结象 row2[0] = ""; row2["列名"] = ""; row2[2] = ""; table.Rows.Add(row2); DataRow row3 = table.NewRow(); //用表对象来生成行结象 row3[0] = ""; row3["列名"] = ""; row3[2] = ""; table.Rows.Add(row3);
假设表中已经查出数据来了,我要取某个数据,怎么取法? 例如:假设查出一个数据表table的数据来。 1.我要操作第3行第5列的数据。(假设我从1开始数的列号和行号)。不能先读取列,因为一行才是一条完整的记录。
string s = table.Rows[2][4].ToString(); //取值 table.Rows[2][4] = "hello world";//赋值
2.我要操作所有的数据 for(int i=0;i<table.Rows.Count;i++) { for(int j=0;j<table.Columns.Count;j++) { Console.Write(table.Rows[i][j].ToString()); } }
3.控件绑定: xxx.DataSource = table;
(二)使用可视化界面造
五、数据适配器对象:SqlDataAdapter适本器对象中包含四大SqlCommand属性: SelectCommand InsertCommand DeleteCommand UpdateCommand
两大方法: Fill(DataTable/DataSet) Update(DataTable/DataSet)
数据访问有两种不同的方式,一种是用Connection, Command , DataReader来进行数据对数据的操作,另一种是用DataAdapter(适配器)来进行数据操作,而数据则一般放在内存中的数据集合DataSet,这种方式可以在内存中对数据操作,然后在合适的时间再将修改传到数据库。
(一)手写代码操作(简单了解)
(二)可视化界面操作。 1、建立数据集。 1)、在解决方案上点右键→“添加”→“新建项”→在左侧“数据”列表中找到“数据集” 2)、在服务器资源管理器中添加连接 3)、在数据库中找到需要的表,然后选中并拖动到右侧的数据集中
2、在数据集中添加新查询 1)、选中一个TableAdapter,右键→“配置”→打开“高级选项”→去掉后两项 2)、右键TableAdapter→“添加查询”→“使用SQL语句”→选择SQL语句类型→编写SQL语句→修改方法名称→完成
3、使用 1)、 造适配器对象: InfoTableAdapter info = new InfoTableAdapter(); 2)、造内存表对象 Mydb.InfoDataTable table = new Mydb.InfoDataTable(); 3)、 查询返回 table = info.GetData(); 4)、修改 InfoTableAdapter adp = new InfoTableAdapter(); info.UpdateBycode(name, sex, nation, birthday, code);
数据访问相关类的封装:连接类,实体类,数据访问类
装箱与拆箱:Boxing,Unboxing 值类型数据与引用类型数据之间的转化。 装箱:把数据从值类型变成引用类型;把数据由栈空间转型到堆空间。 拆箱:把数据从引用类型变成值类型;把数据由堆空间转型到栈空间。 int n = 19; object obj = n; //装箱 n = 20;
int m = (int)obj;//拆箱 有什么坏处? 装箱:占空间,占时间,运行慢。 拆箱:占用时间,可能出现类型异常
|
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论