这是本人在学习ADP.NET过程中所作的笔记,可作为ADO.NET入门或者复习的教程。
连接字符串:
DataSource=localhost; AttchDBFilename=|DataDirectory|\Database1.mdf; InitialCatalog=UserDate; Integrated Security=True
参数说明:
Data Source表示数据源,其值为服务器地址和实例名,如果是正式版则不用加SQLEXPRESS,如果是免费版,必须加上SQLEXPRESS,即连接本机可以写成".\ SQLEXPRESS";
AttchDBFilename表示附加数据库,其值为附加数据库的地址,DataDirectory代表当前项目目录下的App_data目录,是数据库的默认存储路径;
Initial Catalog为数据库,其值为当前连接所要连接的数据库名称
注:如果要使用Sqlconnection对象,必须导入System.Data.Sqlclient命名空间
ADO.NET中的连接等资源都实现了IDisposable接口,可以使用using进行资源管理。也可以使用try……catch语句块括起来,但是using是最简单的。
代码语句:
using (SqlConnection con = new SqlConnection("Data Source=localhost;Initial Catalog=UserDate;Integrated Security=True"))
{
程序语句块;
}
或者:
SqlConnection cnn = new SqlConnection();//创建SqlConnection对象的一个实例 cnn.ConnectionString = "Data Source=localhost;Initial Catalog=UserDate;Integrated Security=True";
cnn.Open();
注:using的作用是及时的释放资源,在花括号结束的时候,程序会自动释放语句所申请的内存,以达到程序的最优。
一、通过SqlCommand对象执行SQL语句
SqlCommand对象可以执行SQL语句完成对数据库的增、删、改、查等数据操作。在SqlCommand类中,最主要的属性有CommandText,该属性用于接收要执行的SQL语句,例如cmd.CommandText = "INSERT INTOb1(name, company, position, shijian) VALUES(@Name, @Company, @Position,@Datetime)",除了CommandText属性,主要还有Connection属性,用来接收数据库连接,还有Transaction属性,用来接收事物。
其还有三个比较常用的方法,第一个是ExecuteNonQuery()方法,主要用来提交无查询结果的SQL语句,如UPDATE,INSERT,DELETE等语句,其返回值为数据库中被SQL语句影响的行数,第二个是ExecuteReader()方法,主要用来提交SELECT语句,返回值是一个数据流,里面是SELECT语句的查询结果,可以用SqlDataReader对象来接收,然后调用其Read()方法来逐行读出查询结果。第三个是ExexuteScalar()方法,主要也是用来提交SELECT语句,但是其返回值是查询结果的第一行第一列,所以适用于例如COUNT等聚合查询。
二、SQL注入与参数化查询
SQL注入是通过特殊的SQL语句非法获取数据库的内容。为了保证系统不被黑客进行SQL注入攻击,在SqlCommand执行SQL语句时,可以对提交的数据先进行参数化处理,参数化处理主要是通过SqlCommand对象的Parameters属性的Add方法来完成,参数化处理有两种方法,第一种既是在"执行Insert操作"中提到的,还有另外一种代码如下:
cmd.CommandText = "INSERT INTO b1(name, company, position, shijian) VALUES(@Name, @Company, @Position, @Datetime)";
cmd.Parameters.Add(new SqlParameter("Name", Name.Text));
cmd.Parameters.Add(new SqlParameter("Company", Company.Text));
cmd.Parameters.Add(new SqlParameter("Position", Position.Text));
cmd.Parameters.Add(new SqlParameter("Datetime", DateTime.Parse(Datetime.Text)));
cmd.ExecuteNonQuery();
注:以上的代码中需要注意一点,在第一种代码中,显示的对各个参数的数据进行了定义,但是在上面这种代码中,并未对参数进行数据定义,所以需要在提供数据时对数据进行适时的转换,例如"shijian"在数据库中定义为DateTime类型,但是其在文本框中获得的为string类型,所以需要调用DateTime的Parse方法对数据进行转换,如果数据库中的数据是int型,在赋值时也应进行相应的转换。
三、执行Insert操作
首先,需要申明一个SqlCommand对象;
其次,用SqlConnection的CreateCommand()函数,创建一个SqlCommand对象,然后将所要执行的SQL语句赋值给SqlCommand的CommandText属性;
最后,调用SqlCommand类的ExexuteNonQuery()方法,执行CommandText的SQL语句。
代码语句:
using(SqlCommand cmd = con.CreateComand())
{
cmd.CommandText = "INSERT INTO b1(name, company, position) VALUES("whh", "UVGE", "coder")";
cmm.ExecuteNonQuery();
}
或者:
using(SqlCommand cmd = con.CreateComand())
{
//设置SQL语句
cmm.CommandText = "INSERT INTO b1(name, company, position, shijian) VALUES(@Name, @Company, @Position, @Datetime)";
//创建参数,并定义其数据类型,要和数据库中对应的字段保持相同
cmm.Parameters.Add("@Name", SqlDbType.NVarChar);
cmm.Parameters.Add("@Company", SqlDbType.NVarChar);
cmm.Parameters.Add("@Position", SqlDbType.NVarChar);
cmm.Parameters.Add("@Datetime", SqlDbType.DateTime);
//设置参数的值,这些值来自前段的输入信息
cmm.Parameters["@Name"].Value = Name.Text;
cmm.Parameters["@Company"].Value = Company.Text;
cmm.Parameters["@Position"].Value = Position.Text;
cmm.Parameters["@Datetime"].Value = Datetime.Text;