第三十讲 : 综合应用&存储过程

SqlDataReader sdr=cmd.ExecuteReader(system.Data.CommandBehavior.CloseConnection);
此种写法,在关闭sdr对象时,同时关闭数据库连接

方法中如果使用SqlDataReader对象时,如果有返回值,应先关闭数据流再return

    无返回值的存储过程的使用方法:
        向SQL语句或存储过程中添加参数,使用命令对象的Parameters属性的add方法(旧方法)或AddwithValue方法

        
    有返回值的存储过程的使用方法:
        针对返回值的参数如何操作?输出参数
        这里要使用SqlParameter类,如:
            SqlParameter pi=new SqlParameter("过程中用于返回的output参数变量名",0);//因为是返回,在实例化时是没有确定值的,可根据返回值类型给其一个默认值,整型默认赋值0,字符串默认赋值''空字符串。
            
            //接下来修改参数对象的Direction属性
            pi.Direction=ParameterDirection.output;
            
            //最后把这个新创建的参数加入到存储过程的参数列表中去
            cmd.Parameters.add(pi);
            
        针对存储过程的return返回值操作的处理?
            针对返回值的参数如何操作?输入参数
                这里也要使用SqlParameter类,如:
            SqlParameter pi=new SqlParameter("过程中用于输入的input参数变量名",值);//因为这里处理的是输入参数,所以一般应该是有值的。
            
            //接下来修改参数对象的Direction属性
            pi.Direction=ParameterDirection.input;
            cmd.Parameters.add(pi);
            
            
            那有了输入参数后,如何处理过程中的return回来的值呢?
            这里实例中的操作是创建一个参数出来
            SqlParameter rv=new SqlParameter("@一个新的变量名用于处理过得中的return回来的值",SqlDbTpye.int,4);
            //这后面的两个参数,一个是数据类型,即return回来的是什么类型就定义个什么类型出来,4这个参数是返回来的值的大小长度
            //接下来修改参数对象的Direction属性
            pi.Direction=ParameterDirection.ReturnValue;
            cmd.Parameters.add(pi);
            
            
            如果需要查看各参数的值,可以这样子:
            MessageBox.Show(cmd.Parameters["@参数名"].value.ToString());

               

看了老师的课程,我根据我个人思路写了个实例,员工信息查看(包含的功能有,获取全员信息,可根据部门,用户编号,用户姓名查寻,增加用户,删除用户,修改用户),不过没有在实例中应用到返回参数,这个返回参数,我还要单独做一个实例出来,包括参数添加的几种方式,我的实例中只使用一种方式来添加参数!

全代码如下

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlClient;
using System.Text.RegularExpressions;

namespace WF30
{
    public partial class Form1 : Form
    {
        //数据库连接字符串
        string strConn = "server=.;database=hrms;uid=sa;pwd=123123";
        public Form1()
        {
            InitializeComponent();
        }

        /// <summary>
        /// 退出程序
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnQuit_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        /// <summary>
        /// 初始化刷新数据
        /// </summary>
        void Init()
        {
            livDisplay.Items.Clear();//清空列表内容

            //部门信息就不要改了,这里把它控件设定为只读,修改用户信息也一样
            this.tbIdep.ReadOnly = true;//设置为只读
            this.tbIdep.BackColor = Color.Gray;//背景为灰色

            if (cbDep.Text != "#加载部门#")
            {
                this.tbIdep.Text = cbDep.Text.Trim();
            }

            //1.使用查寻字符串查寻获取部门列表
            string strDep = "select bmbh,bmmc from department";
            //2.使用存储过程查寻获取部门列表
            string strDep2 = "Do_department";
            using (SqlConnection conn = new SqlConnection(strConn))//创建连接对象
            {
                //SqlCommand cmd = new SqlCommand(strDep, conn);//创建命令对象,使用连接字符串
                //cmd.CommandType = CommandType.Text;//声明命令对象的类型,使用连接字符串

                SqlCommand cmd = new SqlCommand(strDep2, conn);//创建命令对象,使用存储过程
                cmd.CommandType = CommandType.StoredProcedure;//声明命令对象的类型,使用存储过程
                //我这里是把所有功能写在一个存储过程中了,用标志位来调用功能
                cmd.Parameters.AddWithValue("@flag", 6);
                conn.Open();//打开连接
                SqlDataReader sdr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
                while (sdr.Read())
                {
                    //读取数据
                    cbDep.Items.Add(sdr["bmmc"].ToString());
                }
                sdr.Close();//关闭数据流
            }
        }

        /// <summary>
        /// 窗口加载
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Form1_Load(object sender, EventArgs e)
        {
            Init();//调用初始化方法

            cbDep.Text = "#加载部门#";
            tbBh.Text = "#输入编号#";
            tbName.Text = "#输入姓名#";
        }

        /// <summary>
        /// 当用户选择后,转移焦点
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void cbDep_SelectedIndexChanged(object sender, EventArgs e)
        {
            this.tbIdep.Text = cbDep.Text.Trim();
            btnDep.Focus();
        }

        /// <summary>
        /// 用户单击tbBh控件时,清空预显数据
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void tbBh_MouseClick(object sender, MouseEventArgs e)
        {
            //this.tbBh.Text = "";
            if (this.tbBh.Text != "")
            {
                tbBh.Text = "";
            }
        }

        /// <summary>
        /// 当用户鼠标离开tbBh控件且控件内容为空时,显示默认提示信息
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void tbBh_MouseLeave(object sender, EventArgs e)
        {
            if (this.tbBh.Text == "")
            {
                tbBh.Text = "#输入编号#";
            }

        }

        /// <summary>
        /// 用户单击tbName控件时,清空预显数据
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void tbName_MouseClick(object sender, MouseEventArgs e)
        {
            if (this.tbName.Text != "")
            {
                this.tbName.Text = "";
            }
        }

        /// <summary>
        /// 显示全员信息
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnAll_Click(object sender, EventArgs e)
        {
            livDisplay.Items.Clear();
            //这里我还使用存储过程了,感觉要比连接字符串快些
            using (SqlConnection conn = new SqlConnection(strConn))
            {
                SqlCommand cmd = new SqlCommand("All_employee", conn);
                cmd.CommandType = CommandType.StoredProcedure;
                conn.Open();
                SqlDataReader sdr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
                FillData(sdr).Close();
            }
        }

        /// <summary>
        /// 数据填充方法
        /// </summary>
        /// <param name="sdr"></param>
        private SqlDataReader FillData(SqlDataReader sdr)
        {
            livDisplay.Items.Clear();//
            while (sdr.Read())
            {
                //string bmmc = this.getDepName(Convert.ToInt32(sdr["bm"].ToString()));
                ListViewItem lvi = new ListViewItem(sdr["bh"].ToString());
                lvi.SubItems.Add(sdr["xm"].ToString());
                lvi.SubItems.Add(sdr["xb"].ToString());
                lvi.SubItems.Add(sdr["bm"].ToString());
                lvi.SubItems.Add(sdr["dz"].ToString());

                livDisplay.Items.Add(lvi);
            }

            return sdr;
        }

        /// <summary>
        /// 按部门编号获取部门名称
        /// 好像用不上,有点多余了,就放这里吧
        /// </summary>
        /// <param name="num"></param>
        /// <returns></returns>
        string getDepName(int num)
        {
            string Dname = "";

            using (SqlConnection conn = new SqlConnection(strConn))
            {
                SqlCommand cmd = new SqlCommand("Do_department", conn);
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Parameters.AddWithValue("flags", 4);//同上,是传送个标志位
                cmd.Parameters.AddWithValue("@bmbh", num);//传个部门编号给过程
                conn.Open();
                SqlDataReader sdr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
                while (sdr.Read())
                {
                    Dname = sdr["bmmc"].ToString();
                }
            }
            return Dname;
        }

        /// <summary>
        /// 按部门查看员工信息
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnDep_Click(object sender, EventArgs e)
        {
            if (cbDep.Text != "#加载部门#")
            {
                string strDep = this.cbDep.Text.Trim();//获取用户选择
                using (SqlConnection conn = new SqlConnection(strConn))
                {
                    SqlCommand cmd = new SqlCommand("dep_name_find_employee", conn);
                    cmd.CommandType = CommandType.StoredProcedure;
                    cmd.Parameters.AddWithValue("@name", strDep);
                    conn.Open();
                    SqlDataReader sdr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
                    FillData(sdr).Close();
                }
            }
        }

        /// <summary>
        /// 按员工编号查寻
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnBh_Click(object sender, EventArgs e)
        {
            //获取用户输入
            string bh = this.tbBh.Text.Trim();
            //为强制用户用户整型,可以使用正则表达式
            string str = @"^\d*\b$";//定义一个正则表达式
            Regex reg = new Regex(str);//实例化一个正则表达式对象employee_id_to_department_name
            if (reg.IsMatch(bh.ToString()))
            {

                int id = Convert.ToInt32(this.tbBh.Text.Trim());

                using (SqlConnection conn = new SqlConnection(strConn))
                {
                    SqlCommand cmd = new SqlCommand("Find_employee", conn);
                    cmd.CommandType = CommandType.StoredProcedure;
                    cmd.Parameters.AddWithValue("@id", id);
                    conn.Open();
                    SqlDataReader sdr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
                    FillData(sdr).Close();//调用填充数据的方法
                }
            }
            else
            {
                MessageBox.Show("亲!请输入阿拉伯数字!");
            }
        }

        /// <summary>
        /// 按姓名查找员工信息
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnName_Click(object sender, EventArgs e)
        {
            if (tbName.Text != "" && this.tbName.Text != "#输入姓名#")
            {
                using (SqlConnection conn = new SqlConnection(strConn))
                {
                    //获取用户输入
                    string nam = this.tbName.Text.Trim();
                    SqlCommand cmd = new SqlCommand("name_Find_employee", conn);
                    cmd.CommandType = CommandType.StoredProcedure;
                    conn.Open();
                    cmd.Parameters.AddWithValue("@name", nam);

                    SqlDataReader sdr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
                    FillData(sdr).Close();//调用填充数据的方法
                }
            }
        }

        /// <summary>
        /// 当用户鼠标离开时且文本框是空的时恢复默认显示
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void tbName_MouseLeave(object sender, EventArgs e)
        {
            if (this.tbName.Text == "")
            {
                this.tbName.Text = "#输入姓名#";
            }
        }

        /// <summary>
        /// 将用户选中的一项填充到左侧对应的文本框里去
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void livDisplay_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (livDisplay.SelectedItems.Count > 0)
            {
                //如果用户的选中项大于0
                foreach (ListViewItem lvi in livDisplay.SelectedItems)
                {
                    //如果用户选中多项的话,只显示被选组中的最后一项的员工信息

                    string bh = lvi.Text.Trim();//获取行中第1列中的员工工号
                    //为强制用户用户整型,可以使用正则表达式
                    string str = @"^\d*\b$";//定义一个正则表达式
                    Regex reg = new Regex(str);//实例化一个正则表达式对象employee_id_to_department_name
                    if (reg.IsMatch(bh.ToString()))
                    {

                        int id = Convert.ToInt32(lvi.Text.Trim());

                        using (SqlConnection conn = new SqlConnection(strConn))
                        {
                            SqlCommand cmd = new SqlCommand("Find_employee", conn);
                            cmd.CommandType = CommandType.StoredProcedure;
                            cmd.Parameters.AddWithValue("@id", id);
                            conn.Open();
                            SqlDataReader sdr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
                            while (sdr.Read())
                            {
                                lblBh.Text = sdr["bh"].ToString();
                                tbIname.Text = sdr["xm"].ToString();
                                tbIsex.Text = sdr["xb"].ToString();
                                tbIdep.Text = sdr["bm"].ToString();
                                tbIaddr.Text = sdr["dz"].ToString();
                            }

                            sdr.Close();
                        }
                    }
                    else
                    {
                        MessageBox.Show("亲!请输入阿拉伯数字!");
                    }

                }

            }
        }

        /// <summary>
        /// 删除用户选中项中的员工信息
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnDel_Click(object sender, EventArgs e)
        {
            if (lblBh.Text != "lblBh")
            {
                int id = Convert.ToInt32(lblBh.Text.Trim());

                using (SqlConnection conn = new SqlConnection(strConn))
                {
                    SqlCommand cmd = new SqlCommand("Delete_employee", conn);
                    cmd.CommandType = CommandType.StoredProcedure;
                    cmd.Parameters.AddWithValue("@id", id);
                    conn.Open();

                    int ok = cmd.ExecuteNonQuery();

                    if (ok > 0)
                    {
                        MessageBox.Show("删除员工信息成功!");
                    }
                    else
                    {
                        MessageBox.Show("删除信息失败!!!");
                    }
                }
                //这里我就拷贝了一下获取全员信息的代码过来
                using (SqlConnection conn = new SqlConnection(strConn))
                {
                    SqlCommand cmd = new SqlCommand("All_employee", conn);
                    cmd.CommandType = CommandType.StoredProcedure;
                    conn.Open();
                    SqlDataReader sdr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
                    FillData(sdr).Close();
                }

            }
        }

        /// <summary>
        /// 增加一个员工
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnAdd_Click(object sender, EventArgs e)
        {


            //增加员工,应先从上面选一部门
            if (cbDep.Text == "#加载部门#" && tbIdep.Text == "")
            {
                MessageBox.Show("请从部门列表中选择一个部门!");
            }

            //性别上只能填写男或女,不准填人妖
            if (tbIsex.Text.Trim() != "" && tbIsex.Text.Trim() != "男" && tbIsex.Text.Trim() != "女")
            {
                MessageBox.Show("亲,人类性别中没有这个:  " + tbIsex.Text);
                tbIsex.Text = "";
                this.tbIsex.Focus();

            }
            else
            {
                //既然是增加一个员工,最起码要有个名儿吧,管你叫他啥,不空着就行
                if (tbIname.Text != "")
                {
                    //获取用户信息
                    string nam = this.tbIname.Text.Trim();
                    using (SqlConnection conn = new SqlConnection(strConn))
                    {
                        SqlCommand cmd = new SqlCommand("Add_employee", conn);
                        cmd.CommandType = CommandType.StoredProcedure;
                        cmd.Parameters.AddWithValue("@name", nam);
                        cmd.Parameters.AddWithValue("@sex", tbIsex.Text.Trim());
                        cmd.Parameters.AddWithValue("@bm", cbDep.Text);
                        cmd.Parameters.AddWithValue("@dz", tbIaddr.Text.Trim());
                        conn.Open();

                        int ok = cmd.ExecuteNonQuery();

                        if (ok > 0)
                        {
                            MessageBox.Show("添加员工信息成功!");
                        }
                        else
                        {
                            MessageBox.Show("添加信息失败!!!");
                        }
                    }
                }
                else
                {
                    MessageBox.Show("请输入用户姓名!");
                    tbIname.Text = "";
                }


                //这里我就拷贝了一下获取全员信息的代码过来
                using (SqlConnection conn = new SqlConnection(strConn))
                {
                    SqlCommand cmd = new SqlCommand("All_employee", conn);
                    cmd.CommandType = CommandType.StoredProcedure;
                    conn.Open();
                    SqlDataReader sdr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
                    FillData(sdr).Close();
                }

            }
        }

        /// <summary>
        /// 修改员工信息
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnModify_Click(object sender, EventArgs e)
        {
            //获取输入信息
            if (lblBh.Text == "lblBh")
            {
                MessageBox.Show("请选择您要修改的员工信息!");
            }
            else
            {
                int id = Convert.ToInt32(lblBh.Text);
                string nam = tbIname.Text.Trim();
                string dz = tbIaddr.Text.Trim();
                string sex = tbIsex.Text.Trim();
                string bm = tbIdep.Text.Trim();
                //性别上只能填写男或女,不准填人妖
                if (tbIsex.Text.Trim() != "" && tbIsex.Text.Trim() != "男" && tbIsex.Text.Trim() != "女")
                {
                    MessageBox.Show("亲,人类性别中没有这个:  " + tbIsex.Text);
                    tbIsex.Text = "";
                    this.tbIsex.Focus();

                }
                else
                {
                    //既然是增加一个员工,最起码要有个名儿吧,管你叫他啥,不空着就行
                    if (tbIname.Text != "")
                    {
                        using (SqlConnection conn = new SqlConnection(strConn))
                        {
                            SqlCommand cmd = new SqlCommand("Modify_employee2", conn);
                            cmd.CommandType = CommandType.StoredProcedure;
                            cmd.Parameters.AddWithValue("@id", id);
                            cmd.Parameters.AddWithValue("@name", nam);
                            cmd.Parameters.AddWithValue("@sex", sex);
                            cmd.Parameters.AddWithValue("@bm", bm);
                            cmd.Parameters.AddWithValue("@dz", dz);
                            conn.Open();

                            int ok = cmd.ExecuteNonQuery();

                            if (ok > 0)
                            {
                                MessageBox.Show("员工信息修改成功!");
                            }
                            else
                            {
                                MessageBox.Show("添加信息失败!!!");
                            }
                        }
                    }
                    else
                    {
                        MessageBox.Show("请输入用户姓名!");
                        tbIname.Text = "";
                    }
                    using (SqlConnection conn = new SqlConnection(strConn))
                    {
                        SqlCommand cmd = new SqlCommand("dep_name_find_employee", conn);
                        cmd.CommandType = CommandType.StoredProcedure;
                        cmd.Parameters.AddWithValue("@name", bm);
                        conn.Open();
                        SqlDataReader sdr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
                        FillData(sdr).Close();
                    }

                }
            }
        }

        //先获取原有数据
        string str = "";
        /// <summary>
        /// 单击tbIname清空数据
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void tbIname_MouseClick(object sender, MouseEventArgs e)
        {
            
            if (tbIname.Text != "")
            {
                str = tbIname.Text.Trim();
                tbIname.Text = "";
            }
        }
        /// <summary>
        /// 鼠标离开tbIname控件时
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void tbIname_MouseLeave(object sender, EventArgs e)
        {
            if (tbIname.Text == "")
            {
                tbIname.Text = str;
            }
        }

        string str2;
        /// <summary>
        /// 鼠标单击tbIsex时清空数据
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void tbIsex_MouseClick(object sender, MouseEventArgs e)
        {
            if (tbIsex.Text != "")
            {
                str2 = tbIsex.Text.Trim();
                tbIsex.Text = "";
            }
        }
        /// <summary>
        /// 鼠标离开tbIsex控件时
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void tbIsex_MouseLeave(object sender, EventArgs e)
        {
            if (tbIsex.Text == "")
            {
                tbIsex.Text = str2;
            }
        }
        string str3;
        /// <summary>
        /// 鼠标单击tbIaddr控件时清空数据
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void tbIaddr_MouseClick(object sender, MouseEventArgs e)
        {
            if (tbIaddr.Text != "")
            {
                str3 = tbIaddr.Text.Trim();
                tbIaddr.Text = "";
            }
        }
        /// <summary>
        /// 鼠标离开tbIaddr控件时
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void tbIaddr_MouseLeave(object sender, EventArgs e)
        {
            if (tbIaddr.Text == "")
            {
                tbIaddr.Text = str3;
            }
        }


    }
}
以下是数据创建代码:

员工表

CREATE TABLE [dbo].[employee](
	[bh] [int] NOT NULL,
	[xm] [char](8) NULL,
	[xb] [char](2) NULL,
	[dz] [char](100) NULL,
	[bm] [char](40) NULL,
	)
部门表

CREATE TABLE [dbo].[department](
    [bmbh] [int] NOT NULL,
    [bmmc] [char](40) NOT NULL
    )
插入些数据就可以测试了:

测试结果如图:



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值