数据访问-----ADO.NET 小结和练习

ADO.NET
两个命名空间,三个类。
一、两个命名空间:
using System.Data;
using System.Data.SqlClient;

二、三个类:
SqlConnection    SqlCommand    SqlDataReader

(一)SqlConnection链接类
1.构造
链接字符串的写法:server=服务器IP或服务器名;database=数据库名;uid=用户名;pwd=密码
server=.;database=mydb;uid=sa;pwd=123
Data Source=.;Initial Catalog=mydb;Persist Security Info=True;User ID=sa;Password=***********

SqlConnection conn = new SqlConnection();
SqlConnection conn = new SqlConnection("链接字符串");

2.属性
ConnectionString:string,链接字符串

3.方法
Open()
Close()
CreateCommand()

(二)SqlCommand命令类
1.构造
SqlCommand cmd = new SqlCommand(["Sql语句",链接对象,事务对象]);
SqlCommand cmd = conn.CreateCommand();
2.属性
CommandText:string 要执行的SQL语句或存储过程的名子
Connection:SqlConnection 指定通过哪个链接访问数据库
Parameters:SqlParameterCollection类型 ,指定Sql文本中的变量的值。 AddWithValue("名","值")
CommandType:CommandType枚举类型,指定CommandText中是SQL语句(Text),还是存储过程(StoredProcedure)。例:SQL存储过程语句:
CREATE PROCEDURE UP_INFO_DELETE
    @code varchar(50)
AS
BEGIN
    delete from Work where InfoCode=@code
    delete from Family where InfoCode=@code
    delete from Info where Code=@code
END
GO

Transaction:SqlTransaction类型,执行命令时需要的事务对象
3.方法
ExecuteNonQuery()
ExecuteReader()
ExecuteScalar()

(三)SqlDataReader读取器类
1.构造
注意:不能直接new出来。只有唯一的一种生成方式
SqlDataReader dr = cmd.ExecuteReader();
2.属性
HasRows:bool,检查是否查出数据来了。
3.方法
Read():bool,读取数据,读取成功为true,否则为false
4.语法
while(dr.Read())
{
    dr[索引号]
    dr["列名"]
}


三、事务
ACID 原子性,一致性,隔离性,持久性
(一)链接内的事务
1.创建事务对象。使用链接对象的BeginTransaction()
SqlTransaction trans = conn.BeginTransaction();
注意:必须在链接打开的时候创建事务。
2.把事务对象挂到命令对象上
cmd.Transaction = trans;
3.执行命令,提交与回滚事务
trans.Commit()    //一般放在try块中
trans.Rollback()    //一般放在catch块中

(二)跨链接的事务 TransactionScope对象。
1.启动服务:DTC 分布式事务协调器。
2.引用事务程序集。在解决方案管理器中,右键添加引用。System.Transactions
3.使用using System.Transactions 把命名空间导进来。
4.使用TransactionScope类来控制事务。
        using (TransactionScope ts = new TransactionScope())
            {
                DeleteWork("p001");
                DeleteFamily("p001");
                DeleteInfo("p001");
                ts.Complete();    //必须。它是用来提交事务的。
            }//都执行或正确,事务提交,成功运行,否则事务回滚,恢复到修改前的状态。

简单举例:
class Program
    {
        public const string CONNECTIONSTRING = "server=.;database=mydb;uid=sa;pwd=5587725";
        static void Deleteinfo(string code)
        {
            SqlConnection conn = new SqlConnection(CONNECTIONSTRING);
            try
            {
                conn.Open();
                SqlCommand cmd = conn.CreateCommand();
                cmd.CommandText = "UP_INFO_DELETE";
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Parameters.Clear();
                cmd.Parameters.AddWithValue("@code",code);
                cmd.ExecuteNonQuery();
            }
            finally
            {
                conn.Close();
            }
           
            
        }
        static void Main(string[] args)
        {
            using (TransactionScope ts = new TransactionScope())
            {
                Deleteinfo("p003");
                ts.Complete();

            }
        }
    }


1.造DBConnection
    做一个链接字符串的常量
2.造实体类
    把数据库的表封装类,把表的字段都封状成成员变量和属性
3.造数据访问类
    a.声明三个成员:SqlConnection,SqlCommand,SqlDataReader
    b.在构造函数中,把SqlConnection和SqlCommand实例化。
    c.做一系列的增、删、改、查的方法。
4.Main函数
    (1)。
    a.调用数据访问类,获得数据。
    b.在界面上使用for显示出来。
    (2)。
    a.从界面上获得输入的数据,存在变量中。
    b.调用数据访问类,把变量传进相应的增删改的方法中去,实现数据库相应操作。

练习1:mydb数据库中Nation(民族)表的增删改查
class DBconnection
    {
        public const string CONNECTIONSTRING = "server=.;database=mydb;uid=sa;pwd=5587725";
    }

 //实体类
    class Nation
    {
        private string _Code;  // 类的字段
      
        public string Code  //类的属性
        {
            get { return _Code; }
            set { _Code = value; }
        }
        private string _Name;

        public string Name
        {
            get { return _Name; }
            set { _Name = value; }
        }
    }

 //数据访问类---增删改查
    class NationDA
    {
        //定义类里面的三个字段
        private SqlConnection _Conn;
        private SqlCommand _Cmd;
        private SqlDataReader _DR;
        //构造函数
        public NationDA()
        {
            _Conn = new SqlConnection(DBconnection.CONNECTIONSTRING);
            _Cmd = _Conn.CreateCommand();
        }
        //查询
        public Nation Select(string code)
        {
            _Cmd.CommandText = "select * from Nation where code=@code";
            _Cmd.Parameters.Clear();
            _Cmd.Parameters.AddWithValue("@code",code);
            try
            {
                _Conn.Open();
                _DR = _Cmd.ExecuteReader();
                if (_DR.Read())
                {
                    Nation data = new Nation();
                    data.Code = _DR["Code"].ToString();
                    data.Name = _DR["Name"].ToString();
                    return data;
                }
                else
                {
                    return null;
                }
            }
            finally
            {
                _Conn.Close();
            }
        }
        public List<Nation> Select()
        {
            List<Nation> list = new List<Nation>();
            _Cmd.CommandText = "select * from Nation";
            try
            {
                _Conn.Open();
                _DR = _Cmd.ExecuteReader();
                while (_DR.Read())
                {
                    Nation data = new Nation();
                    data.Code = _DR["Code"].ToString();
                    data.Name = _DR["Name"].ToString();
                    list.Add(data);
                }
            }
            finally
            {
                _Conn.Close();
            }

            return list;
        }
        //插入(增加)
        public void Insert(string code,string name)
        {
            _Cmd.CommandText = "insert into Nation values(@code,@name)";
            _Cmd.Parameters.Clear();
            _Cmd.Parameters.AddWithValue("@name", name);
            _Cmd.Parameters.AddWithValue("@code", code);
            try
            {
                _Conn.Open();
                _Cmd.ExecuteNonQuery();
            }
            finally
            {
                _Conn.Close();
            }

        }
        //更改
        public void Update(string code,string name)
        {
            _Cmd.CommandText = "update Nation set name=@name where code=@code;";
            _Cmd.Parameters.Clear();
            _Cmd.Parameters.AddWithValue("@name",name);
            _Cmd.Parameters.AddWithValue("@code",code);
            try
            {
                _Conn.Open();
                _Cmd.ExecuteNonQuery();
            }
            finally
            {
                _Conn.Close();
            }
        }
        //删除
        public void Delete(string code)
        {
            _Cmd.CommandText = "delete from Nation where code=@code";
            _Cmd.Parameters.Clear();
            _Cmd.Parameters.AddWithValue("@code",code);
            try
            {
                _Conn.Open();
                _Cmd.ExecuteNonQuery();
            }
            finally
            {
                _Conn.Close();
            }
        }
    }

class Program
    {
        //界面
        static void Main(string[] args)
        {
            List<Nation> list = new NationDA().Select();
            for (int i = 0; i < list.Count; i++)//数组中长度用.length,集合中长度用.count
            {
                Console.WriteLine(list[i].Code+" "+list[i].Name);
            }
            Console.ReadKey();
        }
    }

练习2:mydb数据库中Info表的增删改查()
注意:要调用NationDA中的select ,需要放在同一个项目下。
 class DBconnection
    {
        public const string CONNECTIONSTRING = "server=.;database=mydb;uid=sa;pwd=5587725";
    }

 //实体类
    class info
    {
        private string _Code;

        public string Code
        {
            get { return _Code; }
            set { _Code = value; }
        }
        private string _Name;

        public string Name
        {
            get { return _Name; }
            set { _Name = value; }
        }
        private bool _Sex;

        public bool Sex
        {
            get { return _Sex; }
            set { _Sex = value; }
        }
        private string _Nation;

        public string Nation
        {
            get { return _Nation; }
            set { _Nation = value; }
        }
        private DateTime _Birthday;

        public DateTime Birthday
        {
            get { return _Birthday; }
            set { _Birthday = value; }
        }
    }

 //数据访问类
    class infoDA
    {
        private SqlConnection _Conn;
        private SqlCommand _Cmd;
        private SqlDataReader _DR;
        //构造函数
        public infoDA()
        {
            _Conn = new SqlConnection(DBconnection.CONNECTIONSTRING);
            _Cmd = _Conn.CreateCommand();
        }
        //增
        public void Insert(string code,string name,bool sex,string nation, DateTime birthday )
        {
            _Cmd.CommandText = "insert into info values(@code,@name,@sex,@natiao,@birthday)";
            _Cmd.Parameters.Clear();
            _Cmd.Parameters.AddWithValue("@code",code);
            _Cmd.Parameters.AddWithValue("@name",name);
            _Cmd.Parameters.AddWithValue("@sex", sex);
            _Cmd.Parameters.AddWithValue("@nation", nation);
            _Cmd.Parameters.AddWithValue("@birthday", birthday);
            try
            {
                _Conn.Open();
                _Cmd.ExecuteNonQuery();
            }
            finally
            {
                _Conn.Close();
            }
           
        }
        //删
        public void Delete(string code)
        {
            _Cmd.CommandText = "delete from info where code=@code";
            _Cmd.Parameters.Clear();
            _Cmd.Parameters.AddWithValue("@code",code);
            try
            {
                _Conn.Open();
                _Cmd.ExecuteNonQuery();
            }
            finally
            {
                _Conn.Close();
            }
        }
        //改
        public void Update(string code, string name, bool sex, string nation, DateTime birthday)
        {
            _Cmd.CommandText = "update info set code=@code,name=@name,sex=@sex,nation=@nation,birthday=@birthday where code=@code";
            _Cmd.Parameters.Clear();
            _Cmd.Parameters.AddWithValue("@code", code);
            _Cmd.Parameters.AddWithValue("@name", name);
            _Cmd.Parameters.AddWithValue("@sex", sex);
            _Cmd.Parameters.AddWithValue("@nation", nation);
            _Cmd.Parameters.AddWithValue("@birthday", birthday);
            try
            {
                _Conn.Open();
                _Cmd.ExecuteNonQuery();
            }
            finally
            {
                _Conn.Close();
            }

        }
        //查
        public info Select(string code)
        {
            _Cmd.CommandText = "select * from info where code=@code";
            _Cmd.Parameters.Clear();
            _Cmd.Parameters.AddWithValue("@code",code);
            try
            {
                _Conn.Open();
                _DR = _Cmd.ExecuteReader();
                if (_DR.Read())
                {
                    info data = new info();
                   data.Code = _DR["Code"].ToString();
                    data.Name = _DR["Name"].ToString();
                    data.Sex = Convert.ToBoolean(_DR["Sex"]);
                    data.Nation = _DR["Nation"].ToString();
                    data.Birthday = Convert.ToDateTime(_DR["Birthday"]);
                    return data;
                }
                else
                {
                    return null;
                }
            }
            finally
            {
                _Conn.Close();
            }
        }
        public List<info> Select()
        {
            List<info> list =new List<info>();
            _Cmd.CommandText = "select * from info";
            try
            {
                _Conn.Open();
                _DR = _Cmd.ExecuteReader();
                while (_DR.Read())
                {
                    info data = new info();
                    data.Code = _DR["Code"].ToString();
                    data.Name = _DR["Name"].ToString();
                    data.Sex = Convert.ToBoolean(_DR["Sex"]);
                    data.Nation = _DR["Nation"].ToString();
                    data.Birthday = Convert.ToDateTime(_DR["Birthday"]);
                    list.Add(data);
                }
            }
            finally
            {
                _Conn.Close();
            }
            return list;
        }

    }

 class Program
    {
       
        static void Main(string[] args)
        {
            List<info> list = new infoDA().Select();
            for (int i = 0; i < list.Count; i++)
            {
                info data = list[i];
                Console.Write(data.Code+" ");
                Console.Write(data.Name + " ");
                Console.Write(data.Sex?"男":"女" +" ");
                Console.Write(new NationDA().Select(data.Nation).Name + " ");
                Console.Write(data.Birthday.ToString("yyy年MM月dd日") + " ");

            }
            Console.ReadKey();

        }
    }


原文地址:https://www.cnblogs.com/likaixuan/p/4495451.html