SQL Server 存储过程使用 视图 Dapper EF DbHelperSQL

存储过程 
Entity Framework Core 原始 SQL 查询
EF Core 视图
Dapper 存储过程
EF 存储过程

● 存储过程 Procedure 是一组为了完成特定功能的 SQL 语句集合,经编译后存储在数据库中,一次编译后永久有效,用户通过指定存储过程的名称并给出参数来执行。
● 存储过程中可以包含逻辑控制语句和数据操纵语句,它可以接受参数、输出参数、返回单个或多个结果集以及返回值。

【存储过程-proc_user_select】动态添加 where 条件,分页,output【存储过程】

CREATE PROCEDURE [dbo].[proc_user_select]
  --@department_code int,
  @equipment_code int,
  @start_time datetime,
  @end_time datetime,
  --@page int=1,
  --@per_page int,
  --@order nvarchar(200),
  @total int output,
  @page_count int output,
  @msg nvarchar(60) output
AS
BEGIN
    declare @sqlString1 nvarchar(666)
	declare @sqlString2 nvarchar(666)
	declare @sqlString3 nvarchar(666)
	declare @sqlWhere nvarchar(666) = N''
	declare @sql_total_string nvarchar(666) = N''
	declare @user_name nvarchar(500) = 'a'
	declare @page int = 2
    declare @per_page int =10
	declare @order nvarchar(666) = 'user_code'
	declare @skip int

	set @skip =  (case when @page-1 <= 0 then 0 else @page-1 end) * @per_page

	if (@order = '')
        begin
			set @order = 'user_code'       
        end
    if (@user_name ! = '')
        begin
			set @sqlWhere = @sqlWhere + 'and user_name like ''%'+ @user_name +'%'' '       
        end
	if (@start_time is not null and @end_time is not null)
		begin
            set @sqlWhere += 'and created_time between ''' + convert(nvarchar(10),@start_time,23) +''' and ''' +  convert(nvarchar(10),dateadd(day,1,@end_time),120) + ''' '
		end

	set @sqlString1 = 'select * from sys_user where 1=1 '+ @sqlWhere +' ';
	set @sqlString2 = N'select row_number() over (order by '+ @order +') as RowNumber,* from sys_user where 1=1 '+ @sqlWhere +' ';
	set @sqlString3 = N'select top '+ convert(nvarchar(10),@per_page) +' * from (select row_number() over(order by '+ @order +' desc) AS RowNumber,* from sys_user where 1=1 '+ @sqlWhere +') record where RowNumber > '+ convert(nvarchar(10),@skip) +''

	set @sql_total_string = N'select @total = count(*) from sys_user where 1=1 '+ @sqlWhere

	print @sqlString1
	print @sqlString2
	print @sqlString3

	exec sp_executesql @sql_total_string,N'@total int out',@total output
	set @page_count = ceiling(@total*1.0/@per_page)

	exec(@sqlString3)
END
GO

【存储过程-proc_department_select】动态添加 where 条件,分页,排序,统计总条数,统计总页数,output【存储过程】

CREATE PROCEDURE [dbo].[proc_department_select]
  @department_code int,
  @department_name nvarchar(200),
  @page int,
  @per_page int,
  @order nvarchar(200),
  @total int output,
  @page_count int output
AS
BEGIN
	declare @sql_string nvarchar(2000)
	declare @sql_total_string nvarchar(2000) 
	declare @sql_where nvarchar(2000) = N''	
	declare @skip int
	set @skip = (case when @page-1 <= 0 then 0 else @page-1 end) * @per_page

    if (@order = '')
        begin
			set @order = 'department_code'       
        end   
	if(@department_code > 0)
		begin
			set @sql_where += 'and department_code =' + @department_code
		end

	set @sql_total_string = N'select @total = count(*) from sys_department where 1=1 '+ @sql_where
	set @sql_string = N'select top '+ convert(nvarchar(10),@per_page) +' * from (select row_number() over(order by '+ @order +' desc) AS RowNumber,* from sys_department where 1=1 '+ @sql_where +') record where RowNumber > '+ convert(nvarchar(10),@skip) +''

	exec sp_executesql @sql_total_string,N'@total int out',@total output
    set @page_count = ceiling(@total * 1.0 / @per_page)
	exec(@sql_string)
END

【存储过程-proc_statistics_workload】参数允许为空,动态添加 where 条件,分页,排序,统计总条数,统计总页数,offset/fetch next,output【存储过程】

CREATE PROCEDURE [dbo].[proc_statistics_workload]
  @department_code nvarchar(20) = null,
  @department_name nvarchar(200) = null,
  @user_code nvarchar(20) = null,
  @user_name nvarchar(20) = null,
  @start_time datetime = null,
  @end_time datetime = null,
  @page int = 1,
  @per_page int,
  @total int output,
  @page_count int output
AS
BEGIN
	declare @sql_string nvarchar(2000)
	declare @sql_total_string nvarchar(2000) 
	declare @sql_where nvarchar(500) = N''
	declare @sql_where_user nvarchar(500) = N''

	declare @skip int
	set @skip = (case when @page-1 <= 0 then 0 else @page-1 end) * @per_page

	if(@department_code<>'0')
		begin
			set @sql_where_user += 'and u.DEPARTMENTID ''%' + @department_code + '%'' '
		end
    if(@department_name <> '')
		begin
			set @sql_where_user += 'and u.DEPARTMENT_NAME like ''%' + @department_name + '%'' '
		end
	if (@user_code <> '')
        begin
			set @sql_where_user += 'and u.ACCOUNT like ''%' + @user_code + '%'' '       
        end
	if (@user_name <> '')
        begin
			set @sql_where_user += 'and u.REALNAME like ''%' + @user_name + '%'' '       
        end
	if(@start_time is not null and @end_time is not null)
		begin
			set @sql_where += 'and CREATE_DATE between ''' + convert(nvarchar(10),@start_time,23) +''' and ''' +  convert(nvarchar(10),dateadd(day,1,@end_time),23) + ''' '
		end

	set @sql_string = N'
	select t.total,t.DOCTOR_ID as doctor_id,u.REALNAME as real_name,u.DEPARTMENT_NAME as department_name 
    from (select count(*) total,DOCTOR_ID from ORG_PATIENT where 1=1 '+ @sql_where +' group by DOCTOR_ID) t
    left join SYS_USER u on u.ACCOUNT = t.DOCTOR_ID
	where 1=1 '+ @sql_where_user +'
    order by CREATE_TIME desc
    offset '+ convert(nvarchar(10),@skip) +' rows 
    fetch next '+ convert(nvarchar(10),@per_page) +' rows only'

	set @sql_total_string = N'select @total = count(*) from ('+ @sql_string +') t1'

	print @sql_total_string
	print @sql_string

    exec sp_executesql @sql_total_string,N'@total int out',@total output
	set @page_count = ceiling(@total * 1.0 / @per_page)
	exec(@sql_string)
END
GO

【Dapper】动态添加 where 条件,分页,排序,统计总条数,统计总页数,output【Dapper】

public PageResult<List<DepartmentDto>> GetProcPageList(string name, PageDto page)
{
    int pageCount = 0;
    int total = 0;

    PageResult<List<DepartmentDto>> result = null;
    List<DepartmentDto> list = new List<DepartmentDto>();
    #region 存储过程
    DynamicParameters paraDept = new DynamicParameters();
    paraDept.Add("@department_code", 0);
    paraDept.Add("@department_name", "");
    paraDept.Add("@page", page.page);
    paraDept.Add("@per_page", page.per_page);
    paraDept.Add("@order", "");
    paraDept.Add("@total", 0, DbType.Int32, ParameterDirection.Output);
    paraDept.Add("@page_count", 0, DbType.Int32, ParameterDirection.Output);
    list = _conn.Query<DepartmentDto>(ConfigManager.Configuration["DbSql:Department:ProcSelectPage"], paraDept, commandType: CommandType.StoredProcedure).ToList();

    pageCount = paraDept.Get<int>("@page_count");
    total = paraDept.Get<int>("@total");

    #endregion
    result = new PageResult<List<DepartmentDto>>(list, total, pageCount);
    return result;
}

动态添加 where 条件,分页,排序,统计总条数,统计总页数,output【appsettings.json】

"DbSql": {
  "DbType": "SqlServer",
  "SqlServerConnection": "Server=.;Database=dbTest;User ID=sa;Password=000000;",
  "Department": {
    "ProcSelectPage": "proc_department_select"
  }
}

无参数,output【存储过程】

CREATE PROCEDURE proc_User_select
  @page_count int output,
  @total int output
AS
BEGIN
    declare @SqlString nvarchar(2000) 
	declare @sqlWhere nvarchar(500)

    SELECT * from sys_user
END
GO
--执行存储过程SQL语句
execute proc_User_select 
exec proc_User_select 
GO

有参数,output【存储过程】

CREATE PROCEDURE proc_NurseOnDuty_Select
    @start datetime,
    @end datetime,
    @departmentCode int,
    @page_count int output,
    @total int output
AS
BEGIN
    declare @SqlString nvarchar(2000) 
	declare @sqlWhere nvarchar(500)

    SELECT * from sys_user
END
GO

--执行存储过程SQL语句
execute proc_NurseOnDuty_Select @start = N'2020-02-10', @end = N'2020-02-20', @departmentCode = 1
exec proc_NurseOnDuty_Select @start = N'2020-02-10', @end = N'2020-02-20', @departmentCode = 1

有返回值,@@IDENTITY,SCOPE_IDENTITY()【insert - 存储过程】

CREATE PROCEDURE proc_VerifyCode_insert
    @verify_code int output
AS
BEGIN
    INSERT INTO sys_verify_code
    (verify_type,code,phone,user_code,modify_code,modify_name,modify_time,[status])
    VALUES
    (1,'123456','123',1,1,'123','2020-02-02',1)

    select @verify_code = @@IDENTITY;
    --set @verify_code = @@IDENTITY;
    --return SCOPE_IDENTITY(); --作用域不同
    --return @@IDENTITY;       --作用域不同
END
GO

execute proc_VerifyCode_insert 
exec proc_VerifyCode_insert 
GO

删除 - 存储过程(输出参数,output)

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER PROCEDURE [dbo].[proc_menu_delete]
    @menu_code int,
    @code int output,
    @msg nvarchar(20) output
AS
BEGIN
	declare @count int
	set @count = (select count(*) from sys_menu where parent_code = @menu_code)

	if(@count <= 0)
		begin
		    delete from sys_menu where menu_code=@menu_code
		    set @code = 1
		    set @msg = '成功'
		end
	else
		begin
		    set @code = 2
		    set @msg = '失败'
		end
	END

删除 - 执行存储过程

DECLARE	@return_value int, 
        @code int, 
        @msg nvarchar(20)

EXEC @return_value = proc_menu_delete @menu_code = 1, @code = @code OUTPUT, @msg = @msg OUTPUT

SELECT	@code as N'@code', @msg as N'@msg'

SELECT	'Return Value' = @return_value

删除 - dapper

public int DeleteMenu(int id)
{
    var parameters = new DynamicParameters();
    parameters.Add("@menu_code", id);
    parameters.Add("@code", 0, DbType.Int32, ParameterDirection.Output);
    parameters.Add("@msg", "", DbType.String, ParameterDirection.Output);
    int result = _conn.Execute("proc_menu_delete", parameters, commandType: CommandType.StoredProcedure);
    int code = parameters.Get<int>("@code");
    string name = parameters.Get<string>("@msg");
    return result;
}

Dapper调用存储过程
Dapper 基本使用

private void Exec()
{
    ///执行 insert 存储过程
    var insert = _conn.Execute("proc_NurseOnDuty_Select",
        new
        {
            start = "2020-02-10",
            end = "2020-02-11",
            departmentCode = 1
        }, commandType: CommandType.StoredProcedure);


    ///执行 insert 存储过程 ReturnValue
    DynamicParameters para = new DynamicParameters();
    para.Add("@start", "2020-02-10");
    para.Add("@end", "2020-02-11");
    para.Add("@id", 0, DbType.Int32, ParameterDirection.ReturnValue);
    para.Add("@id", "", DbType.String, ParameterDirection.ReturnValue);
    para.Add("@id", null, DbType.Int32, ParameterDirection.ReturnValue);
    para.Add("@id", null, DbType.String, ParameterDirection.ReturnValue);

    var insert = _conn.Execute("proc_NurseOnDuty_Select", para, commandType: CommandType.StoredProcedure);


    ///执行 查询 存储过程
    var userList = _conn.Query<sys_role>("proc_role_select",
        new
        {
            start = "2020-02-10",
            end = "2020-02-11",
            departmentCode = 1
        }, commandType: CommandType.StoredProcedure).ToList();

    var result = _conn.Query<object>("proc_NurseOnDuty_Select",
        new
        {
            start = "2020-02-10",
            end = "2020-02-11",
            departmentCode = 1
        }, commandType: CommandType.StoredProcedure).ToList();
}

EF 存储过程
1、FromSql:结果不能有关联关系数据。相当于不能 join ,也返回不了 join 的关联表的数据。
2、FromSqlInterpolated
3、ExecuteSqlRaw
4、ExecuteSqlInterpolated
5、ExecuteSqlCommand:执行插入、更新跟删除的存储过程不能直接映射到实体【弃用的】。
6、出参【ParameterDirection.Output】
7、SqlQuery

传参方式【Output出参】

 public async Task<ArrayList> GetSevenDays()
 {
   #region 参数
   List<DbParameter> param = new List<DbParameter>();
   param.Add(new SqlParameter("@HosId", ""));
   #endregion

   #region 参数
   SqlParameter[] parameters = new SqlParameter[1];
   SqlParameter paramIn = new SqlParameter("currentDate", "");
   #endregion

   #region FromSqlRaw Sql语句
   var model = Context.User.FromSqlRaw("select * from sys_user where @Id = 1").SingleOrDefault();
   var data = Context.User.FromSqlRaw("select * from sys_user where code = 'ql'").AsNoTracking().FirstOrDefault();
   #endregion

   #region FromSqlRaw 存储过程 参数
   var list = Context.User.FromSqlRaw("exec proc_age_select @Id = 1").ToList();
   var a = Context.SequenceResult.FromSqlRaw("exec [dbo].[proc_user_select] @count=1,@code=QL").AsNoTracking().ToList();        
   var b = Context.SequenceResult.FromSqlRaw("exec [dbo].[proc_user_select] @count=1,@code=QL").AsEnumerable().FirstOrDefault();
   var c = Context.User.FromSqlRaw("exec [dbo].[proc_select]").ToList();
   
   var code = new SqlParameter("code", "QL");
   var count1 = new SqlParameter("count", 1);
   var e = Context.SequenceResult.FromSqlRaw("exec [dbo].[proc_sequence_select] @count,@code", count1, code).AsEnumerable().FirstOrDefault();
        
   SqlParameter[] para = new SqlParameter[] {
     new SqlParameter("count",1),
     new SqlParameter("code","QL")
   };
   var f = Context.SequenceResult.FromSqlRaw("exec [dbo].[proc_sequence_select] @count,@code", para).AsEnumerable().FirstOrDefault();
        
   #endregion

   #region FromSqlInterpolated
   var d = Context.User.FromSqlInterpolated("SELECT * FROM sys_user").ToList();
   #endregion

   #region ExecuteSqlInterpolated
   Context.Database.ExecuteSqlInterpolated("select * from sys_user");
   #endregion

   #region ExecuteSqlRaw
   Context.Database.ExecuteSqlRaw("select * from sys_user");
   Context.Database.ExecuteSqlRaw("select * from sys_user where name=@name and id=@id", new[]
   {
     new SqlParameter("name", "tom1"),
     new SqlParameter("id", 1),
   });
   Context.Database.ExecuteSqlRawAsync("exec SP_RRE_POST_HOSPITAL_RECORES");
   #endregion

   #region ExecuteSqlCommand
   SqlParameter[] para = new SqlParameter[] {
     new SqlParameter("@ID","")
   };
   Context.Database.ExecuteSqlCommand("delete sys_user where id=@ID", para);

   Context.Database.ExecuteSqlCommand("sp_user_deleteByID @ID", para);
   #endregion

   #region ExecuteSqlCommand
   SqlParameter pp_name = new SqlParameter("@Name", "");
   SqlParameter pp_phone = new SqlParameter("@Phone", "");
   Context.Database.ExecuteSqlCommand("exec [proc_AddSysUser01] @Name,@Phone", pp_name, pp_phone);

   Context.Database.ExecuteSqlCommand($"update sys_user set name=@name where id=@id", new[]
   {
     new SqlParameter("name", "tom1"),
     new SqlParameter("id", 1),
   });
   #endregion

   #region ExecuteSqlCommand
   var name = "C# 高级进阶";
   var author = "-";
   var cateid = 1;
   Context.Database.ExecuteSqlCommand("proc_createbook @p0,@p1,@p2", name, author, cateid);
   #endregion

   #region 自定义方法执行存储过程
   string userId = "123";
   SqlParameter[] sqlParameters =
   {
     new SqlParameter("@UserId", System.Data.SqlDbType.VarChar),
     new SqlParameter("@total", SqlDbType.Int,4),
     new SqlParameter("@per_page", SqlDbType.Int)
   };

   if (string.IsNullOrEmpty(userId))
     sqlParameters[0].Value = DBNull.Value; 
   else
     sqlParameters[0].Value = userId; 

   sqlParameters[1].Direction = ParameterDirection.Output;
   sqlParameters[2].Direction = ParameterDirection.Output;

   int total = Convert.ToInt32(sqlParameters[1].Value);
   int pageCount = Convert.ToInt32(sqlParameters[2].Value);

   await DbHelperSQL.ExecSpAsync(Context, "proc_seven_days_select", sqlParameters);
   #endregion

   #region 自定义方法执行存储过程【出参】
   List<DbParameter> param = new List<DbParameter>();
   param.Add(new SqlParameter("@department_code", request.department_code));
   param.Add(new SqlParameter("@department_name", request.department_name));
   param.Add(new SqlParameter("@user_code", request.user_code));
   param.Add(new SqlParameter("@user_name", request.user_name));
   param.Add(new SqlParameter("@start_time", request.start_time));
   param.Add(new SqlParameter("@end_time", request.end_time));
   param.Add(new SqlParameter("@page", request.page));
   param.Add(new SqlParameter("@per_page", request.limit));
   
   SqlParameter paramTotal = new SqlParameter("@total", SqlDbType.Int);
   paramTotal.Direction = ParameterDirection.Output;
   SqlParameter paramPageCount = new SqlParameter("@page_count", SqlDbType.Int);
   paramPageCount.Direction = ParameterDirection.Output;

   param.Add(paramTotal);
   param.Add(paramPageCount);
   var resultExpression = DbHelperSQL.ExecSpAsync(Context,"proc_statistics_workload", param.ToArray());

   //根据List<DbParameter> param集合数量,从0开始计数
   int total = Convert.ToInt32(param[8].Value);
   int pageCount = Convert.ToInt32(param[9].Value);
   #endregion

   #region
   dbContext.Database.SqlQuery<CarExpendSettlementByIncomeOutPut>($"{sql}");
   #endregion

   return await DbHelperSQL.ExecSpAsync(Context, "proc_seven_days_select", null);
 }

ExtendDbContext.cs

using Microsoft.Data.SqlClient;
using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.Common;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Text;

namespace Nuclein.Repository
{
  public static class ExtendDbContext
  {
    /// <summary>
    /// 执行SQL返回受影响的行数
    /// </summary>
    public static int ExecSqlNoQuery<T>(this NucleinDbContext db, string sql, SqlParameter[] sqlParams = null) where T : new()
    {
      return ExecuteNoQuery<T>(db, sql, sqlParams);
    }
    /// <summary>
    /// 执行存储过程返回IEnumerable数据集
    /// </summary>
    public static IEnumerable<T> ExecProcReader<T>(this NucleinDbContext db, string sql, SqlParameter[] sqlParams = null) where T : new()
    {
      return Execute<T>(db, sql, CommandType.StoredProcedure, sqlParams);
    }
    /// <summary>
    /// 执行sql返回IEnumerable数据集
    /// </summary>
    public static IEnumerable<T> ExecSqlReader<T>(this NucleinDbContext db, string sql, SqlParameter[] sqlParams = null) where T : new()
    {
      return Execute<T>(db, sql, CommandType.Text, sqlParams);
    }
    private static int ExecuteNoQuery<T>(this NucleinDbContext db, string sql, SqlParameter[] sqlParams) where T : new()
    {
      DbConnection connection = db.Database.GetDbConnection();
      DbCommand cmd = connection.CreateCommand();
      int result = 0;
      db.Database.OpenConnection();
      cmd.CommandText = sql;
      cmd.CommandType = CommandType.Text;
      if (sqlParams != null)
      {
        cmd.Parameters.AddRange(sqlParams);
      }
      result = cmd.ExecuteNonQuery();
      db.Database.CloseConnection();
      return result;
    }
    private static IEnumerable<T> Execute<T>(this NucleinDbContext db, string sql, CommandType type, SqlParameter[] sqlParams) where T : new()
    {
      DbConnection connection = db.Database.GetDbConnection();
      DbCommand cmd = connection.CreateCommand();
      db.Database.OpenConnection();
      cmd.CommandText = sql;
      cmd.CommandType = type;
      if (sqlParams != null)
      {
        cmd.Parameters.AddRange(sqlParams);
      }
      DataTable dt = new DataTable();
      using (DbDataReader reader = cmd.ExecuteReader())
      {
        dt.Load(reader);
      }
      db.Database.CloseConnection();
      return dt.ToCollection<T>();
    }

    public static async IAsyncEnumerable<string> ReadAllLines(string file)
    {
      using (var fs = File.OpenRead(file))
      {
        using (var sr = new StreamReader(fs))
        {
          while (true)
          {
            string line = await sr.ReadLineAsync();
            if (line == null)
            {
              break;
            }
            yield return line;
          }
        }
      }
    }
  }
}

public static class ExtendDataTable
{
  public static DataTable ToDataTable<T>(this IEnumerable<T> data)
  {
    PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(typeof(T));
    var table = new DataTable();
    foreach (PropertyDescriptor prop in properties)
      table.Columns.Add(prop.Name, Nullable.GetUnderlyingType(prop.PropertyType) ?? prop.PropertyType);
    foreach (T item in data)
    {
      DataRow row = table.NewRow();
      foreach (PropertyDescriptor prop in properties)
        row[prop.Name] = prop.GetValue(item) ?? DBNull.Value;
      table.Rows.Add(row);
    }
    return table;
  }

  public static T ToEntity<T>(this DataTable dt) where T : new()
  {
    IEnumerable<T> entities = dt.ToCollection<T>();
    return entities.FirstOrDefault();
  }

  public static IEnumerable<T> ToCollection<T>(this DataTable dt) where T : new()
  {
    if (dt == null || dt.Rows.Count == 0)
    {
      return Enumerable.Empty<T>();
    }
    IList<T> ts = new List<T>();
    // 获得此模型的类型 
    Type type = typeof(T);
    string tempName = string.Empty;
    foreach (DataRow dr in dt.Rows)
    {
      T t = new T();
      PropertyInfo[] propertys = t.GetType().GetProperties();
      foreach (PropertyInfo pi in propertys)
      {
        tempName = pi.Name;
        //检查DataTable是否包含此列(列名==对象的属性名)     
        if (dt.Columns.Contains(tempName))
        {
          // 判断此属性是否有Setter   
          if (!pi.CanWrite) continue;//该属性不可写,直接跳出   
          object value = dr[tempName];
          if (value != DBNull.Value)
            pi.SetValue(t, value, null);
        }
      }
      ts.Add(t);
    }
    return ts;
  }
}

DbHelperSQL.cs

using Microsoft.Data.SqlClient;
using Microsoft.EntityFrameworkCore;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Data.Common;
using System.Text;
using System.Threading.Tasks;

namespace Nuclein.Repository
{
  public static class DbHelperSQL
  {
    /// <summary>
    /// 查询
    /// </summary>
    /// <returns></returns>
    public async static Task<ArrayList> ExecSpAsync(this NucleinDbContext db, string sql, SqlParameter[] sqlParams)
    {
      var connection = db.Database.GetDbConnection();
      using (var cmd = connection.CreateCommand())
      {
        await db.Database.OpenConnectionAsync();
        cmd.CommandText = sql;
        cmd.CommandType = System.Data.CommandType.StoredProcedure;
        if(sqlParams!=null)
          cmd.Parameters.AddRange(sqlParams);
        var dr = await cmd.ExecuteReaderAsync();
        var columnSchema = dr.GetColumnSchema();
        var data = new ArrayList();
        while (await dr.ReadAsync())
        {
          var item = new Dictionary<string, object>();
          foreach (var kv in columnSchema)
          {
            if (kv.ColumnOrdinal.HasValue)
            {
              var itemVal = dr.GetValue(kv.ColumnOrdinal.Value);
              item.Add(kv.ColumnName, itemVal.GetType() != typeof(DBNull) ? itemVal : "");
            }
          }
          data.Add(item);
        }
        dr.Dispose();
        return data;
      }
    }

    /// <summary>
    /// 增删改
    /// </summary>
    /// <returns></returns>
    public async static Task<int> ExecuteNonQueryAsync(this NucleinDbContext db, string sql, SqlParameter[] sqlParams)
    {
      int numint;
      var connection = db.Database.GetDbConnection();
      using (var cmd = connection.CreateCommand())
      {
        await db.Database.OpenConnectionAsync();
        cmd.CommandText = sql;
        cmd.CommandType = System.Data.CommandType.StoredProcedure;
        cmd.Parameters.AddRange(sqlParams);
        numint = await cmd.ExecuteNonQueryAsync();
      }
      return numint;
    }
  }
}

*
*
*
*
*

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 药库管理系统是一种用于管理药品库存、采购、销售和监管的软件系统。在此系统中,结合了SQL Server 2012、Dapper、ASP.NET和Vue这些技术,可以实现一个高效、稳定和方便管理药库的系统。 首先,SQL Server 2012是一种强大的关系型数据库管理系统,可以存储和管理大量的数据。在药库管理系统中,可以使用SQL Server存储药品的基本信息、库存信息、采购记录和销售记录等。 其次,Dapper是一个轻量级的ORM(对象关系映射)框架,可以方便地将数据库中的数据映射到.NET对象中,或者将.NET对象持久化到数据库中。在药库管理系统中,可以使用Dapper来实现对数据库的连接、查询、插入、更新和删除等操作,提高了数据的访问效率。 再次,ASP.NET是一种用于构建Web应用程序的框架,可以实现药库管理系统的前端部分。通过ASP.NET,可以实现用户登录、权限管理、药品信息的展示和编辑等功能。同时,可以利用ASP.NET的强大特性和丰富的控件库,实现用户友好的界面和交互。 最后,Vue是一种用于构建用户界面的JavaScript框架,可以实现药库管理系统的前端展示和交互逻辑。通过Vue,可以将应用程序的各个组件拆分为多个可重用的模块,实现良好的代码管理和可维护性。使用Vue的前端框架,可以实现丰富的用户界面效果和响应式设计,提升用户体验。 综上所述,结合SQL Server 2012、Dapper、ASP.NET和Vue这些技术,可以实现一个功能完善、性能高效的药库管理系统。用户可以通过Web界面进行药品信息的查询、采购、销售和监管等操作,提高了药库管理的效率和精确性。 ### 回答2: 药库管理系统是一个涉及到药品采购、入库、出库、销售等流程的系统,综合使用SQL Server 2012、Dapper、ASP.NET和Vue等技术进行开发。 首先,SQL Server 2012作为关系型数据库,为系统提供数据存储和管理功能。通过SQL Server 2012,可以创建药品、供应商、员工等相关数据表,并在表中存储各种信息。同时,SQL Server 2012还支持事务处理和数据备份等功能,可保证系统在出现异常情况时的数据完整性和可靠性。 其次,Dapper是.NET平台下轻量级的ORM框架,用于实现对象关系映射。在药库管理系统中,Dapper可以轻松地将SQL Server 2012中的数据表与.NET对象进行映射,实现数据的快速访问和操作。通过Dapper的简洁语法,可以方便地进行数据库的查询、新增、修改和删除等操作,提高了开发效率。 再次,ASP.NET作为一种基于.NET平台的Web应用程序开发框架,为药库管理系统提供了强大的后端支持。通过ASP.NET,我们可以依托其强大的生态系统和丰富的控件库,快速搭建一个易于维护和扩展的Web应用程序。ASP.NET还提供了良好的安全性和性能优化特性,能够保护系统的安全和提升用户体验。 最后,Vue作为一种流行的前端JavaScript框架,为药库管理系统提供了丰富的用户界面交互功能。通过Vue的组件化开发模式和响应式数据绑定机制,可以方便地构建出具有良好用户体验的界面。同时,Vue还具备虚拟DOM和自动化构建等特性,能够提高系统的性能和开发效率。 综上所述,药库管理系统通过综合使用SQL Server 2012、Dapper、ASP.NET和Vue等技术,实现了数据存储与管理、对象关系映射、强大的后端支持以及用户界面的交互功能,为药库的管理提供了便利。 ### 回答3: 药库管理系统是一个用于管理药品库存、药品销售和供应链管理的软件系统。SQL Server 2012是一个用于存储和管理系统数据的关系型数据库管理系统(RDBMS)。Dapper是一个简单易用的对象关系映射工具,可以将数据库查询结果映射为.NET对象,方便在ASP.NET中进行数据访问操作。而ASP.NET是一种用于构建Web应用程序的开发框架,它提供了丰富的工具和组件来加速开发过程。Vue是一种流行的JavaScript框架,用于构建用户界面。 药库管理系统的实现中,可以使用ASP.NET作为后台开发框架,利用其强大的数据访问能力和安全性特性。可以使用Dapper作为ORM工具,简化数据操作过程,并提高性能。SQL Server 2012可以作为系统的数据库,用于存储药品信息、库存、销售记录等数据。借助SQL Server 2012的强大查询和事务处理功能,可以实现快速、可靠的数据操作。 在前端部分,可以使用Vue框架构建用户界面,利用Vue提供的组件化开发和数据双向绑定特性,实现良好的用户体验。可以使用Vue Router实现页面路由管理,使用Vuex进行状态管理,提高系统的可维护性和扩展性。 药库管理系统的功能可以包括:药品信息管理(包括添加、修改、删除药品信息)、库存管理(药品入库、出库、盘点等)、销售管理(药品销售、退货等)、供应链管理(药品采购、供应商管理)、报表统计等。 总之,结合SQL Server 2012、Dapper、ASP.NET和Vue等技术,可以实现一个功能完善、性能高效、易于维护和扩展的药库管理系统。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值