用ASP.NET做了一个项目,但是,对于C#的一些东西并没有仔细学过,这几天仔细看了一下.NET数据访问的内容,做了笔记。如下
1、一般把数据库连接字符串写在config文件中:
- <?xml version="1.0" encoding="utf-8" ?>
- <configuration>
- <appSettings>
- <add key="ConnectionString"
- value="Data Source=LZQSMST-PC;
- Initial Catalog=JobHunter;
- Persist Security Info=True;
- User ID=sa;
- password=111111"/>
- </appSettings>
- <connectionStrings>
- <add name="ConnectionString"
- providerName="System.Data.SqlClinet"
- connectionString="
- Data Source=LZQSMST-PC;
- Initial Catalog=JobHunter;
- Persist Security Info=True;
- User ID=sa;
- password=111111" />
- </connectionStrings>
- </configuration>
2、获取连接字符串:
(1)代码文件中,要using System.Configuration。
(2)添加System.Configuration引用,就是在项目的解决方案栏中,右键添加System.Configuration引用,如果没有这一步,无法使用ConfigurationManager。
(3)获取的代码有以下几种:
- ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
- ConfigurationManager.AppSettings["ConnectionString"];
3、高效的连接方式
(1)使用try catch finaly
- try
- {
- conn.Open();
- }
- catch (Exception ex)
- {
- textBox1.Text += ex.Message;
- }
- finally
- {
- conn.Close();
- }
(2)使用using
- using(SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString))
- {
- conn.Open();
- //do something
- conn.Close();
- }
(3)以上两种的综合
- try
- {
- using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString))
- {
- conn.Open();
- //do something
- conn.Close();
- }
- }
- catch (Exception ex)
- {
- textBox1.Text += ex.Message;
- }
4、事务处理
- using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString))
- {
- conn.Open();
- //SqlTransaction tx = conn.BeginTransaction(IsolationLevel.ReadCommitted);IsolationLevel.ReadCommitted, "SampleTransaction");//隔离级别、事务名称
- SqlTransaction tx = conn.BeginTransaction();
- try
- {
- //do something
- tx.Commit();
- conn.Close();
- }
- catch (Exception e)
- {
- try
- {
- tx.Rollback();
- }
- catch (SqlException ex)
- {
- if (tx.Connection != null)
- {
- Console.WriteLine("An exception of type " + ex.GetType() +
- " was encountered while attempting to roll back the transaction.");
- }
- }
- Console.WriteLine("An exception of type " + e.GetType() +
- " was encountered while inserting the data.");
- Console.WriteLine("Neither record was written to database.");
- }
- }
5、命令SQLCommand
(1)两种构造方式:
- SqlCommand com = new SqlCommand();
- SqlCommand com = conn.CreateCommand();//conn为一SqlConnection对象
(2)初始化赋值:
- com.Connection = conn;//conn为一SqlConnection对象
- com.Transaction = tx;//tx为一SqlTransaction对象
- com.CommandText = "SELECT * FROM [tb1]";
- com.CommandType = CommandType.Text;//默认就是Text,如果是存储过程,应该是CommandType.StoredProcedure
6、执行命令
(1)ExecuteNonQuery
对于 UPDATE、INSERT 和 DELETE 语句,返回值为该命令所影响的行数(int)。对于其他所有类型的语句,例如select,返回值为 -1。
(2)ExecuteReader
返回一个SqlDataReader,记住,是SqlDataReader,不是DataSet,SqlDataReader不能直接实例化,就是不能直接new
读取方式如下:
- while(dr.Read()) //dr为一SqlDataReader对象
- {
- textBox1.Text += dr["a1"].ToString() + "/r/n";
- //textBox1.Text += dr[0].ToString() + "/r/n";
- //dr.GetString(0) + "/r/n";
- }
(3)ExecuteScalar
执行查询,并返回查询所返回的结果集中第一行的第一列。所有其他的列和行将被忽略。
这适用与只返回一个值的存储过程。
(4)ExecuteXmlReader
类似于ExecuteReader,返回一个xml的reader,注意:com.CommandText ="SELECT * FROM [tb1] for xml auto",即后面有类似于for xml auto/raw/explicit(使执行结果以xml文本返回)。
- SqlDataReader dr = com.ExecuteReader();
- while(dr.Read())
- {
- textBox1.Text += dr["a1"].ToString() + "/t";
- textBox1.Text += dr["a2"].ToString() + "/t";
- textBox1.Text += dr["a3"].ToString() + "/r/n";
- }
- //xr.ReadOuterXml()是另外一个好用的方法
6、调用存储过程
调用存储过程时,可以把存储过程的名字直接写在com.CommandText中,存储过程的参数使用SqlParameter类型,用com.Parameters.Add(new SqlParameter(...))
执行时,用ExecuteNonQuery就可以了
(1)有返回值的存储过程
设置com.UpdatedRowSource = UpdateRowSource.None即可
(2)没返回值的存储过程
需要设置SqlParameter参数的sp.Direction = ParameterDirection.Output/InputOutput等;
另外com.UpdatedRowSource = UpdateRowSource.OutputParameters
7、SqlDataAdapter 和 DataSet
配合起来用:
- SqlDataAdapter da = new SqlDataAdapter(com);
- DataSet ds = new DataSet();
- da.Fill(ds);
- DataTable dt = ds.Tables[0];
(1)如果SqlDataReader实例的话,在调用SqlDataAdapter时,要先把SqlDataReader给close掉
(2)DataSet由一个或多个DataTable组成,一个DataTable由一个或多个DataRow/DataColumn组成,dt.Rows[2][0]相当于dt.Columns[0][2];
DataTable.PrimaryKey指向一个DataColumn,设置其为主键;
为一个表设置外键时,要使用
- dt2.Constraints.Add(new UniqueConstraint(dt2.columns[0]));
- dt2.PrimaryKey = dt2.columns[0];
- ForeignKeyConstraint fk = new ForeignKeyConstraint(dt1.columns[0],dt2.columns[0]);
- fk.UpdateRule = Rule.Cascade;
- fk.DeleteRule = Rule.SetNull;
- dt1.Constraints.Add(fk);
(3)DataSet方面还要注意bind和GetChange等几个方法
这里只是对.NET数据访问进行一个小小的概要,很多东西都没有写的深入,如果存在错误,请给予指出。