屌丝学编程,winform视频学习笔记

ADO.NET是微软提供的一种数据库访问技术。

ADO.NET为不同类型的数据源提供了不同的数据提供程序对象: image.png 数据提供程序中包含了ADO.NET的四个核心对象: image.png ADO.NET提供两种方式访问数据库:

连接式访问:整个操作过程中需要保持数据库连接。

断开式访问:只需要在执行数据库命令时保持数据库连接。

一、使用DataReader读取数据

使用DataReader读取数据属于连接式读取,只能只进的一行一行读取数据,并且不能改变数据,如需要改变数据,必须重新执行insert,update,delete等sql语句来改变数据。

示例:使用DataReader读取数据在ListView控件显示: image.png

此示例的测试数据如下:

create table Member
(
    MemberId int primary key identity(1,1),
    MemberAccount nvarchar(20) unique check(len(MemberAccount) between 6 and 12),
    MemberPwd nvarchar(20),
    MemberName nvarchar(20),
    MemberPhone nvarchar(20)
)
insert into Member(MemberAccount,MemberPwd,MemberName,MemberPhone)
values('liubei','123456','刘备','4659874564')
insert into Member(MemberAccount,MemberPwd,MemberName,MemberPhone)
values('guanyu','123456','关羽','42354234124')
insert into Member(MemberAccount,MemberPwd,MemberName,MemberPhone)
values('zhangfei','123456','张飞','41253445')
insert into Member(MemberAccount,MemberPwd,MemberName,MemberPhone)
values('zhangyun','123456','赵云','75675676547')
insert into Member(MemberAccount,MemberPwd,MemberName,MemberPhone)
values('machao','123456','马超','532523523')

此示例代码如下:

在编写代码之前需要进行ListView控件的编辑列操作,并且将视图模式切换成Details模式。

 private void Form1_Load(object sender, EventArgs e)
        {
            //1-编写连接字符串(SQl用户名密码方式)
            string connStr = "server=.;database=DBTEST;uid=sa;pwd=*********";
            //2-创建连接对象,打开连接
            SqlConnection conn = new SqlConnection(connStr);
            conn.Open();
            //3-编写sql查询语句
            string sql = "select*from Member";
            //4-执行sql命令
            SqlCommand cmd = new SqlCommand(sql, conn);
            SqlDataReader rd = cmd.ExecuteReader();
            //5-利用DataReader读取数据到控件
            while (rd.Read())
            {
                ListViewItem item = new ListViewItem(rd["MemberId"].ToString());
                item.SubItems.Add(rd["MemberAccount"].ToString());
                item.SubItems.Add(rd["MemberPwd"].ToString());
                item.SubItems.Add(rd["MemberName"].ToString());
                item.SubItems.Add(rd["MemberPhone"].ToString());
                this.lvMem.Items.Add(item);
            }
            rd.Close();
            //显示人数
            cmd.CommandText = "select count(*)from Member";
            int count = (int)cmd.ExecuteScalar();
            this.lblCount.Text = "会员人数:" + count;
            conn.Close();
        }

二、使用DataAdapter的方式抽取数据

DataSet是特意为独立于所有数据源的数据访问而设计的,可以理解成内存中的数据库。

在支持ADO.NET的断开式、分布式数据方案中起着重要的作用。

DataSet是数据驻留在内存中的表现形式,无论是什么数据源,它都可以提供一致的编程模型。

DataSet支持改变数据然后回传给数据库。

image.png 示例:使用DataAdapter抽取数据到DataTable中,在DataGridView中进行显示 image.png 此示例的测试数据与文档第一部分测试数据相同。 此示例代码如下:

在编写代码之前需要对DataGridView控件进行编辑列操作。 image.png

设置DataGridView控件的AllowUserToAddRows=False实现清除最后一个空行,SelectionMode=FullRowSelect实现整行选中模式,用户体验更好。

 private void BindData()
        {
            //1-编写连接字符串(SQl用户名密码方式)
            string connStr = "server=.\\MSSQLSERVER1;database=DBTEST;uid=sa;pwd=*********";
            //2-创建连接对象,打开连接
            SqlConnection conn = new SqlConnection(connStr);
            conn.Open();
            //3-编写sql查询语句
            string sql = "select*from Member";
            //4-执行sql命令
            SqlDataAdapter adp = new SqlDataAdapter(sql, conn);
            DataTable dt = new DataTable();
            adp.Fill(dt);
            this.dataGridView1.DataSource = dt;
            //显示会员人数
            adp.SelectCommand.CommandText = "select count(*)from Member";
            int count = (int)adp.SelectCommand.ExecuteScalar();
            this.lblCount.Text = "会员人数:" + count;
            conn.Close();
        }
        private void Form2_Load(object sender, EventArgs e)
        {
            BindData();
        }

        private void btUpdate_Click(object sender, EventArgs e)
        {
            //1-编写连接字符串(SQl用户名密码方式)
            string connStr = "server=.\\MSSQLSERVER1;database=DBTEST;uid=sa;pwd=*********";
            //2-创建连接对象,打开连接
            SqlConnection conn = new SqlConnection(connStr);
            conn.Open();
            //3-编写sql查询语句
            string sql = "select*from Member";
            //4-执行sql命令
            SqlDataAdapter adp = new SqlDataAdapter(sql, conn);
            DataTable dt = new DataTable();
            adp.Fill(dt);
            //添加
            DataRow dr = dt.NewRow();
            dr["MemberAccount"] = "liudehua";
            dr["MemberPwd"] = "123456";
            dr["MemberName"] = "刘德华";
            dr["MemberPhone"] = "13554165423";
            dt.Rows.Add(dr);
            //修改密码
            dt.Rows[1]["MemberPwd"] = "654321";//0代表第一行
            //删除
            dt.Rows[3].Delete();
            //回写
            SqlCommandBuilder sqlBuilder = new SqlCommandBuilder(adp);
            adp.Update(dt);
            conn.Close();
            //重新刷新界面数据
            BindData();
            MessageBox.Show("数据更新成功!");
        }

三、非查询操作

非查询操作分为"添加","删除","修改"操作,这些操作处理sql语句不同,其他编码是一样的,所以在此文档中以添加操作为例介绍非查询操作。

示例:添加会员信息 image.png 此示例的测试数据与文档第一部分测试数据相同。 此示例中通过两种方式添加数据:

(1)使用DataAdapter的command更新数据

(2)直接使用SqlCommand对象更新数据

此示例代码如下:

  //方案一:使用DataAdapter的command更新数据
        private void bt1_Click(object sender, EventArgs e)
        {
            //数据库连接
            string connStr = "server=.\\MSSQLSERVER1;database=DBTEST;uid=sa;pwd=*********";
            SqlConnection conn = new SqlConnection(connStr);
            conn.Open();
            //sql语句
            string sql = string.Format("insert into Member(MemberAccount,MemberPwd,MemberName,MemberPhone)values('{0}', '{1} ', '{2}', '{3}')"
              , this.txtAcount.Text, this.txtPwd.Text, this.txtName.Text, this.txtPhone.Text);
            SqlDataAdapter adp = new SqlDataAdapter(sql, conn);
            int rowCount = adp.SelectCommand.ExecuteNonQuery();
            conn.Close();
            if (rowCount==1)
            {
                MessageBox.Show("添加数据成功!");
            }
            else
            {
                MessageBox.Show("添加数据失败!");
            }
        }
        //使用SqlCommand对象添加数据
        private void bt2_Click(object sender, EventArgs e)
        {
            //数据库连接
            string connStr = "server=.\\MSSQLSERVER1;database=DBTEST;uid=sa;pwd=*********";
            SqlConnection conn = new SqlConnection(connStr);
            conn.Open();
            //sql语句
            string sql = string.Format("insert into Member(MemberAccount,MemberPwd,MemberName,MemberPhone)values('{0}', '{1} ', '{2}', '{3}')"
              , this.txtAcount.Text, this.txtPwd.Text, this.txtName.Text, this.txtPhone.Text);
            SqlCommand cmd = new SqlCommand(sql,conn);
            int rowCount = cmd.ExecuteNonQuery();
            conn.Close();
            if (rowCount == 1)
            {
                MessageBox.Show("添加数据成功!");
            }
            else
            {
                MessageBox.Show("添加数据失败!");
            }
        }

四、一个窗体中实现会员信息的增加,删除,修改,查询操作

image.png 此示例的测试数据与文档第一部分测试数据相同。

业务需求:

(1)窗体加载的时候显示数据。

(2)输入字段内容,点击新增按钮,可以添加数据

(3)鼠标选中一行,右键弹出删除菜单,可以删除数据

(4)鼠标选中一行,将会员信息在右侧文本框中显示,重新编辑后可以点击修改按钮实现数据的修改

代码如下:

绑定数据的通用方法:

  private void BindData()
        {
            //1-编写连接字符串(SQl用户名密码方式)
            string connStr = "server=.\\MSSQLSERVER1;database=DBTEST;uid=sa;pwd=*********";
            //2-创建连接对象,打开连接
            SqlConnection conn = new SqlConnection(connStr);
            conn.Open();
            //3-编写sql查询语句
            string sql = "select*from Member";
            //4-执行sql命令
            SqlDataAdapter adp = new SqlDataAdapter(sql, conn);
            DataTable dt = new DataTable();
            adp.Fill(dt);
            this.dataGridView1.DataSource = dt;
            conn.Close();
        }

窗体加载事件代码:

 private void Form4_Load(object sender, EventArgs e)
        {
            BindData();
        }

新增按钮的点击事件代码:

  private void bt1_Click(object sender, EventArgs e)
        {
            //数据库连接
            string connStr = "server=.\\MSSQLSERVER1;database=DBTEST;uid=sa;pwd=*********";
            SqlConnection conn = new SqlConnection(connStr);
            conn.Open();
            //sql语句
            string sql = string.Format("insert into Member(MemberAccount,MemberPwd,MemberName,MemberPhone)values('{0}', '{1} ', '{2}', '{3}')"
              , this.txtAcount.Text, this.txtPwd.Text, this.txtName.Text, this.txtPhone.Text);
            SqlCommand cmd = new SqlCommand(sql, conn);
            int rowCount = cmd.ExecuteNonQuery();
            conn.Close();
            if (rowCount == 1)
            {
                MessageBox.Show("添加数据成功!");
            }
            else
            {
                MessageBox.Show("添加数据失败!");
            }
            BindData();
        }

DataGridView控件的点击事件代码:

 private void dataGridView1_Click(object sender, EventArgs e)
        {
            int memid = int.Parse(this.dataGridView1.SelectedRows[0].Cells[0].Value.ToString());//选中的一行的第一单元格
            //数据库连接
            string connStr = "server=.\\MSSQLSERVER1;database=DBTEST;uid=sa;pwd=*********";
            SqlConnection conn = new SqlConnection(connStr);
            conn.Open();
            string sql = "select*from Member where MemberId = " + memid;
            SqlDataAdapter adp = new SqlDataAdapter(sql,conn);
            DataTable dt = new DataTable();
            adp.Fill(dt);
            if (dt.Rows.Count==0)
            {
                MessageBox.Show("找不到这个会员");
                return;
            }
            this.txtAcount.Text = dt.Rows[0]["MemberAccount"].ToString();
            this.txtPwd.Text = dt.Rows[0]["MemberPwd"].ToString();
            this.txtName.Text = dt.Rows[0]["MemberName"].ToString();
            this.txtPhone.Text = dt.Rows[0]["MemberPhone"].ToString();
            conn.Close();
        }

修改按钮的点击事件代码:

 private void button1_Click(object sender, EventArgs e)
        {
            int memid = int.Parse(this.dataGridView1.SelectedRows[0].Cells[0].Value.ToString());//选中的一行的第一单元格
            //数据库连接
            string connStr = "server=.\\MSSQLSERVER1;database=DBTEST;uid=sa;pwd=*********";
            SqlConnection conn = new SqlConnection(connStr);
            conn.Open();
            //sql语句
            string sql = string.Format("update  Member set MemberAccount='{0}',MemberPwd= '{1} ',MemberName= '{2}',MemberPhone='{3}' where MemberId={4}"
              , this.txtAcount.Text, this.txtPwd.Text, this.txtName.Text, this.txtPhone.Text,memid);
            SqlCommand cmd = new SqlCommand(sql, conn);
            int rowCount = cmd.ExecuteNonQuery();
            conn.Close();
            if (rowCount == 1)
            {
                MessageBox.Show("修改数据成功!");
            }
            else
            {
                MessageBox.Show("修改数据失败!");
            }
            BindData();
        }

删除菜单的点击事件代码:

 private void 删除ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            int memid = int.Parse(this.dataGridView1.SelectedRows[0].Cells[0].Value.ToString());//选中的一行的第一单元格
            //数据库连接
            string connStr = "server=.\\MSSQLSERVER1;database=DBTEST;uid=sa;pwd=*********";
            SqlConnection conn = new SqlConnection(connStr);
            conn.Open();
            string sql = "delete from Member where MemberId = " + memid;
            SqlCommand cmd = new SqlCommand(sql,conn);
            int rowCount = cmd.ExecuteNonQuery();
            conn.Close();
            if (rowCount == 1)
            {
                MessageBox.Show("删除数据成功!");
            }
            else
            {
                MessageBox.Show("删除数据失败!");
            }
            BindData();
        }

五、多个窗体中实现会员信息的增加,删除,修改,查询操作

image.png 此示例的测试数据与文档第一部分测试数据相同。

业务需求:

(1)窗体加载的时候显示数据。

(2)点击"添加数据"按钮,弹出新窗体,在新窗体中进行数据的添加,添加完成后自动刷新表格数据。

image.png (3)鼠标选中一行,右键弹出删除菜单,可以删除数据

(4)鼠标选中一行,点击"编辑数据"按钮,弹出新窗体,在新窗体中进行数据修改,修改后自动刷新表格数据。 image.png 实现步骤如下:

(1)查询窗体显示数据代码:

 public void BindData()
        {
            //1-编写连接字符串(SQl用户名密码方式)
            string connStr = "server=.\\MSSQLSERVER1;database=DBTEST;uid=sa;pwd=*********";
            //2-创建连接对象,打开连接
            SqlConnection conn = new SqlConnection(connStr);
            conn.Open();
            //3-编写sql查询语句
            string sql = "select*from Member";
            //4-执行sql命令
            SqlDataAdapter adp = new SqlDataAdapter(sql, conn);
            DataTable dt = new DataTable();
            adp.Fill(dt);
            this.dataGridView1.DataSource = dt;
            conn.Close();
        }
        private void Form5_Load(object sender, EventArgs e)
        {
            BindData();
        }

(2)"删除"菜单代码:

private void 删除ToolStripMenuItem_Click(object sender, EventArgs e)
        {
           
                int memid = int.Parse(this.dataGridView1.SelectedRows[0].Cells[0].Value.ToString());//选中的一行的第一单元格
                                                                                                    //数据库连接
                string connStr = "server=.\\MSSQLSERVER1;database=DBTEST;uid=sa;pwd=*********";
                SqlConnection conn = new SqlConnection(connStr);
                conn.Open();
                string sql = "delete from Member where MemberId = " + memid;
                SqlCommand cmd = new SqlCommand(sql, conn);
                int rowCount = cmd.ExecuteNonQuery();
                conn.Close();
                if (rowCount == 1)
                {
                    MessageBox.Show("删除数据成功!");
                }
                else
                {
                    MessageBox.Show("删除数据失败!");
                }
                BindData();
            
        }

(3)会员添加窗体代码:

 private void bt1_Click(object sender, EventArgs e)
        {
            //数据库连接
            string connStr = "server=.\\MSSQLSERVER1;database=DBTEST;uid=sa;pwd=*********";
            SqlConnection conn = new SqlConnection(connStr);
            conn.Open();
            //sql语句
            string sql = string.Format("insert into Member(MemberAccount,MemberPwd,MemberName,MemberPhone)values('{0}', '{1} ', '{2}', '{3}')"
              , this.txtAcount.Text, this.txtPwd.Text, this.txtName.Text, this.txtPhone.Text);
            SqlDataAdapter adp = new SqlDataAdapter(sql, conn);
            int rowCount = adp.SelectCommand.ExecuteNonQuery();
            conn.Close();
            if (rowCount == 1)
            {
                MessageBox.Show("添加数据成功!");
            }
            else
            {
                MessageBox.Show("添加数据失败!");
            }
            ((Form5)(this.Owner)).BindData();
            this.Close();
        }

(4)会员编辑窗体代码:

 public int MemId { get; set; }//会员编号
      
        private void FrmEdit_Load(object sender, EventArgs e)
        {
            //数据库连接
            string connStr = "server=.\\MSSQLSERVER1;database=DBTEST;uid=sa;pwd=*********";
            SqlConnection conn = new SqlConnection(connStr);
            conn.Open();
            string sql = "select*from Member where MemberId = " + this.MemId;
            SqlDataAdapter adp = new SqlDataAdapter(sql, conn);
            DataTable dt = new DataTable();
            adp.Fill(dt);
            if (dt.Rows.Count == 0)
            {
                MessageBox.Show("找不到这个会员");
                return;
            }
            this.txtAcount.Text = dt.Rows[0]["MemberAccount"].ToString();
            this.txtPwd.Text = dt.Rows[0]["MemberPwd"].ToString();
            this.txtName.Text = dt.Rows[0]["MemberName"].ToString();
            this.txtPhone.Text = dt.Rows[0]["MemberPhone"].ToString();
            conn.Close();
        }

        private void bt1_Click(object sender, EventArgs e)
        {
            //数据库连接
            string connStr = "server=.\\MSSQLSERVER1;database=DBTEST;uid=sa;pwd=*********";
            SqlConnection conn = new SqlConnection(connStr);
            conn.Open();
            //sql语句
            string sql = string.Format("update  Member set MemberAccount='{0}',MemberPwd= '{1} ',MemberName= '{2}',MemberPhone='{3}' where MemberId={4}"
              , this.txtAcount.Text, this.txtPwd.Text, this.txtName.Text, this.txtPhone.Text,this.MemId);
            SqlCommand cmd = new SqlCommand(sql, conn);
            int rowCount = cmd.ExecuteNonQuery();
            conn.Close();
            if (rowCount == 1)
            {
                MessageBox.Show("修改数据成功!");
            }
            else
            {
                MessageBox.Show("修改数据失败!");
            }
             ((Form5)(this.Owner)).BindData();
            this.Close();
        }

(5)查询窗体"添加数据"和"编辑数据"按钮的代码:

 private void btAdd_Click(object sender, EventArgs e)
        {
            FrmAdd frm = new FrmAdd();
            frm.Owner = this;
            frm.Show();
        }

        private void btEdit_Click(object sender, EventArgs e)
        {
            int memid = int.Parse(this.dataGridView1.SelectedRows[0].Cells[0].Value.ToString());
            FrmEdit frm = new FrmEdit();
            frm.Owner = this;
            frm.MemId = memid;
            frm.Show();
        }