一、实现效果

.NET Core WebApi基础入门项目源码下载

二、SqlSugar数据操作框架介绍

SqlSugar是一款老牌 .NET 开源ORM框架,由果糖大数据科技团队维护和更新的国产操作数据库免费开源框架并且可以免费用于商用项目,永远免费

①SqlSugar官网           SqlSugar框架中文文档         SqlSugar 5.0中文参考文档

②优点: 简单易用、功能齐全、高性能、轻量级、服务齐全。

③支持数据库:MySql、SqlServer、Sqlite、Oracle 、 postgresql、达梦、人大金仓。

④性能:比大部分的DbHelper性能要高,底层采用Emit动态创建数据绑定程序集进行缓存,缓存后的性能可以达到原生水平,相反原始的ADO需要用到大量装箱和拆箱操作性能反而下降。

三、.NET Core WebApi实现数据库操作

3.1、数据库操作的整体逻辑框架

3.2、项目引入【SqlSugarCore】框架的Nuget包

3.3、实现数据库操作内容

3.3.1、配置数据库的连接字符串和获取

①打开项目的【appsettings.json】文件,添加对应的数据库连接字符串。

"ConnectionStrings": {"MySql": "server=数据库所在服务器的IP;userid=数据库账号;password=数据库密码;database=数据库名称;","SqlServer": "server=数据库所在服务器的IP;;uid=数据库账号;pwd=数据库密码;database=数据库名称","Oracle": "Data Source=数据库所在服务器的IP/服务名称;User ID=数据库账号;Password=数据库密码;"}

②获取配置好的数据库连接字符串

/***
*   Title:".NET Core WebApi" 项目
*       主题:程序配置帮助类
*   Description:
*       功能:
*           1、初始化配置参数
*           3、获取到不同类型的数据库的连接串
*   Date:2021
*   Version:0.1版本
*   Author:Coffee
*   Modify Recoder:
*/using Microsoft.Extensions.Configuration;
using System;
using System.Collections.Generic;
using System.Text;namespace WebApiUtils
{public class AppConfigHelper{#region   基础参数//程序配置private static IConfiguration _appConfig;//数据库连接串private static string _dbStrCon = string.Empty;#endregion#region   公有方法/// <summary>/// 初始化配置参数/// </summary>/// <param name="configuration">程序配置</param>public static void InitAppConfig(IConfiguration configuration){_appConfig = configuration;}/// <summary>/// 获取到不同类型的数据库的连接串/// </summary>/// <param name="dbType">数据库类型</param>/// <returns>返回当前数据库类型的连接串</returns>public static string GetDBStrCon(string dbType){string field = $"ConnectionStrings:{dbType}";return GetAppConfigContext(_dbStrCon, field);}#endregion#region   私有方法/// <summary>/// 获取到配置内容/// </summary>/// <param name="appConfigVar">程序配置变量</param>/// <param name="appConfigField">程序配置字段</param>/// <returns>返回当前数据库类型的连接串</returns>private static string GetAppConfigContext(string appConfigVar,string appConfigField){if (string.IsNullOrEmpty(appConfigVar)){appConfigVar = _appConfig[appConfigField];}return appConfigVar;}#endregion }//Class_end}

③在Startup类中获取程序配置

3.3.2、数据库的操作服务

①数据库操作基础上下文

/***
*   Title:".NET Core WebApi" 项目
*       主题:基础数据库操作的上下文
*   Description:
*       功能:
*           1、打开数据库连接
*           2、开启事务
*           3、提交事务
*           4、回滚事务
*   Date:2021
*   Version:0.1版本
*   Author:Coffee
*   Modify Recoder:
*/using SqlSugar;
using System;
using System.Collections.Generic;
using System.Text;namespace WebApiService.Common
{class BaseDbContext{#region   基础参数//SqlSugar客户端public SqlSugarClient db;#endregion#region   公有方法/// <summary>/// 构造函数/// </summary>/// <param name="conStr">数据库的连接字符串</param>/// <param name="dbType">数据库类型</param>public BaseDbContext(string conStr,DbType dbType){InitDataBase(conStr,dbType);}/// <summary>/// 构造函数/// </summary>/// <param name="serverIp">服务器IP</param>/// <param name="user">用户名称</param>/// <param name="password">密码</param>/// <param name="dataBase">数据库</param>/// <param name="dbType">数据库类型</param>public BaseDbContext(string serverIp,string user,string password,string dataBase,DbType dbType){string conStr = $"server={serverIp};user id={user};password={password};" +$"persistsecurityinfo=True;database={dataBase}";InitDataBase(conStr, dbType);}/// <summary>/// 开启事务/// </summary>public void BeginTransaction(){db.Ado.BeginTran();}/// <summary>/// 提交事务/// </summary>public void CommitTransaction(){db.Ado.CommitTran();}/// <summary>/// 回滚事务/// </summary>public void RollbackTransaction(){db.Ado.RollbackTran();}#endregion #region   私有方法/// <summary>/// 初始化数据库连接/// </summary>/// <param name="conStr">连接字符串</param>/// <param name="dbType">数据库类型</param>private void InitDataBase(string conStr, DbType dbType){db = new SqlSugarClient(new ConnectionConfig(){ConnectionString=conStr,DbType=dbType,IsAutoCloseConnection=true,});//超时时间(单位:秒)db.Ado.CommandTimeOut = 3000;//sql执行前可以修改sqldb.Aop.OnExecutingChangeSql = (sql,para) =>{return new KeyValuePair<string, SugarParameter[]>(sql,para);};//sql执行前事件db.Aop.OnLogExecuting = (sql, para) =>{//这里可查看执行的sql语句和参数};//sql执行完的事件db.Aop.OnLogExecuted = (sql,para) =>{//这里可查看执行的sql语句和参数};//sql执行错误事件db.Aop.OnError = (ex) =>{//这里可以查看sql执行错误信息};}#endregion }//Class_end}

②、通用的数据库基础sql语句接口

/***
*   Title:".NET Core WebApi" 项目
*       主题:数据库基础服务接口
*   Description:
*       功能:
*           1、分页查询集合
*           2、获取列表集合
*           3、获取对象
*           4、判断数据是否存在
*           5、新增
*           6、删除
*           7、修改
*   Date:2021
*   Version:0.1版本
*   Author:Coffee
*   Modify Recoder:
*/using SqlSugar;
using System;
using System.Collections.Generic;
using System.Text;
using WebApiUtils.Entity;namespace WebApiService.Common
{public interface IBaseDbService<T> : IDisposable{/// <summary>/// 分页查询集合/// </summary>/// <param name="pageIndex">当前页码</param>/// <param name="pageSize">当前页码大小</param>/// <param name="strField">查询后显示字段(每个字段间以逗号分割,显示全部字段则为null)</param>/// <param name="filter">查询条件</param>/// <param name="strOrder">排序规则</param>/// <param name="totalCount">数据总数</param>/// <returns>集合</returns>List<T> GetPageList(int pageIndex, int pageSize, string strField, SqlFilterEntity filter,string strOrder, out int totalCount);/// <summary>/// 获取列表集合/// </summary>/// <param name="strField">查询字段</param>/// <param name="filter">查询条件</param>/// <returns>数据集合</returns>List<T> GetList(string strField,SqlFilterEntity filter);/// <summary>/// 获取开始数据/// </summary>/// <param name="top">开始条数</param>/// <returns>数据集合</returns>List<T> GetStartList(int top=0);/// <summary>/// 获取对象/// </summary>/// <param name="strFields">查询字段串(每个字段间用逗号隔开,显示全部字段则为null)</param>/// <param name="filter">查询条件</param>/// <returns>对象</returns>T GetEntity(string strFields,SqlFilterEntity filter);/// <summary>/// 判断数据是否存在/// </summary>/// <param name="filter">查询条件</param>/// <returns>执行结果(true:表示存在)</returns>bool IsExists(SqlFilterEntity filter);/// <summary>/// 新增/// </summary>/// <param name="entity">实例对象</param>/// <param name="ignoreColumns">排除列</param>/// <param name="isLock">是否加锁</param>/// <returns>返回自增ID</returns>int Insert(T entity,List<string> ignoreColumns=null,bool isLock=false);/// <summary>/// 根据主键删除/// </summary>/// <param name="primaryKeyValue">主键值</param>/// <param name="isLock">是否加锁</param>/// <returns>执行结果(true:表示成功)</returns>bool Delete(object primaryKeyValue, bool isLock = false);/// <summary>/// 修改/// </summary>/// <param name="entity">实例对象</param>/// <param name="ignoreColumns">排除列</param>/// <param name="isLock">是否加锁</param>/// <returns>执行结果(true:表示成功)</returns>bool Update(T entity,List<string> ignoreColumns=null,bool isLock=false);}//Class_end}

③、数据库sql语句的过滤条件

/***
*   Title:".NET Core WebApi" 项目
*       主题:sql过滤实体(即:Where后的条件)
*   Description:
*       功能:
*           1、追加查询条件
*           2、添加查询参数
*   Date:2021
*   Version:0.1版本
*   Author:Coffee
*   Modify Recoder:
*/using System;
using System.Collections.Generic;
using System.Text;namespace WebApiUtils.Entity
{public class SqlFilterEntity{#region   基础参数//过滤条件private string _filter = string.Empty;//过滤参数字典private Dictionary<string, object> _value = null;#endregion#region   公有方法/// <summary>/// 查询条件/// </summary>public string Filter { get => _filter; set => _filter = value; }/// <summary>/// 查询参数/// </summary>public Dictionary<string, object> Value { get => _value; set => _value = value; }/// <summary>/// 追加查询条件/// </summary>/// <param name="filter">条件</param>/// <param name="relation">关系</param>public void Append(string filter,string relation="AND"){if (string.IsNullOrEmpty(filter)){return;}if (Filter.Length>0){Filter += relation;}Filter += filter;}/// <summary>/// 添加查询参数/// </summary>/// <param name="key">键</param>/// <param name="value">值</param>public void Add(string key,object value){if (string.IsNullOrEmpty(key) || value==null){return;}if (Value==null){Value = new Dictionary<string, object>();}DicAdd(Value,key,value);}#endregion#region   私有方法/// <summary>/// 给容器添加信息/// </summary>/// <param name="dic">容器</param>/// <param name="key">键</param>/// <param name="value">值</param>private void DicAdd(Dictionary<string,object> dic,string key,object value){if (dic==null || string.IsNullOrEmpty(key) || value==null){return;}if (dic.ContainsKey(key)){dic[key] = value;}else{dic.Add(key,value);}}#endregion }//Class_end}

④实现通用sql语句接口服务的类

/***
*   Title:".NET Core WebApi" 项目
*       主题:数据库基础服务
*   Description:
*       功能:
*           1、分页查询集合
*           2、获取列表集合
*           3、获取对象
*           4、判断数据是否存在
*           5、新增
*           6、根据主键删除
*           7、修改
*           8、释放资源
*   Date:2021
*   Version:0.1版本
*   Author:Coffee
*   Modify Recoder:
*/using SqlSugar;
using SqlSugar.Extensions;
using System;
using System.Collections.Generic;
using System.Text;
using WebApiUtils;
using WebApiUtils.Entity;namespace WebApiService.Common
{class BaseDbService<T> : IBaseDbService<T> where T : class, new(){#region   基础参数//数据库连接上下文private BaseDbContext baseDbContext;//数据库protected SqlSugarClient db;#endregion /// <summary>/// 构造函数/// </summary>/// <param name="dbType">数据库类型</param>public BaseDbService(DbType dbType){string conStr = AppConfigHelper.GetDBStrCon(dbType.ToString());baseDbContext = new BaseDbContext(conStr, dbType);db = baseDbContext.db;}/// <summary>/// 分页查询集合/// </summary>/// <param name="pageIndex">当前页码</param>/// <param name="pageSize">当前页码大小</param>/// <param name="strFields">查询后显示字段(每个字段间以逗号分割)</param>/// <param name="filter">查询条件</param>/// <param name="strOrder">排序规则</param>/// <param name="totalCount">数据总数</param>/// <returns>集合</returns>public List<T> GetPageList(int pageIndex, int pageSize, string strFields, SqlFilterEntity filter,string strOrder, out int totalCount){totalCount = 0;if (pageIndex<=0){pageIndex = 1;}if (pageSize<=0){//每页默认是10条pageIndex = 10;}if (string.IsNullOrEmpty(strFields)){strFields = "";}if (filter==null){filter = new SqlFilterEntity();}if (string.IsNullOrEmpty(strOrder)){strOrder = string.Format("ID DESC");}return db.Queryable<T>().With(SqlWith.NoLock).Select(strFields).WhereIF(!string.IsNullOrEmpty(filter.Filter), filter.Filter, filter.Value).OrderByIF(!string.IsNullOrEmpty(strOrder), strOrder).ToPageList(pageIndex, pageSize, ref totalCount);}/// <summary>/// 获取列表集合/// </summary>/// <param name="strField">查询字段</param>/// <param name="filter">查询条件</param>/// <returns>数据集合</returns>public List<T> GetList(string strField, SqlFilterEntity filter){if (string.IsNullOrEmpty(strField)){strField = "";}if (filter == null){filter = new SqlFilterEntity();}return db.Queryable<T>().With(SqlWith.NoLock).Select(strField).WhereIF(!string.IsNullOrEmpty(filter.Filter), filter.Filter, filter.Value).ToList();}/// <summary>/// 获取开始数据/// </summary>/// <param name="top">开始条数</param>/// <returns>数据集合</returns>public List<T> GetStartList(int top = 0){if (top > 0){return db.Queryable<T>().With(SqlWith.NoLock).Take(top).ToList();}else{return db.Queryable<T>().With(SqlWith.NoLock).ToList();}}/// <summary>/// 获取对象/// </summary>/// <param name="strFields">查询字段串(每个字段间用逗号隔开,显示全部字段则为null)</param>/// <param name="filter">查询条件</param>/// <returns>对象</returns>public T GetEntity(string strFields,SqlFilterEntity filter){if (filter != null){return db.Queryable<T>().With(SqlWith.NoLock).Select(strFields).WhereIF(!string.IsNullOrEmpty(filter.Filter), filter.Filter, filter.Value).First();}return default(T);}/// <summary>/// 判断数据是否存在/// </summary>/// <param name="filter">查询条件</param>/// <returns>执行结果(true:表示存在)</returns>public bool IsExists(SqlFilterEntity filter){var result = db.Queryable<T>().With(SqlWith.NoLock).WhereIF(!string.IsNullOrEmpty(filter.Filter), filter.Filter, filter.Value).Count();return result > 0;}/// <summary>/// 新增/// </summary>/// <param name="Entity">实例对象</param>/// <param name="ignoreColums">排除列</param>/// <param name="isLock">是否加锁</param>/// <returns>返回自增ID</returns>public int Insert(T entity, List<string> ignoreColumns = null, bool isLock = false){if (ignoreColumns == null){ignoreColumns = new List<string>();}var result = isLock ?db.Insertable(entity).With(SqlWith.UpdLock).IgnoreColumns(ignoreColumns.ToArray()).ExecuteReturnIdentity(): db.Insertable(entity).IgnoreColumns(ignoreColumns.ToArray()).ExecuteReturnIdentity();return result;}/// <summary>/// 根据主键删除/// </summary>/// <param name="primaryKeyValue">主键的值</param>/// <param name="isLock">是否加锁</param>/// <returns>执行结果(true:表示成功)</returns>public bool Delete(object primaryKeyValue, bool isLock = false){var result = isLock ?db.Deleteable<T>(primaryKeyValue).With(SqlWith.RowLock).ExecuteCommand() > 0: db.Deleteable<T>(primaryKeyValue).ExecuteCommand() > 0;return result;}/// <summary>/// 修改/// </summary>/// <param name="entity">实例对象</param>/// <param name="ignoreColumns">排除列</param>/// <param name="isLock">是否加锁</param>/// <returns>执行结果(true:表示成功)</returns>public bool Update(T entity, List<string> ignoreColumns = null, bool isLock = false){if (ignoreColumns == null){ignoreColumns = new List<string>();}var result = isLock ?db.Updateable(entity).With(SqlWith.UpdLock).IgnoreColumns(ignoreColumns.ToArray()).ExecuteCommand(): db.Updateable(entity).IgnoreColumns(ignoreColumns.ToArray()).ExecuteCommand();return result > 0;}/// <summary>/// 释放资源/// </summary>public void Dispose(){baseDbContext = null;db.Dispose();}}//Class_end}

3.3.3、具体的业务逻辑

①设计业务的数据库表

②创建业务表的实体类

其中创建好私有的字段属性后,可以选中所有的私有字段,然后同时按下【Ctrl+R+E】键即可一次性自动生成所有字段的公有属性内容。

关于创建的实体中,如果你的属性名称与表中的字段不一致,则需要标识出来,具体内容请参考:从零开始 - 实体配置 - 《SqlSugar 5.0 文档》

/***
*   Title:".NET Core WebApi" 项目
*       主题:学生实体类
*   Description:
*       功能:XXX
*   Date:2021
*   Version:0.1版本
*   Author:Coffee
*   Modify Recoder:
*/using SqlSugar;
using System;
using System.Collections.Generic;
using System.Text;namespace WebApiEntity
{[SugarTable("Test_Student")]    public class StudentEntity{private int _iD = 0;private string _name = string.Empty;private string _number = string.Empty;private int _age = 0;private int _sex = 0;private string _address = string.Empty;/// <summary>/// 主键/// </summary>[SugarColumn(IsPrimaryKey = true, IsIdentity = true)]public int ID { get => _iD; set => _iD = value; }/// <summary>/// 姓名/// </summary>public string Name { get => _name; set => _name = value; }/// <summary>/// 学号/// </summary>public string Number { get => _number; set => _number = value; }/// <summary>/// 年龄/// </summary>public int Age { get => _age; set => _age = value; }/// <summary>/// 性别/// </summary>public int Sex { get => _sex; set => _sex = value; }/// <summary>/// 家庭住址/// </summary>[SugarColumn(ColumnName = "Test_Address")]public string Address { get => _address; set => _address = value; }}//Class_end}

③创建业务的接口服务(方便业务扩展)

/***
*   Title:".NET Core WebApi" 项目
*       主题:学生服务接口
*   Description:
*       功能:
*
*   Date:2021
*   Version:0.1版本
*   Author:Coffee
*   Modify Recoder:
*/using System;
using System.Collections.Generic;
using System.Text;
using WebApiService.Common;
using WebApiEntity;namespace WebApiService.Interfaces
{public interface IStudentService : IBaseDbService<StudentEntity>{/// <summary>/// 测试/// </summary>void Test();}//Class_end}

④实现业务服务

/***
*   Title:".NET Core WebApi" 项目
*       主题:学生服务
*   Description:
*       功能:XXX
*   Date:2021
*   Version:0.1版本
*   Author:Coffee
*   Modify Recoder:
*/using SqlSugar;
using System;
using System.Collections.Generic;
using System.Text;
using WebApiEntity;
using WebApiService.Common;
using WebApiService.Interfaces;
using WebApiUtils;namespace WebApiService.Implements
{class StudentService : BaseDbService<StudentEntity>, IStudentService{/// <summary>/// 构造函数/// </summary>/// <param name="dbType">数据类类型</param>public StudentService(DbType dbType=DbType.SqlServer):base(dbType){}/// <summary>/// 测试/// </summary>public void Test(){LogHelper.Debug($"this is { this.GetType().Name} 测试");}}//Class_end}

⑤实现具体的业务逻辑内容

/***
*   Title:".NET Core WebApi" 项目
*       主题:测试学生服务【数据库操作】
*   Description:
*       功能:XXX
*   Date:2021
*   Version:0.1版本
*   Author:Coffee
*   Modify Recoder:
*/using Microsoft.AspNetCore.Mvc;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using WebApiEntity;
using WebApiService.Interfaces;
using WebApiUtils.Entity;namespace WebApi_Learn.Controllers.Test
{[Route("api/[controller]/[action]")][ApiController]public class Test_Db_StudentService{#region   私有方法//学生的接口服务private readonly IStudentService _studentService;#endregion#region   公有方法/// <summary>/// 构造函数/// </summary>/// <param name="studentService">学生服务接口</param>public Test_Db_StudentService(IStudentService studentService){this._studentService = studentService;}/// <summary>///  插入数据/// </summary>/// <param name="studentEntity">学生实体</param>/// <returns>返回当前学生的ID</returns>[HttpPost, Route("AddInfo")]public ActionResult<int> Insert(StudentEntity studentEntity){int id = _studentService.Insert(studentEntity);return id;}/// <summary>/// 修改数据/// </summary>/// <param name="studentEntity">学生实体</param>/// <returns>返回修改结果</returns>[HttpPost, Route("UpdateInfo")]public ActionResult<bool> Update(StudentEntity studentEntity){return _studentService.Update(studentEntity);}/// <summary>/// 删除数据(根据主键)/// </summary>/// <param name="id">主键</param>/// <returns></returns>[HttpGet]public ActionResult<bool> Delete(int id){return _studentService.Delete(id, true);      }/// <summary>/// 查询数据(单条数据)/// </summary>/// <param name="field">过滤字段</param>/// <param name="fieldValue">过滤字段对应的值</param>/// <returns></returns>[HttpGet]public ActionResult<StudentEntity> QuaryData(string field,int fieldValue){StudentEntity studentEntity = new StudentEntity();//显示字段string strFields = "Name,Age,Test_Address";//根据条件查询到数据SqlFilterEntity sqlFilterEntity = new SqlFilterEntity();sqlFilterEntity.Append($"{field}=@{field}");sqlFilterEntity.Add(field,fieldValue);studentEntity = _studentService.GetEntity(strFields, sqlFilterEntity);return studentEntity;}/// <summary>/// 查询数据(多条数据)/// </summary>/// <param name="field">字段</param>/// <param name="fieldValue">字段对应的值</param>/// <returns></returns>[HttpGet]public ActionResult<List<StudentEntity>> QuaryDatas(string field, string fieldValue){List<StudentEntity> studentEntityList = new List<StudentEntity>();//根据条件查询到数据SqlFilterEntity sqlFilterEntity = new SqlFilterEntity();sqlFilterEntity.Append($"{field}=@{field}");sqlFilterEntity.Add(field, fieldValue);studentEntityList= _studentService.GetList(null, sqlFilterEntity);return studentEntityList;}/// <summary>/// 获取开始数据/// </summary>/// <returns></returns>[HttpGet]public List<StudentEntity> GetStartDatas(){List<StudentEntity> studentEntities = new List<StudentEntity>();return _studentService.GetStartList(2);}/// <summary>/// 分页查看/// </summary>/// <param name="pageIndex"></param>/// <param name="pageSize"></param>/// <param name="strOrder"></param>/// <returns></returns>[HttpPost]public List<StudentEntity> GetPageList(int pageIndex, int pageSize,string strOrder="Age DESC"){//显示字段string strField = "ID,Name,Age";//过滤条件SqlFilterEntity sqlFilterEntity = new SqlFilterEntity();sqlFilterEntity.Append($"Age>@Age");sqlFilterEntity.Add("Age", 21);int totalCount=0;return _studentService.GetPageList(pageIndex,pageSize, strField, sqlFilterEntity,strOrder,out totalCount);}#endregion}//Class_end
}

3.3.4、服务的依赖注入

主要实现统一管理业务的接口与实现服务的对应关系。

/***
*   Title:".NET Core WebApi" 项目
*       主题:服务的依赖注入
*   Description:
*       功能:XXX
*   Date:2021
*   Version:0.1版本
*   Author:Coffee
*   Modify Recoder:
*/using Microsoft.Extensions.DependencyInjection;
using System;
using System.Collections.Generic;
using System.Text;
using WebApiService.Implements;
using WebApiService.Interfaces;namespace WebApiService.Common.Depends
{public class ServiceInjection{public static void ConfigureRepository(IServiceCollection services){services.AddSingleton<IStudentService, StudentService>();}}//Class_end}

对于依赖注入的简要补充如下所示:

方法 说明
Transient 每一次调用都会创建一个新的实例
Scoped 一个作用域中只实例化一个
Singleton 整个应用程序生命周期以内只创建一个实例

①在Startup类中【ConfigureServices】方法中注册【服务的依赖注入】

3.3.5、运行程序执行测试

比如:只显示【名称,年龄、地址】内容,查看条件是【字段为:ID;且该ID字段的值为:2021003165】信息:

参考文章:

①net core Webapi基础工程搭建(六)——数据库操作_Part 1

②net core Webapi基础工程搭建(六)——数据库操作_Part 2

.NET Core WebApi中实现数据库的操作(之SqlServer)相关推荐

  1. .NET Core WebApi中实现多态数据绑定

    什么是多态数据绑定? 我们都知道在ASP.NET Core WebApi中数据绑定机制(Data Binding)负责绑定请求参数, 通常情况下大部分的数据绑定都能在默认的数据绑定器(Binder)中 ...

  2. html 连续发送数据库,不要在循环中对数据库进行操作.htm

    不要在循环中对数据库进行操作 不要在循环中对数据库进行操作 性能非常低下,应改为用IN查询 示例: 1.在循环中查询数据库,增加gv_title属性(性能低下) foreach ($res['data ...

  3. NET问答: 如何将 ASP.NET Core WebAPI 中抛出的异常封装成对象?

    咨询区 rianjs: 在 ASP.NET Core WebAPI 中,我的 Controller 代码如下: [Route("create-license/{licenseKey}&quo ...

  4. ASP.NET Core WebAPI中使用JWT Bearer认证和授权

    为什么是 JWT Bearer ASP.NET Core 在 Microsoft.AspNetCore.Authentication 下实现了一系列认证, 包含 Cookie, JwtBearer,  ...

  5. QTP中对数据库的操作(查询,更新和删除等)

    标题为QTP对数据库的操作,其实应该改为QTP/VBS对数据库的操作.因为QTP中就是通过vbs完成数据库操作的.以access为例. 通过ADO对数据库访问的步骤如下: a.创建一个到数据库的 AD ...

  6. 在 Asp.Net Core WebAPI 中防御跨站请求伪造攻击

    什么是跨站请求伪造 跨站请求伪造(英语:Cross-site request forgery),也被称为 one-click attack 或者 session riding,通常缩写为 CSRF 或 ...

  7. 项目中对数据库的操作

    首先,介绍一下关系型数据库的相关知识: 我们最起码我说接触的都是关系模型: 关系数据结构:关系模型的结构非常单一.关系型数据库以行和列的形式存储数据. 关系操作:关系模型给出了关系操作的能力. 关系完 ...

  8. python数据库环境详解_python中MySQL数据库相关操作

    一 安装基本环境 1 简介 MySQL 基于TCP 协议之上的开发,但是网络连接后,传输的数据必须遵循MySQL的协议,封装好MySQL协议的包,就是驱动程序 MySQL 的驱动 MySQLDB 最有 ...

  9. 【WebAPI No.5】Core WebAPI中的自定义格式化

    介绍 Web API为JSON和XML提供媒体类型格式化程序.框架默认将这些格式化程序插入管道中.客户端可以在HTTP请求的Accept标头中请求JSON或XML. 格式化数据这个东西,其实没有什么最 ...

最新文章

  1. 多线程的使用——模拟线程池的实现(2015-12-02 00:14:59)
  2. Python学习笔记1环境搭建
  3. mysql cluster 安装NDB二进制版本
  4. jzoj1753-锻炼身体【单调队列】
  5. JDK8的排序大法!!
  6. C#使用正则表达式检测数字 char 和韩文
  7. 刚接触新工作的程序员:不会打开终端窗口
  8. VB6基本数据库应用(一):数据库基础
  9. Win11鼠标动不了 键盘怎么代替鼠标操作
  10. 实战动态PDF在线预览及带签名的PDF文件转换
  11. 强劲的网络。http://www.chartboost.com/
  12. 华为Android10怎样root,华为Mate10 root教程_华为Mate10卡刷获取root权限的方法
  13. MySql Order By 多个字段 排序规则
  14. springMVC中拦截器执行时机和执行顺序分析
  15. 解决NativeCat能连接的上,但是IDEA连接不上
  16. 毫米波频段射频器件的主要技术工艺趋势
  17. echarts_series总结
  18. docker中运行bash: mongo: command not found报错问题处理(直接使用mongosh)
  19. 叶片静频动频测试必要性
  20. Android多语言适配values文件夹命名

热门文章

  1. MySql 锁的分类
  2. c++为什么一定要定义无参构造函数?类中无参构造的作用
  3. 微软拼音输入法 2010 Beta 1 发布
  4. 大数据可视化服务商有那些?
  5. 在cmd中关闭或启动服务
  6. 网络基础知识总结(更新中)
  7. 北京林业大学C语言测试,北京林业大学c语言题库上机题一.doc
  8. 大型json文件格式化【超简单】
  9. 3GPP R17空闲态省电特性
  10. php重定向函数是什么,php重定向三方法