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());
此种写法,在关闭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
)
插入些数据就可以测试了:
测试结果如图: