首页 > 数据库 >SQL 相关博客

SQL 相关博客

时间:2023-08-19 22:56:35浏览次数:46  
标签:存储 exec -- SQL 博客 new 相关 proc sqlCommand

文章来源: SQL Server 存储过程 - hoojo - 博客园 (cnblogs.com)

 

---SQL Server 存储过程
-- 存储过程Procedure是一组为了完成特定功能的SQL语句集合,经编译后存储在数据库中,用户通过指定存储过程的名称并给出参数来执行。
--存储过程中可以包含逻辑控制语句和数据操纵语句,它可以接受参数、输出参数、返回单个或多个结果集以及返回值。
--由于存储过程在创建时即在数据库服务器上进行了编译并存储在数据库中,所以存储过程运行要比单个的SQL语句块要快。同时由于在调用时只需用提供存储过程名和必要的参数信息,所以在一定程度上也可以减少网络流量、简单网络负担。

--存储过程的优点
-- A、 存储过程允许标准组件式编程
--存储过程创建后可以在程序中被多次调用执行,而不必重新编写该存储过程的SQL语句。而且数据库专业人员可以随时对存储过程进行修改,但对应用程序源代码却毫无影响,从而极大的提高了程序的可移植性。

--B、 存储过程能够实现较快的执行速度
--如果某一操作包含大量的T-SQL语句代码,分别被多次执行,那么存储过程要比批处理的执行速度快得多。因为存储过程是预编译的,在首次运行一个存储过程时,查询优化器对其进行分析、优化,并给出最终被存在系统表中的存储计划。而批处理的T-SQL语句每次运行都需要预编译和优化,所以速度就要慢一些。

--C、 存储过程减轻网络流量
--对于同一个针对数据库对象的操作,如果这一操作所涉及到的T-SQL语句被组织成一存储过程,那么当在客户机上调用该存储过程时,网络中传递的只是该调用语句,否则将会是多条SQL语句。从而减轻了网络流量,降低了网络负载。

--D、 存储过程可被作为一种安全机制来充分利用
--系统管理员可以对执行的某一个存储过程进行权限限制,从而能够实现对某些数据访问的限制,避免非授权用户对数据的访问,保证数据的安全。

--系统存储过程
 --系统存储过程是系统创建的存储过程,目的在于能够方便的从系统表中查询信息或完成与更新数据库表相关的管理任务或其他的系统管理任务。
 --系统存储过程主要存储在master数据库中,以“sp”下划线开头的存储过程。尽管这些系统存储过程在master数据库中,但我们在其他数据库还是可以调用系统存储过程。有一些系统存储过程会在创建新的数据库的时候被自动创建在当前数据库中。

 --常用系统存储过程有:
exec sp_databases; --查看数据库
exec sp_tables;        --查看表
exec sp_columns student;--查看列
exec sp_helpIndex student;--查看索引
exec sp_helpConstraint student;--约束
exec sp_stored_procedures;
exec sp_helptext 'sp_stored_procedures';--查看存储过程创建、定义语句
exec sp_rename student, stuInfo;--修改表、索引、列的名称
exec sp_renamedb myTempDB, myDB;--更改数据库名称
exec sp_defaultdb 'master', 'myDB';--更改登录名的默认数据库
exec sp_helpdb;--数据库帮助,查询数据库信息
exec sp_helpdb master;

-- 系统存储过程示例:
--表重命名
exec sp_rename 'stu', 'stud';
--列重命名
exec sp_rename 'stud.name', 'sName', 'column';
exec sp_help 'stud';
--重命名索引
exec sp_rename N'student.idx_cid', N'idx_cidd', N'index';
exec sp_help 'student';

--查询所有存储过程
select * from sys.objects where type = 'P';
select * from sys.objects where type_desc like '%pro%' and name like 'sp%';

-- 用户自定义存储过程
-- 1、 创建语法
create proc | procedure pro_name
    [{@参数数据类型} [=默认值] [output],
     {@参数数据类型} [=默认值] [output],
     ....
    ]
as
    SQL_statements

--  2、 创建不带参数存储过程
--创建存储过程
if (exists (select * from sys.objects where name = 'proc_get_student'))
    drop proc proc_get_student
go
create proc proc_get_student
as
    select * from student;

--调用、执行存储过程
exec proc_get_student;

----3、修改存储过程
alter proc proc_get_student
as
select * from student;

--4、带参存储过程
if (object_id('proc_find_stu', 'P') is not null)
    drop proc proc_find_stu
go
create proc proc_find_stu(@startId int, @endId int)
as
    select * from student where id between @startId and @endId
go

exec proc_find_stu 2, 4;

--5、带通配符参数存储过程
if (object_id('proc_findStudentByName', 'P') is not null)
    drop proc proc_findStudentByName
go
create proc proc_findStudentByName(@name varchar(20) = '%j%', @nextName varchar(20) = '%')
as
    select * from student where name like @name and name like @nextName;
go

exec proc_findStudentByName;
exec proc_findStudentByName '%o%', 't%';

--6、带输出参数存储过程
if (object_id('proc_getStudentRecord', 'P') is not null)
    drop proc proc_getStudentRecord
go
create proc proc_getStudentRecord(
    @id int, --默认输入参数
    @name varchar(20) out, --输出参数
    @age varchar(20) output--输入输出参数
)
as
    select @name = name, @age = age  from student where id = @id and sex = @age;
go

-- 
declare @id int,
        @name varchar(20),
        @temp varchar(20);
set @id = 7; 
set @temp = 1;
exec proc_getStudentRecord @id, @name out, @temp output;
select @name, @temp;
print @name + '#' + @temp;

-- 7、 不缓存存储过程
--WITH RECOMPILE 不缓存
if (object_id('proc_temp', 'P') is not null)
    drop proc proc_temp
go
create proc proc_temp
with recompile
as
    select * from student;
go

exec proc_temp;

--  8、 加密存储过程
--加密WITH ENCRYPTION 
if (object_id('proc_temp_encryption', 'P') is not null)
    drop proc proc_temp_encryption
go
create proc proc_temp_encryption
with encryption
as
    select * from student;
go

exec proc_temp_encryption;
exec sp_helptext 'proc_temp';
exec sp_helptext 'proc_temp_encryption';

-- 9、 带游标参数存储过程
if (object_id('proc_cursor', 'P') is not null)
    drop proc proc_cursor
go
create proc proc_cursor
    @cur cursor varying output
as
    set @cur = cursor forward_only static for
    select id, name, age from student;
    open @cur;
go

--调用
declare @exec_cur cursor;
declare @id int,
        @name varchar(20),
        @age int;
exec proc_cursor @cur = @exec_cur output;--调用存储过程
fetch next from @exec_cur into @id, @name, @age;
while (@@fetch_status = 0)
begin
    fetch next from @exec_cur into @id, @name, @age;
    print 'id: ' + convert(varchar, @id) + ', name: ' + @name + ', age: ' + convert(char, @age);
end
close @exec_cur;
deallocate @exec_cur;--删除游标

-- 10、分页存储过程
---存储过程、row_number完成分页
if (object_id('pro_page', 'P') is not null)
    drop proc proc_cursor
go
create proc pro_page
    @startIndex int,
    @endIndex int
as
    select count(*) from product
;    
    select * from (
        select row_number() over(order by pid) as rowId, * from product 
    ) temp
    where temp.rowId between @startIndex and @endIndex
go
--drop proc pro_page
exec pro_page 1, 4
--
--分页存储过程
---存储过程、row_number完成分页
if (object_id('pro_page', 'P') is not null)
    drop proc proc_cursor
go
create proc pro_page
    @startIndex int,
    @endIndex int
as
    select count(*) from product
;    
    select * from (
        select row_number() over(order by pid) as rowId, * from product 
    ) temp
    where temp.rowId between @startIndex and @endIndex
go
--drop proc pro_page
exec pro_page 1, 4
--
--分页存储过程
if (object_id('pro_page', 'P') is not null)
    drop proc pro_stu
go
create procedure pro_stu(
    @pageIndex int,
    @pageSize int
)
as
    declare @startRow int, @endRow int
    set @startRow = (@pageIndex - 1) * @pageSize +1
    set @endRow = @startRow + @pageSize -1
    select * from (
        select *, row_number() over (order by id asc) as number from student 
    ) t
    where t.number between @startRow and @endRow;

exec pro_stu 2, 2;

--分页存储示例row_number() over(order by id) as rownumber  /rownumber between @startRow and @endRow
if(OBJECT_ID('p_selectbypage','p') is not null)
    drop proc p_selectbypage
go
create proc p_selectbypage(@pageIndex int ,@pageSize int,@totalCount int out)
as
declare @startRow int
declare @endRow int
set @startRow=(@pageIndex-1)*@pageSize+1
set @endRow=@pageIndex*@pageSize
select @totalCount= count(*) from Users
select * from (
    select *,row_number() over(order by userId) as rownumber from Users
)temp
where rownumber between @startRow and @endRow

declare @totalRow int 
exec p_selectbypage 1,10,@totalRow out
select @totalRow


--分页存储示例 order by id offset (@pageIndex-1)*@pageSize rows fetch next @pageSize rows only //必须排序
if(OBJECT_ID('p_selectbypage2','p') is not null)
    drop proc p_selectbypage2
go
create proc p_selectbypage2(@pageIndex int ,@pageSize int,@totalCount int out)
as
declare @skipRow int
set @skipRow=(@pageIndex-1)*@pageSize
select @totalCount= count(*) from Users
select * from Users
order by UserId
offset @skipRow rows fetch next @pageSize rows only

declare @totalRow int 
exec p_selectbypage2 1,10,@totalRow out
select @totalRow 

---无返回值存储过程
if(OBJECT_ID('cp_add_user','p') is not null)
    drop proc cp_add_user
go
create proc cp_add_user(@badge varchar(8),@password varchar(20),@email varchar(10),@name varchar(20),@cname nvarchar(20),@deptId varchar(50),@addBy varchar(8))
as
INSERT INTO Users(Badge,Password,Name,CName,Email,DeptId,AddBy) VALUES(@badge,@password,@email,@name,@cname,@deptId,@addBy)

--返回插入行ID
if(OBJECT_ID('cp_add_user_return','p') is not null)
    drop proc cp_add_user_return
go
create proc cp_add_user_return(@badge varchar(8),@password varchar(20),@email varchar(10),@name varchar(20),@cname nvarchar(20),@deptId varchar(50),@addBy varchar(8),@userId varchar(50) out)
as
select @userId=NEWID() from Users
INSERT INTO Users(UserId,Badge,Password,Name,CName,Email,DeptId,AddBy) VALUES(@userId,@badge,@password,@email,@name,@cname,@deptId,@addBy)

 

ADO.NET 执行存储过程  

using Microsoft.Data.SqlClient;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using xue.ado.net.test.Common;

namespace xue.ado.net.test.DAL
{
    public class BaseContext
    {
        private string connectionstring = string.Empty;

        public BaseContext() {
            connectionstring = AppConfiguration.GetSetting("ConnectionStrings:BaseContext");
        }


        public DataTable SqlSelectNoCommand(string sql, List<SqlParameter> sqlParameters = null)
        {
            DataTable dataTable = new DataTable();

            using (SqlConnection connection = new SqlConnection(connectionstring))
            {
                SqlDataAdapter dataAdapter = new SqlDataAdapter(sql, connection);

                if (sqlParameters != null)
                {
                    dataAdapter.SelectCommand.Parameters.AddRange(sqlParameters.ToArray());
                }

                try
                {
                    connection.Open();
                    DataSet dataSet = new DataSet();
                    dataAdapter.Fill(dataSet);
                    dataTable = dataSet.Tables[0];
                }
                catch (Exception e)
                {
                    dataTable.TableName = "dt_error";
                }
                finally
                {
                    connection.Close();
                }

            }

            return dataTable;
        }

        public DataTable SqlSelect(string sql,List<SqlParameter> sqlParameters=null)
        {
            DataTable dataTable= new DataTable();

            using(SqlConnection connection = new SqlConnection(connectionstring))
            {
                SqlCommand sqlCommand= new SqlCommand(sql,connection);

                if (sqlParameters != null)
                {
                    sqlCommand.Parameters.AddRange(sqlParameters.ToArray());
                }

                try
                {
                    connection.Open();
                    SqlDataAdapter adapter = new SqlDataAdapter(sqlCommand);
                    DataSet dataSet = new DataSet();
                    adapter.Fill(dataSet);
                    dataTable = dataSet.Tables[0];
                }catch(Exception e)
                {
                    dataTable.TableName = "dt_error";
                }
                finally
                {
                    connection.Close();
                }

            }

            return dataTable;
        }

        public bool SqlUpdate(string sql,List<SqlParameter> sqlParameters=null)
        {
            using(SqlConnection conn = new SqlConnection(connectionstring))
            {
                SqlCommand sqlCommand= new SqlCommand(sql,conn);

                if (sqlParameters !=null)
                {
                    sqlCommand.Parameters.AddRange(sqlParameters.ToArray());
                }

                try
                {
                    conn.Open();
                    int num = sqlCommand.ExecuteNonQuery();
                    return true;
                }
                catch (Exception e)
                {

                    return false;
                }
                finally { 
                    conn.Close(); 
                }
            }
        }

        /// <summary>
        /// 无返回值的存储过程
        /// </summary>
        /// <param name="procName"></param>
        /// <param name="sqlParameters"></param>
        /// <returns></returns>
        public bool ExecProcdure(string procName,List<SqlParameter> sqlParameters)
        {
            using (SqlConnection connection = new SqlConnection(connectionstring))
            {
                SqlCommand sqlCommand = new SqlCommand();
                sqlCommand.Connection= connection;
                sqlCommand.CommandType = CommandType.StoredProcedure;
                sqlCommand.CommandText = procName;

                sqlCommand.Parameters.AddRange(sqlParameters.ToArray());

                try
                {
                    connection.Open();
                    sqlCommand.ExecuteNonQuery();
                    return true;
                }
                catch (Exception)
                {

                    return false;
                }
                finally
                {
                    connection.Close();
                }
            }
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="procName">存储过程名称</param>
        /// <param name="sqlParameters">输入参数</param>
        /// <param name="outSqlParameters">输入参数</param>
        /// <returns></returns>
        public bool ExecProcdure(string procName, List<SqlParameter> sqlParameters,List<SqlParameter> outSqlParameters,out Dictionary<string,string> dicValue)
        {
            dicValue= new Dictionary<string,string>();
            using (SqlConnection connection = new SqlConnection(connectionstring))
            {
                SqlCommand sqlCommand = new SqlCommand();
                sqlCommand.Connection = connection;
                sqlCommand.CommandType = CommandType.StoredProcedure;
                sqlCommand.CommandText = procName;

                //添加输入参数
                sqlCommand.Parameters.AddRange(sqlParameters.ToArray());

                //添加输出参数/或输入输出参数
                sqlCommand.Parameters.AddRange(outSqlParameters.ToArray());

                try
                {
                    connection.Open();
                    sqlCommand.ExecuteNonQuery();

                    foreach (SqlParameter item in outSqlParameters)
                    {
                        dicValue.Add(item.ParameterName, Convert.ToString(sqlCommand.Parameters[item.ParameterName].Value));
                    }

                    return true;
                }
                catch (Exception)
                {
                    return false;
                }
                finally
                {
                    connection.Close();
                }
            }
        }

        public DataTable ExecProResult(string procName, List<SqlParameter> sqlParameters)
        {
            DataTable dt = new DataTable();
            using (SqlConnection connection = new SqlConnection(connectionstring))
            {
                SqlCommand sqlCommand = new SqlCommand();
                sqlCommand.Connection = connection;
                sqlCommand.CommandType = CommandType.StoredProcedure;
                sqlCommand.CommandText = procName;

                //添加输入参数
                sqlCommand.Parameters.AddRange(sqlParameters.ToArray());

                try
                {
                    connection.Open();
                    using(SqlDataReader reader = sqlCommand.ExecuteReader())
                    {
                        dt.Load(reader);//将结果加载到DataTable中
                    }

                    if (dt.Rows.Count>0)
                    {
                        dt.TableName = "dt_oks";
                    }
                    else
                    {
                        dt.TableName = "dt_ok";
                    }

                    return dt;
                }
                catch (Exception)
                {
                    dt.TableName = "dt_error";
                    return dt;
                }
                finally
                {
                    connection.Close();
                }
            }
        }

        public DataTable ExecProcResult(string procName, List<SqlParameter> sqlParameters, List<SqlParameter> outSqlParameters, out Dictionary<string, string> dicValue)
        {
            dicValue = new Dictionary<string, string>();
            DataTable dataTable= new DataTable();
            using (SqlConnection connection = new SqlConnection(connectionstring))
            {
                SqlCommand sqlCommand = new SqlCommand();
                sqlCommand.Connection = connection;
                sqlCommand.CommandType = CommandType.StoredProcedure;
                sqlCommand.CommandText = procName;

                //添加输入参数
                sqlCommand.Parameters.AddRange(sqlParameters.ToArray());

                //添加输出参数/或输入输出参数
                sqlCommand.Parameters.AddRange(outSqlParameters.ToArray());

                try
                {
                    connection.Open();
                    
                    using(SqlDataReader reader = sqlCommand.ExecuteReader())
                    {
                        dataTable.Load(reader);
                    }

                    foreach (SqlParameter item in outSqlParameters)
                    {
                        dicValue.Add(item.ParameterName, Convert.ToString(sqlCommand.Parameters[item.ParameterName].Value));
                    }

                    if (dataTable.Rows.Count > 0)
                    {
                        dataTable.TableName = "dt_oks";
                    }
                    else
                    {
                        dataTable.TableName = "dt_ok";
                    }

                    return dataTable;
                }
                catch (Exception)
                {
                    dataTable.TableName = "dt_error";
                    return dataTable;
                }
                finally
                {
                    connection.Close();
                }
            }
        }
    }
}
  

 

使用示例

using Microsoft.Data.SqlClient;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using xue.ado.net.test.DAL;
using xue.ado.net.test.Dto;
using static System.Windows.Forms.VisualStyles.VisualStyleElement.ListView;
using static System.Windows.Forms.VisualStyles.VisualStyleElement.StartPanel;

namespace xue.ado.net.test.BLL
{
    public class SystemService
    {
        private SystemDal systemDal = SystemDal.GetInstance;

        public DataTable GetUser()
        {
            return systemDal.GetUser();
        }

        public DataTable GetUsers()
        {
            return systemDal.GetUsers();
        }

        public bool AddUser(User user)
        {
            return systemDal.AddUser(user.Badge,user.Password,user.Name,user.CName,user.Email,user.DeptId,user.AddBy);
        }

        public bool AddUserInProc(User user)
        {
            List<SqlParameter> sqlParameters = new List<SqlParameter>() {
                new SqlParameter("@badge",user.Badge),
                new SqlParameter("@password",user.Password),
                new SqlParameter("@name",user.Name),
                new SqlParameter("@cname",user.CName),
                new SqlParameter("@email",user.Email),
                new SqlParameter("@deptId",user.DeptId),
                new SqlParameter("@addBy",user.AddBy)
            };

            return systemDal.ExecProcdure("cp_add_user", sqlParameters);
        }

        public bool AddUserReturnId(User user)
        {
            List<SqlParameter> sqlParameters = new List<SqlParameter>() {
                new SqlParameter("@badge",user.Badge),
                new SqlParameter("@password",user.Password),
                new SqlParameter("@name",user.Name),
                new SqlParameter("@cname",user.CName),
                new SqlParameter("@email",user.Email),
                new SqlParameter("@deptId",user.DeptId),
                new SqlParameter("@addBy",user.AddBy)
            };

            List<SqlParameter> outSqlParameters = new List<SqlParameter>();

            SqlParameter parameter = new SqlParameter("@userId", SqlDbType.VarChar, 50);
            parameter.Direction = ParameterDirection.Output;
            outSqlParameters.Add(parameter);

            Dictionary<string, string> keyValue;


            bool bln = systemDal.ExecProcdure("cp_add_user_return",sqlParameters,outSqlParameters,out keyValue);

            foreach (SqlParameter item in outSqlParameters)
            {
                string value = keyValue[item.ParameterName];
            }
            return bln;
        }

        public DataTable GetUserByPage(int pageIndex, int pageSize,out int totalCount)
        {
            totalCount = 0;
            List<SqlParameter> sqlParameters= new List<SqlParameter>() 
            { 
                new SqlParameter("@pageIndex",pageIndex),
                new SqlParameter("@pageSize",pageSize)
            };

            List<SqlParameter> outSqlParameters = new List<SqlParameter>();
            SqlParameter parameter = new SqlParameter("@totalCount", SqlDbType.Int);
            parameter.Direction = ParameterDirection.Output;
            outSqlParameters.Add(parameter);

            Dictionary<string, string> keyValue;
            DataTable dt = systemDal.ExecProcResult("p_selectbypage2", sqlParameters, outSqlParameters, out keyValue);

            if (keyValue.Keys.Contains("@totalCount"))
            {
                totalCount = int.Parse(keyValue["@totalCount"]);
            }

            return dt;
        }

        public bool UpdateUser(string cname,string userId)
        {
            return systemDal.UpdateUser(cname,userId);
        }

        public bool DeleteUser(string userId)
        {
            return systemDal.DeleteUser(userId);
        }
    }
}

 

标签:存储,exec,--,SQL,博客,new,相关,proc,sqlCommand
From: https://www.cnblogs.com/xjxue/p/17642044.html

相关文章

  • df_sql_str
    #!/usr/bin/envpython#-*-encoding:utf-8-*-importpandasaspdimportnumpyasnp#生成一个dfdates=pd.date_range('20210913',periods=6)df=pd.DataFrame(np.random.randn(6,4),index=dates,columns=list('ABCD'))print(df)#定义df输入源,以及目标......
  • mybatis设置命名格式转换 与 批量插入更新&select查询返回自定义实体类 的sql写法
    在mybatis的配置文件中设置了Java实体类驼峰命名与表属性下划线命名的自动转换。在mybatis中,从接口获取到大量数据之后,将数据集合分批量插入更新到表中。在mybatis中,select查询表数据,返回数据的存储类型为自定义的实体类。1.设置Java实体类驼峰命名与表属性下划线......
  • MySQL基本SQL语句1(DDL)
    前言SQL(StructuredQueryLanguage)结构化查询语言,用于存取,查询,更新数据以及管理关系型数据库系统SQL指令分为四类DDL        DataDefintionlanguage数据库定义语言                用于完成对数据库对象(数据表,数据库,视图,索引)的创建,删除,修改DML......
  • MySQL基本SQL语句1(DDL)
    前言SQL(StructuredQueryLanguage)结构化查询语言,用于存取,查询,更新数据以及管理关系型数据库系统SQL指令分为四类DDL        DataDefintionlanguage数据库定义语言                用于完成对数据库对象(数据表,数据库,视图,索引)的创建,删除,修改DML......
  • SQL注入基础学习
    SQL注入基础一、sql注入的基本知识Ⅰ、sql注入原理通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。通常未经检查或者未经充分检查的用户输入数据或代码编写问题,意外变成了代码被执行。产生漏洞的条件:参数用户可控参......
  • 记一次MySQL数据库被黑
    情况概述偶然获得了一台云服务器,并在上面使用Docker搭建了MySQL数据库,想着将平时做Demo用到的数据转过去,结果一直犯懒没弄.今天在登陆时发现数据库被黑了.使用showdatabases命令后看到一个名为README_TO_RECOVER_A的库,库中有张表,表的内容为:Allyourdataisbacke......
  • 【24.0】支付相关
    【一】支付课程功能购买课程,付款在购买课程时,用户可以选择不同的支付方式进行付款,如支付宝支付、微信支付或者银联支付。支付宝支付(即便没有账号,也可以测试)支付宝支付是一种方便快捷的支付方式,用户可以使用支付宝账号或者通过扫描二维码等方式完成支付。对于没有支付......
  • 【25.0】路飞支付相关
    【一】订单相关表设计Order订单表OrderDetail订单详情表fromdjango.dbimportmodelsfromluffyCity.apps.course.modelsimportCoursefromluffyCity.apps.user.modelsimportUser#Order订单表classOrder(models.Model):"""订单模型"""......
  • pip相关介绍
    #pip的基础使用介绍众所周知,pip可以对python的第三方库进行安装、更新、卸载等操作,十分方便。pip的全称:packageinstallerforpython,也就是Python包管理工具。Python有成千上万的宝藏库,这些库相当于是已经集成好的工具,只要安装就能在Python里使用。它们可以处理各式各样的问题,......
  • 【5.0】路飞项目之数据库相关
    【一】软件开发模式【1】BBSBBS(BulletinBoardSystem)是一种基于电子信息交流的系统,通常用于在线讨论和发布信息。BBS使用了瀑布开发模式。瀑布开发模式是一种线性的软件开发过程,按照固定的顺序依次完成需求分析、系统设计、编码、测试和运维等阶段。在这个开发模式中,软......