您的位置:首页 > 编程语言 > C#

C#回顾学习笔记三十八:ADO.NET的使用与总结

2017-09-24 00:11 573 查看
1)ADO.NET是什么?

ADO.NET是用于和数据库打交道的.NET技术,是一组向.net程序员公开的数据库访问服务的类。ADO.NET提供了一个统一的编程模式和一组公用的类来进行任何类型的数据访问。ADO.NET是.NET中提供的标准访问数据库的接口,访问不同DBMS的底层方法不一样,ADO.NET把访问数据库的方法进行了统一,访问MySql、Oracle、SQLServer等不同数据库的用法几乎一模一样。

2)为什么学习ADO.NET?

ADO.NET是访问数据库并操作数据的很好方式,并且ADO.NET还是EntityFramework的底层代码。学习ADO.NET有助于学习如何在项目中访问数据库操作数据。

3)如何使用ADO.NET?

实际上是学习如何使用ADO.NET技术提供的操作数据库的类和方法。这里不详细一个一个讲解每个类和方法的用处,我们直接写一个类来封装需要操作数据库的方法,而且这也是平时项目开发最喜欢用的方式。详细步骤如下:

第1步,在项目的App.config文件下配置数据库连接参数,这里以控制台程序为例,所以使用的App.config,不同项目可能文件名字不一样,需要注意。并且这里是以SQLserver数据库为例子讲解,因为SQLserver跟VS都是微软的产品,一家人就是要完完整整,也不需要配置或引用其他数据库文件,很方便。详细代码如下,在<configuration>标签下配置数据库连接参数:

<connectionStrings>

    <add name="testConn" connectionString="server=.;database=DataTest;uid=abc;pwd=123456"/>

  </connectionStrings>

注意:name里的值可任意设置,connectionString里的值“server表示数据库地址,这里小数点代表本地。database表示要操作的数据库名字。uid表示登录数据库的用户名。pwd表示登录数据库的密码。”

第2步,封装一个SQLHelper类,这个类就包含了操作数据库增删改查的必要方法,详细代码如下:

class SqlHelper
{
private static readonly string connStr = ConfigurationManager.ConnectionStrings["testConn"].ConnectionString;

public static SqlConnection createConnection()
{
SqlConnection conn = new SqlConnection(connStr);
conn.Open();
return conn;
}

//执行操作:增、删、改。(具体实现)
public static int ExecuteNoneQuery(SqlConnection conn, string sql, params SqlParameter[] parameters)
{
using (SqlCommand cmd = conn.CreateCommand())
{
cmd.CommandText = sql;
cmd.Parameters.AddRange(parameters);
return cmd.ExecuteNonQuery();

4000
}
}
public static int ExecuteNoneQuery(string sql, params SqlParameter[] parameters)
{
using (SqlConnection conn = createConnection())
{
return ExecuteNoneQuery(conn, sql, parameters);
}
}

//执行查询:select返回数据库首行首列的值。(具体实现)
public static object ExecuteScalar(SqlConnection conn, string sql, params SqlParameter[] parameters)
{
using (SqlCommand cmd = conn.CreateCommand())
{
cmd.CommandText = sql;
cmd.Parameters.AddRange(parameters);
return cmd.ExecuteScalar();
}
}

public static object ExecuteScalar(string sql, params SqlParameter[] parameters)
{
using (SqlConnection conn = createConnection())
{
return ExecuteScalar(conn, sql, parameters);
}
}

//执行查询:select返回多行多列。(具体实现)
public static DataTable ExecuteQuery(SqlConnection conn, string sql, params SqlParameter[] parameters)
{
DataTable table = new DataTable();
using (SqlCommand cmd = conn.CreateCommand())
{
cmd.CommandText = sql;
cmd.Parameters.AddRange(parameters);
using (SqlDataReader reader = cmd.ExecuteReader())
{
table.Load(reader);
}
}
return table;//返回加载的表
}

public static DataTable ExecuteQuery(string sql, params SqlParameter[] parameters)
{
using (SqlConnection conn = createConnection())
{
return ExecuteQuery(conn, sql, parameters);
}
}

}
注意:ConnectionStrings["testConn"]里的testConn名字必须跟App.config里配置的名字保持一致。注释里加了(具体实现)的方法属于具体跟数据库打交道的方法,而与其同名的方法只是构成了重载。构成重载的这个方法主要用于外界调用,而这个方法又将具体实现转交给其他方法实现。因为这种重载方法少一个参数,在主函数调用更加方便省力,链接数据库的对象也是在这个类的内部完成,更加减少了主函数的负担。

第3步,主函数代码包含了对数据库增删改查的练习,这里用#region分别折叠,可以分别取消注释并运行观察,注意数据库的配置要与练习代码保持一致,表名是UserInfo,字段有Id、userName、passWord、Age:

class Program
{
static void Main(string[] args)
{
#region 查询表所有记录ExecuteQuery()练习
//DataTable table = SqlHelper.ExecuteQuery("select * from UserInfo");
//for (int i = 0; i < table.Rows.Count; i++)
//{
//    DataRow row = table.Rows[i];
//    string userName = row["userName"].ToString();
//    string passWord = row["passWord"].ToString();
//    //如果passWord字段设为允许为null,则需要这样写:
//    //string passWord = row.IsNull("passWord") ? null : row["passWord"].ToString();
//    Console.WriteLine("用户名:{0},密码:{1}", userName, passWord);
//}
#endregion

#region 修改一条记录ExecuteNoneQuery()练习
//int row = SqlHelper.ExecuteNoneQuery("update UserInfo set userName=@userName where Id=1",
//    new SqlParameter("@userName", "user1"));
//Console.WriteLine(row);
#endregion

#region 根据sql执行结果返回首行首列的值ExecuteScalar()练习
//int count = (int)SqlHelper.ExecuteScalar("select count(*) from UserInfo");
//Console.WriteLine("数据库共有{0}条记录", count);
#endregion

#region 增加记录ExecuteNoneQuery()练习
            //int row = SqlHelper.ExecuteNoneQuery("insert into UserInfo values(@userName,@passWord,@Age)",
            //            new SqlParameter { ParameterName = "@userName", Value = "userTest" },
            //            new SqlParameter { ParameterName = "@passWord", Value = "passWordTest" },
            //            new SqlParameter { ParameterName = "@Age", Value = 12 });
            //Console.WriteLine("影响的行数是{0}", row);
#endregion

Console.ReadKey();
}
}
以上是对ADO.NET的使用步骤总结。

以下是对自己写的SQLHelper类里面用到的方法总结:

①createConnection()方法:是自己手写的一个方法,主要用于声明一个数据库连接对象,本次练习里这个方法只是交给其他方法调用,而不在主函数里调用。

②ExecuteNoneQuery()方法:执行一个sql语句并返回执行sql语句所影响的行数,通常就是对增、删、改进行操作。

③ExecuteScalar()方法:执行一个sql语句并返回首行首列的结果。通常用于查询,并返回查询结果的首行首列值,比如统计表中有多少条记录,就是select count(*)。

④ExecuteQuery()方法:这个方法并不是ADO.NET自带的,而是由程序员自定义的名字。主要是用于执行sql语句并返回多条记录的值,起关键作用的是这个方法内部调用的ExecuteReader()方法,将查询结果返回并保存到DataTable类型的对象里。

⑤参数params SqlParameter[] parameters:这个参数主要是动态识别调用方法时传入的参数数组,params的作用在初期学习C#时可能就接触过,是可变参数。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: