ADO.NET 基本操作

概要

ADO.NET是.NET框架中的重要组件,主要用于完成C#应用程序访问数据库,类似于PHP中的PDO

使用

连接数据库 (Connection对象)

1. 连接字符串

基本语法:数据源(Data Source)+数据库名称(Initial Catalog)+用户名(User ID)+密码(Password)

例如

DataSource=.;Initial Catalog=myDataBase;UserId=myUsername;Password=myPassword;

 

 或者

Server=myServerAddress;Database=myDataBase;User Id=myUsername;Password=myPassword;Trusted_Connection=False;

 也可以直接在VS数据库资源管理器中获取连接字符串

 

2. 连接到数据库 (Connection对象)

Connection对象有两个重要属性: 

(1)ConnectionString:表示用于打开 SQL Server 数据库的字符串; 
(2)State:表示 Connection 的状态,有Closed和Open两种状态。 

Connection对象有两个重要方法:

(1)Open()方法:指示打开数据库;

(2)Close()方法:指示关闭数据库。

            string str = "Data Source=DESKTOP-3HH8GF6;Initial Catalog=TestDB;Persist Security Info=True;User ID=sa";
            //连接数据库,使用using可自动释放资源
            using (SqlConnection con = new SqlConnection(str)) {
                //打开数据库
                con.Open();
                //关闭数据库
                con.Close();
            }

操作数据库(Command对象)

Command对象也称为数据库命令对象,Command对象主要执行包括添加、删除、修改及查询数据的操作的命令。也可以用来执行存储过程。用于执行存储过程时需要将Command对象的CommandType 属性设置为CommandType.StoredProcedure,默认情况下CommandType 属性为CommandType.Text,表示执行的是普通SQL语句。

Command主要有三个方法: 

ExecuteNonQuery():执行一个SQL语句,返回受影响的行数,这个方法主要用于执行对数据库执行增加、更新、删除操作,注意查询的时候不是调用这个方法。用于完成insert,delete,update操作,类似于PDO中exec()

            using (SqlConnection con = new SqlConnection(str)) {
                //打开数据库
                con.Open();

                //string sql = "insert into Book values('三国演义','魏蜀吴的故事',3)";  //增加
                //string sql = "delete from Book where BookId = 4"; //删除
                string sql = "update Book set BookName = '郭德纲相声选' where BookId = 2";  //修改

                SqlCommand cmd = new SqlCommand(sql, con);
                //执行sql 返回受影响的行数
                int rows = cmd.ExecuteNonQuery();
                //关闭数据库
                con.Close();
            }

ExecuteScalar ()从数据库检索单个值。这个方法主要用于统计操作。ExecuteScalar ()这个方法是针对SQL语句执行的结果是一行一列的结果集,这个方法只返回查询结果集的第一行第一列

executeScalar主要用于查询单行单列的值,如聚合函数(count,max,min,agv,sum),返回object对象,如查询不到返回null

            using (SqlConnection con = new SqlConnection(str)) {
                //打开数据库
                con.Open();

                string sql = "select BookName from Book where BookId = 2";
                //string sql = "select count(*) as total from Book";

                SqlCommand cmd = new SqlCommand(sql, con);
                object res = cmd.ExecuteScalar();
                Console.WriteLine(res.ToString());

                //关闭数据库
                con.Close();
                Console.Read();
            }

 

ExecuteReader() 

ExecuteReader:返回一个SqlDataReader对象,可以通过这个对象来检查查询结果,它提供了只进只读的执行方式,即从结果中读取一行之后,移动到另一行,则前一行就无法再用。有一点要注意的是执行之后,要等到手动去调用Read()方法之后,DataReader对象才会移动到结果集的第一行,同时此方法也返回一个Bool值,表明下一行是否可用,返回True则可用,返回False则到达结果集末尾

    class Program
    {
        static void Main(string[] args)
        {
            List<Book> Books = new List<Book>();
            string str = "Data Source=DESKTOP-3HH8GF6;Initial Catalog=TestDB;Persist Security Info=True;User ID=sa;Password=123";
            //连接数据库,使用using可自动释放资源
            using (SqlConnection con = new SqlConnection(str)) {
                //打开数据库
                con.Open();

                string sql = "select BookName,BookContent from Book";
                using (SqlCommand cmd = new SqlCommand(sql, con)) {
                    SqlDataReader rows = cmd.ExecuteReader();
                    if (rows.HasRows) {
                        //读取一行,同时指针向前移动
                        while (rows.Read())
                        {
                            //rows中返回的是object类型,需要手动转换成需要的类型
                            Book book = new Book(rows["BookName"].ToString(), rows["BookContent"].ToString());
                            Books.Add(book);
                        }
                    }
                }

                //关闭数据库
                con.Close();
                Console.Read();
            }
        }
    }

    class Book {
        private string _bookName;
        private string _bookContent;

        public string BookName
        {
            get
            {
                return _bookName;
            }

            set
            {
                _bookName = value;
            }
        }

        public string BookContent
        {
            get
            {
                return _bookContent;
            }

            set
            {
                _bookContent = value;
            }
        }

        public Book(string name,string content) {
            this._bookName = name;
            this._bookContent = content;
        }
    }

 SqlDataAdapter 使用 SqlDataAdapter 可以快速的查询数据库并返回表格,无需new sqlCommend ,然后通过遍历表格拿到数据,SqlDataAdapter 内部也是通过SqlCommend实现的

            string str = "Data Source=DESKTOP-3HH8GF6;Initial Catalog=TestDB;Persist Security Info=True;User ID=sa;Password=123";

            DataTable dt = new DataTable();

            //连接数据库,使用using可自动释放资源
            using (SqlConnection con = new SqlConnection(str)) {
                con.Open();
                string sql = "select * from Book";
                using (SqlDataAdapter sda = new SqlDataAdapter(sql, str)) {
                    //将数据填充到dt中
                    sda.Fill(dt);
                }
                //关闭数据库
                con.Close();
            }
            //遍历dt 获取数据
            for (int i = 0; i < dt.Rows.Count; i++)
            {
                Console.WriteLine(dt.Rows[i]["BookName"]);
            }

            Console.Read();
        }

防SQL注入

与PDO一样,ADO提供sql预处理功能

PDO中使用占位符的方式,ADO也一样

PDO

$sql = "DELETE FROM `books` WHERE id = :id";    //使用占位符代替用户输入的id    
$sth = $mysql->prepare($sql);        //绑定参数
$sth->execute(array('id'=>$id));

ADO

            string str = "Data Source=DESKTOP-3HH8GF6;Initial Catalog=TestDB;Persist Security Info=True;User ID=sa;Password=123";
            //连接数据库,使用using可自动释放资源
            using (SqlConnection con = new SqlConnection(str)) {
                //使用占位符
                string sql = "insert into Book values(@name,@content,@type)";
                using (SqlCommand cmd = new SqlCommand(sql, con)) {
                    //绑定参数
                    cmd.Parameters.Add(new SqlParameter("@name", "西厢记"));
                    cmd.Parameters.Add(new SqlParameter("@content", "经典名著"));
                    cmd.Parameters.Add(new SqlParameter("@type", 3));

                    con.Open();
                    cmd.ExecuteNonQuery();
                }
                //关闭数据库
                con.Close();
            }

 

原文地址:https://www.cnblogs.com/xiaoliwang/p/9521487.html