One:理论
A:定义
存储过程(stored procedure)是一组为了完成特定功能的SQL语句集合,经编译后存储在服务器端的数据库中,利用存储过程可以加速SQL语句的执行。
存储过程分为系统存储过程和自定义存储过程。
1.系统存储过程在master数据库中,但是在其他的数据库中可以直接调用,并且在调用时不必在存储过程前加上数据库名,因为在创建一个新数据库时,系统存储过程
在新的数据库中会自动创建
2.自定义存储过程,由用户创建并能完成某一特定功能的存储过程,存储过程既可以有参数又有返回值,但是它与函数不同,存储过程的返回值只是指明执行是否成功,
并不能像函数那样被直接调用,只能利用execute来执行存储过程。
B:优点
1.提高应用程序的通用性和可移植性:存储过程创建后,可以在程序中被多次调用,而不必重新编写该存储过程的SQL语句。并且数据库专业人员可以随时对存储过程进行
修改,且对程序源代码没有影响,这样就极大的提高了程序的可移植性。
2.可以更有效的管理用户操作数据库的权限:在Sql Server数据库中,系统管理员可以通过对执行某一存储过程的权限进行限制,从而实现对相应的数据访问进行控制,
避免非授权用户对数据库的访问,保证数据的安全。
3.可以提高SQL的速度,存储过程是编译过的,如果某一个操作包含大量的SQL代码或分别被执行多次,那么使用存储过程比直接使用单条SQL语句执行速度快的多。
4.减轻服务器的负担:当用户的操作是针对数据库对象的操作时,如果使用单条调用的方式,那么网络上还必须传输大量的SQL语句,如果使用存储过程,
则直接发送过程的调用命令即可,降低了网络的负担。
C:语法
SQL Server存储过程语法:
create procedure 过程名
@parameter 参数类型
@parameter 参数类型
。。。
as
begin
end
执行存储过程:execute 过程名
Two:应用
A:数据库存储
--查询不带参数的存储过程
ALTER procedure [dbo].[GetUser]
as
begin
Select Theserialnumber, UserID, UserName, UserSet,
Userphone, work.UserworkType,Details.WorkDetailsSituation,
[level].UserleverlType,[type].UserType, UserCreationtime, hobby.Userhobby from [User]
inner join Work on Work.UserworkID=[User].UserworkID
inner join [level] on [level].UserlevelID=[user].UserlevelID
inner join UserType as [type] on [type].UserTypeID=[USER].UserTypeID
inner join WorkDetails as Details on Details.WorkDetailsID=Work.WorkDetailsID
inner join Userhobby as hobby on hobby.UserhobbyID=[user].UserhobbyID
end
--查询带参数的存储过程
ALTER procedure [dbo].[GetUserID] --创建存储过程名
@UserID varchar(50) --参数
as
begin
select * from [User] where UserID=@UserID -- 命令行或者命令块
end
B:项目程序
//根据提供的strSQL语句 访问数据库,返回List集合
public List<User> GetDataSet(string strSQL)
{
Connection();
try
{
SqlDataAdapter da = new SqlDataAdapter(strSQL, con);
DataSet ds = new DataSet();
da.Fill(ds);
List<User> list = new List<User>();
if (ds.Tables.Count > 0)
{
for (int i = 0; i < ds.Tables.Count; i++)
{
foreach (DataRow dr in ds.Tables[i].Rows)
{
User obj = new User();
if (ds.Tables[i].Columns.Contains("UserID")) obj.UserID = Convert.ToString(dr["UserID"]);
if (ds.Tables[i].Columns.Contains("UserName")) obj.UserName = Convert.ToString(dr["UserName"]);
if (ds.Tables[i].Columns.Contains("UserSet")) obj.UserSet = Convert.ToString(dr["UserSet"]);
if (ds.Tables[i].Columns.Contains("Userphone")) obj.Userphone = Convert.ToString(dr["Userphone"]);
if (ds.Tables[i].Columns.Contains("UserworkType")) obj.UserworkType = Convert.ToString(dr["UserworkType"]);
if (ds.Tables[i].Columns.Contains("WorkDetailsSituation")) obj.WorkDetailsSituation = Convert.ToString(dr["WorkDetailsSituation"]);
if (ds.Tables[i].Columns.Contains("UserleverlType")) obj.UserleverlType = Convert.ToString(dr["UserleverlType"]);
if (ds.Tables[i].Columns.Contains("UserType")) obj.UserType = Convert.ToString(dr["UserType"]);
if (ds.Tables[i].Columns.Contains("UserCreationtime")) obj.UserCreationtime = Convert.ToDateTime(dr["UserCreationtime"]);
if (ds.Tables[i].Columns.Contains("Userhobby")) obj.Userhobby = Convert.ToString(dr["Userhobby"]);
list.Add(obj);
}
}
}
return list;
}
catch (Exception)
{
throw;
}
}
/// <summary>
/// 执行返回DataTable的查询
/// <param name="procName">存储过程名称</param>
/// <param name="parameters">存储过程参数</param>
public static DataTable GetDataTableByProc(string procName, params IDataParameter[] parameters)
{
Connection();
DataTable dt = new DataTable();
SqlCommand cmd = new SqlCommand();
try
{
cmd.Connection = con;
cmd.CommandText = procName;
cmd.CommandType = CommandType.StoredProcedure;
for (int i = 0; i < parameters.Length; i++)
{
cmd.Parameters.Add(parameters[i]);
}
SqlDataAdapter dp = new SqlDataAdapter(cmd);
dp.Fill(dt);
con.Close();
return dt;
}
catch (Exception ex)
{
throw ex;
}
}
/// 执行返回DataSet的查询
/// <param name="procName">存储过程名称</param>
/// <param name="parameters">存储过程参数</param>
public static DataSet GetDataSetByProc(string procName, params IDataParameter[] parameters)
{
Connection();
DataSet ds = new DataSet();
SqlCommand cmd = new SqlCommand();
try
{
cmd.Connection = con;
cmd.CommandText = procName;
cmd.CommandType = CommandType.StoredProcedure;
con.Open();
for (int i = 0; i < parameters.Length; i++)
{
cmd.Parameters.Add(parameters[i]);
}
SqlDataAdapter dp = new SqlDataAdapter(cmd);
dp.Fill(ds);
con.Close();
return ds;
}
catch (Exception ex)
{
throw ex;
}
}
/// <summary>
/// 根据条件查询
/// </summary>
/// <param name="SqlStr">存储过程名称/sql语句</param>
/// <param name="parameters">存储过程参数/参数</param>
/// <returns></returns>
public static DataTable GetDataTable(string SqlStr, params IDataParameter[] parameters)
{
#region
Connection();
DataTable dt = new DataTable();
SqlDataAdapter da = new SqlDataAdapter(SqlStr, con);
try
{
da.SelectCommand.Parameters.Clear();
foreach (SqlParameter pam in parameters)
{
da.SelectCommand.Parameters.Add(EncodeParam(pam));
}
da.Fill(dt);
da.SelectCommand.Parameters.Clear();
da.Dispose();
}
catch (Exception e)
{
Console.Write(SqlStr + ",SQL异常:" + e.Message);
}
finally
{
con.Dispose();
}
return dt;
#endregion
}
C:调用
//、、、、、、、、存储过程、、、、、、、、、
//查询全部
public static List<User> GetUser()
{
return db.GetDataSet("GetUser");
}
/// <summary>
/// 根据条件查询
/// </summary>
/// <param name="UserID">参数</param>
public static DataTable GetUserID(string UserID)
{
SqlParameter[] parameters = {
new SqlParameter("@UserID",SqlDbType.VarChar,50)
};
parameters[0].Value = UserID;
return DBbase.GetDataTableByProc("GetUserID", parameters);
}
//存储过程
List<User> u = DAL.Family.GetUser();
DataTable d = DAL.Family.GetUserID("2020020901494949");
for (int i = 0; i < d.Rows.Count; i++)
{
foreach (DataRow dr in d.Rows)
{
var ID = dr["UserID"].ToString();
}
}
来源:https://www.cnblogs.com/jstblog/p/12432421.html