您的位置:首页 > 数据库

数据库设计札记 - 存储过程

2010-04-18 15:53 344 查看
1. 创建存储过程

存储过程基本上是一个SQL语句,但是它是事先经过语法分析后置于数据库上的。方便重复利用

首先,我们来仔细读下标准存储过程的写法

create procedure[procedure_name]
{@parameter data_type,
@parameter data_type,
... }
[with
{
recompile| encryption | recompile,encrytion
}
]   //可不写
[for replication]
as
sql_statements


下面是个简单的例子:

create procedure[update_time]
{
@time [datetime],
@order [int]
}
as
update book
set book.time = @time
where book.ID = @order


2. 面向过程的调用存储过程

下面我们尝试在VS2008中使用C#语言来调用此存储过程

try
{
SqlConnection conn = new SqlConnection();
conn.ConnectionString = ""; //连接到具体数据库
conn.Open();  //打开连接
SqlCommand cmd = new SqlCommand();
cmd.CommandType = CommandType.StoredProcedure; //关键! 指定该SQL语句是来自于存储过程
cmd.CommandText = "update_time"; //存储过程的名称
cmd.Parameters.Add(new SqlParameter("@time", SqlDbType.DateTime));
cmd.Parameters["@time"].Value = Convert.ToDateTime( ""); // 为输入参数赋值
cmd.Parameters.Add(new SqlParameter("@order", SqlDbType.Int));
cmd.Parameters["@order"].Value = 12345;
cmd.EndExecuteNonQuery(); //因为是更新语句,故无返回值,直接执行即可
}


3. 面向对象的使用存储过程

通过上面的例子,我们可以很容易学会怎么调用存储过程,但是如果采用面向对象的设计方法,对存储过程的传参,调用,返回值等部分进行封装,将大大提高我们的编程效率。

网上封装好的函数很多,在此我们只关注设计的思路和理念

第一步 建立storeProcedure类的基本结构

public class StoreProcedure
{
//连接字符串
private string connectionString;
//存储过程名
private string storeProcedureName;
/// <summary>
/// 属性,获取或更新连接字符串
/// </summary>
public string ConnectionString
{
get
{
return this.connectionString;
}
set
{
this.connectionString = value;
}
}
/// <summary>
/// 属性,获取或更新存储过程
/// </summary>
public string StoreProcedureName
{
get
{
return this.storeProcedureName;
}
set
{
this.storeProcedureName = value;
}
}
/// <summary>
/// 构造函数
/// </summary>
/// <param name="conn">连接字符串</param>
/// <param name="storeProcedureName">存储过程名</param>
public StoreProcedure(string conn, string storeProcedureName)
{
this.connectionString = conn;
this.storeProcedureName = storeProcedureName;
}
}


接下来 我们就要往里面添加实际执行数据库操作的函数 ExecuteNonQuery()

public int ExecuteNonQuery(params object[] paraValues)
{
//建立数据连接(注意该连接的生命周期即为using包含部分)
using (SqlConnection conn = new SqlConnection(this.ConnectionString))
{
try{
conn.Open();
SqlCommand command = new SqlCommand("MYSQL", conn);
command.CommandType = CommandType.StoredProcedure;
//接下来就该为存储过程的参数赋值了,我们先拟定一个函数 AssignParameterValue(),一会再来填充它
this.AssignParameterValues(command,paraValues);
return command.ExecuteNonQuery();
}
catch{
throw;
}
}
}


最后是AssignParameterValue() ,我们要通过这个函数来为存储过程的参数赋值

private void AssignParameterValues(SqlCommand sqlCommand, params object[] paraValues)
{
try
{
for (int i = 0; i < paraValues.Length; i++)
{
//采用对象数组赋值,系统会自动进行类型转化
sqlCommand.Parameters[i + 1].Value = (paraValues[i] == null) ? DBNull.Value : paraValues[i];
}
}
}


OK,通过这样一整理,结构是不是更清晰了,以后再使用存储过程的时候就不需要关注怎么连数据库,怎么控制Command啦

如果大家继续努力,将ExecuteReader(),ExecuteScalar()都对象化

那么你就可以把它应用与你以后任何一个项目中啦!

来试试吧~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: