C#学习笔记之连线及离线数据库操作

C#学习笔记之数据库连接操作,小编在学习做一个图书馆管理C#窗体程序时,涉及到了数据库连线操作。其中就有一个问题就是使用哪一种方式去连接,其中有连线数据库操作和离线数据库操作,主要都是运用ADO.NET去连接,至于ADO.NET就不在这里详解了,可以点击百度百科ADO.NET了解或者再CSDN搜索ADO.NET即可找到详解。小编在下就放入一个表格简单说明

C#学习笔记之连线及离线数据库操作_第1张图片

                                  数据提供程序是应用程序与数据库交互的基础,实现离线操作的技术基础是XML 。

ADO.NET概述具体步骤如下:

第1步:首先要建立数据库连接,此时要用到Connection对象。

第2步:应用程序通过Command对象向数据库发送指令,为了方便对增删查改命令进行集中管理,可以把对某一个表的增删查改四个Command对象组合成一DataAdapter对象。

第3步:如果是读取数据,返回的数据存放在DataReader对象中,此时,仍然需要保持数据库连接,而且DataReader对象中的数据只能从前到后检索一次。

第4步:为了多次检索数据,可以采用离线访问模型。即把取得的数据存放到DataTable对象中,如果DataTable比较多,而且彼此之间存在关系,可以把多个DataTable对象组合在一个DataSet对象中。

连接数据库的方法也不在此详说了,今天重点讲离线和连线数据操作

连线数据操作以我做的图书管理系统的添加用户功能为例

C#学习笔记之连线及离线数据库操作_第2张图片

private void skinButton2_Click(object sender, EventArgs e)
        {
            DAC dac = new DAC();//DAC是一个封装好的连接数据库类
            string cmdTextInsert = "INSERT INTO TUser(UserID,Pwd,UserName)";
            cmdTextInsert += "VALUES(@userid,@pwd,@username)";//封装数据库插入语句
            try
            {
                dac.Connection.Open();//打开数据库连接,OPEN方法
                SqlCommand cmdInsert = new SqlCommand(cmdTextInsert, dac.Connection);//把封装好的数据库插入语句发给sql执行
                cmdInsert.Parameters.AddWithValue("@userid", txtID.Text);
                cmdInsert.Parameters.AddWithValue("@pwd", txtPaw.Text);
                cmdInsert.Parameters.AddWithValue("@username", txtName.Text);//把值赋给参数
                cmdInsert.ExecuteNonQuery();
                MessageBox.Show("添加成功");
                dac.Connection.Close();
            }
            catch(SqlException ex){
                MessageBox.Show("添加失败" + ex.Message.ToString());
                
            }
        }

而离线数据库操作以我的借阅功能为例

C#学习笔记之连线及离线数据库操作_第3张图片

        //1定义适配器,数据集
        DataSet ds ;
        SqlDataAdapter daBook, daLend, daReader;
        //2初始化,装载数据
        void init() {
            DAC dac = new DAC();
            ds = new DataSet();
            daBook = new SqlDataAdapter("select * from TBookDetail",dac.Connection);
            daLend = new SqlDataAdapter("select * from TLendInfo", dac.Connection);
            daReader = new SqlDataAdapter("select * from TReader", dac.Connection);
            daBook.Fill(ds,"TBookDetail");
            daLend.Fill(ds,"TLendInfo");
            daReader.Fill(ds, "TReader");
        }
        //3显示在库图书
        void showBookInstore() {
            DataView dvBook = new DataView(ds.Tables["TBookDetail"]);
            dvBook.RowFilter = "Status='在库'";
            dgvBookList.DataSource = dvBook;
        }
        //4绑定读者
        void showReader() {
            DataView dvReader = new DataView(ds.Tables["TReader"]);
            cbbReaderSelect.DataSource = dvReader;
            cbbReaderSelect.DisplayMember = "Name";
            cbbReaderSelect.ValueMember = "ReaderID";
        }
        //显示读者借阅的图书
        void showReaderLendInfo() {
            DataView dvlend = new DataView(ds.Tables["TLendInfo"]);
            dvlend.RowFilter="ReaderID='"+ cbbReaderSelect.SelectedValue.ToString()+"'";
            dgvUserLendList.DataSource = dvlend;
        }
        //借阅图书
        private void BookLend(){
            string readerID = cbbReaderSelect.SelectedValue.ToString();
            List bookIdToLend=new List();
            //获取选中的书籍ID号
            foreach(DataGridViewRow row in dgvBookList.Rows){
                if(row.Cells["ColSelect"].Value!=null){
                    int bookId=(int)row.Cells[1].Value;//将BookIdJ加入泛型列表
                    bookIdToLend.Add(bookId);
                }
            }
            //对每一本书,做两个数据操作:改TBookDetail,加TLendInfo
            foreach(int bookId in bookIdToLend){
                DataRow[]     
                bookRows=ds.Tables["TBookDetail"].Select("bookId='"+bookId+"'");
                bookRows[0]["Status"] = "借出";

                DataRow LendRow = ds.Tables["TLendInfo"].NewRow();
                LendRow["BookID"] = bookId;
                LendRow["ReaderID"] = readerID;
                LendRow["LendDate"] = DateTime.Today;
                ds.Tables["TLendInfo"].Rows.Add(LendRow);
            }
        
        }
        private void Form1_Load(object sender, EventArgs e)
        {
            init();
            showBookInstore();
            showReader();
            showReaderLendInfo();
            setTitle();
        }
        //选择读者时触发的事件
        private void cbbReaderSelect_SelectedIndexChanged(object sender, EventArgs e)
        {
            showReaderLendInfo();
        }
        //点击借阅按钮时触发的事件
        private void btnLend_Click(object sender, EventArgs e)
        {
            BookLend();
            showReaderLendInfo();
        }
        //取消操作,此时数据并未写入到数据库
        private void btnCancle_Click(object sender, EventArgs e)
        {
            ds.RejectChanges();
        }
        //保存借阅信息,此时将DataSet中的数据写入数据库
        private void btnSave_Click(object sender, EventArgs e)
        {
            try
            {
                SqlCommandBuilder dbbook = new SqlCommandBuilder(daBook);
                SqlCommandBuilder dblend = new SqlCommandBuilder(daLend);
                daBook.Update(ds, "TBookDetail");
                daLend.Update(ds, "TLendInfo");
                MessageBox.Show("成功办理借阅");
            }
            catch (SqlException ex) {
                MessageBox.Show(ex.Message.ToString());
            }
        }

略微斗胆做个总结,就是连线数据库操作就是一次从头到尾去查,且每一次操作都要和数据库做连接,而离线数据库操作是连接一次之后就把需要用到的表保存下来,关闭数据库连接后,对保存下来的数据表进行增删改查的操作,然后再保存回数据库,也就是更新数据库表。

其实小编也有个疑惑就是两者都能实现某功能,那该选择哪一种呢???希望有大佬帮我解惑解惑!谢谢

 

你可能感兴趣的:(C#学习笔记)