Net Core 6.0 webApi+sqlServer数据库教程实战
- 教程前言
- 安装net core 环境
- 构建wepApi项目
- 操作数据库
- 接口调用
- 相关快速扩展
- 总结
教程前言
本教程从构建项目开始到实战采用的是vsCode开发工具,初学者建议使用vs Studio进行创建,因为这样建的东西比较全一点。
安装net core 环境
1.我们首先要下载net core sdk ,这样我们才能使用dotnet终端命令和运行项目,官方下载链接:net core sdk 下载,我下载的版本是6.0。
下载安装完成之后打开cmd窗口验证是否安装成功:
dotnet --version
效果如图:
查看dotnet其它命令
dotnet --help
2.安装c#运行环境
在vscode插件中搜索c#,并进行安装。
构建wepApi项目
在vsCode中我们使用终端命令快速构建webApi项目:
#创建webApi项目
dotnet new webapi -o TodoApi
#进入项目目录
cd TodoApi
#安装sqlserver数据库包
dotnet add package Microsoft.EntityFrameworkCore.SqlServer
#安装内存数据库包
dotnet add package Microsoft.EntityFrameworkCore.InMemory
code -r ../TodoApi
执行完后目录结构,有一些是我后面添加的
program.cs :服务注册类文件,像数据库服务注册,拦截器注册等都在里面;
appsettings.json :配置类文件,通常放置一些可配置的信息,这样就不用去改代码,像数据库连接字符串,访问接口地址等;
我们就可以使用dotnet命令运行项目了
dotnet run
运行之后在本地就可以在浏览器访问项目默认的接口https://localhost:5001/WeatherForecast
tip:这里默认访问形式是控制器的get方法,如果我们想访问 控制器/方法名,需要在控制器页面修改访问路由,这样就可以了。
操作数据库
- 创建Models文件夹,创建model类文件
- 类型后面加?代表可以为null
- 标注属性key,代表是主键,表中无主键需标注keyless
- 创建模型操作上下文类
using Microsoft.EntityFrameworkCore;
using System.Diagnostics.CodeAnalysis;
namespace TodoApi.Models
{
public class TodoContext : DbContext
{
public TodoContext(DbContextOptions<TodoContext> options)
: base(options)
{
}
public DbSet<personApplyInfo> personApplyInfo { get; set; } = null!;
public DbSet<phoneInfo> phoneInfo { get; set; } = null!;
}
}
- 注册数据库服务
- 编写操作数据库接口(可以使用帮助类或者ef)
一、帮助类方式
using System.Data;
using System.Data.SqlClient;
public class SqlHelper
{
//satic静态,一旦赋值,会一直保留这个值。不会被回收。
public static string? Constr { get; set; }
public static DataTable ExecuteTable(string cmdText) {
using (SqlConnection con = new SqlConnection(Constr))
{
con.Open();
// SqlCommand对象:Ado.Net中执行数据库命令的对象。
SqlCommand cmd = new SqlCommand(cmdText, con);
//1、表示用于填充 DataSet 和更新 SQL Server 数据库的一组数据命令和一个数据库连接。
//2、在SqlDataAdapter和DataSet之间没有直接连接。当完成SqlDataAdpater.Fill(DataSet)调用后,两个对象之间就没有连接了。
SqlDataAdapter sda = new SqlDataAdapter(cmd);
DataSet ds = new DataSet();
sda.Fill(ds);
return ds.Tables[0];
}
}
}
二、EF
初始化操作对象
查询操作方法
新增操作方法
ef的写法大家可以百度,这里不做详解。
5.
接口调用
net core可以使用模型验证参数,我们创建验证模型类目录和文件
其中可以通过标注属性的方式进行验证,如果我们不需要的话可以进行在program.cs关闭。
builder.Services.Configure<ApiBehaviorOptions>((o) =>
{
o.SuppressModelStateInvalidFilter = true;
});
- Get
我们访问就跟平时一样调用,url?parm="" - Post
需要注意参数是放在formbody中,且需要配置content-type:application/json;charset=UTF-8
##修改端口绑定
当我们发布时需要用ip+端口绑定
##读取配置文件
var sqlstr = builder.Configuration.GetSection("ConnectionStrings")["SqlServerConnection"];
配置文件内容
相关快速扩展
将地址改为http://:[端口],如http://:5245。
- 转换类
使用的是Newtonsoft.Json包,没有请安装
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
/// <summary>
/// JSON帮助类
/// </summary>
namespace Opertion
{
public class Opertion : ControllerBase
{
/// <summary>
/// 数据表转键值对集合
/// 把DataTable转成 List集合, 存每一行
/// 集合中放的是键值对字典,存每一列
/// </summary>
/// <param name="dt">数据表</param>
/// <returns>哈希表数组</returns>
public static List<Dictionary<string, object>> DataTableToList(DataTable dt)
{
List<Dictionary<string, object>> list
= new List<Dictionary<string, object>>();
foreach (DataRow dr in dt.Rows)
{
Dictionary<string, object> dic = new Dictionary<string, object>();
foreach (DataColumn dc in dt.Columns)
{
dic.Add(dc.ColumnName, dr[dc.ColumnName]);
}
list.Add(dic);
}
return list;
}
/// <summary>
/// 数据集转键值对数组字典
/// </summary>
/// <param name="dataSet">数据集</param>
/// <returns>键值对数组字典</returns>
public static Dictionary<string, List<Dictionary<string, object>>> DataSetToDic(DataSet ds)
{
Dictionary<string, List<Dictionary<string, object>>> result = new Dictionary<string, List<Dictionary<string, object>>>();
foreach (DataTable dt in ds.Tables)
result.Add(dt.TableName, DataTableToList(dt));
return result;
}
public static string FormatDateToJson<T>(T obj)
{
IsoDateTimeConverter timeFormat = new IsoDateTimeConverter();
timeFormat.DateTimeFormat = "yyyy-MM-dd HH:mm";
return JsonConvert.SerializeObject(obj, Formatting.Indented, timeFormat);
}
public static OkObjectResult ReturnDatToJson(Enum code, string msg, object data)
{
return new OkObjectResult(new
{
code = code,
msg = msg,
data = data
});
}
}
}
- 使用枚举类
using System;
using System.Reflection;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
public enum errorEunm
{
[Display(Name = "1小时内,连续超过5次申请验证,请于24小时后再申请")]
waitLoing = 101,
[Display(Name = "请填写手机号")]
phoneReq = 102,
[Display(Name = "请填写正确的手机号格式")]
phoneFmort = 103,
[Display(Name = "操作成功")]
success = 200,
[Display(Name = "操作失败")]
Error = 400,
[Display(Name = "请发送手机验证码")]
phoneCode = 103,
[Display(Name = "验证码不一致")]
codeDiff = 104,
[Display(Name = "请填写申请名称")]
applyName = 105
}
public static class EumHelper
{
/// <summary>
/// 获得枚举的displayName
/// </summary>
/// <param name="eum"></param>
/// <returns></returns>
public static string GetDisplayName(this Enum eum)
{
var type = eum.GetType();//先获取这个枚举的类型
var field = type.GetField(eum.ToString());//通过这个类型获取到值
var obj = (DisplayAttribute)field.GetCustomAttribute(typeof(DisplayAttribute));//得到特性
return obj.Name ?? "";
}
}
- 拦截器
using Microsoft.AspNetCore.Mvc.Filters;
using Microsoft.AspNetCore.Mvc;
public class MyExpextFilter : ExceptionFilterAttribute
{
private ILogger<MyExpextFilter> logger;
public MyExpextFilter(ILogger<MyExpextFilter> logger)
{
this.logger = logger;
}
public override void OnException(ExceptionContext context)
{
if (!context.ExceptionHandled) //如果错误没有处理过
{
if (this.IsAjax(context.HttpContext.Request))
{
context.Result = new OkObjectResult( new//
{
Message = context.Exception.Message,
ReturnCode = context.HttpContext.Response.StatusCode,
Data = new List<object>()
});
}
logger.LogError(context.Exception.Message);
context.ExceptionHandled = true; //表示错误已经处理过
}
}
public override Task OnExceptionAsync(ExceptionContext context)
{
this.OnException(context);
return Task.CompletedTask;
}
//header中 x-requested-with XMLHttpRequest //表明是AJax异步
private bool IsAjax(HttpRequest httpRequest)
{
string requestType = httpRequest.Headers["x-requested-with"];
return "XMLHttpRequest".Equals(requestType, StringComparison.Ordinal);
}
}
总结
最近才开始学习netcore,此文章只是作为入门参考,还有很多东西还要继续学习,后面会发关于部署的相关文章,发现更好的也会进行更新。
更多推荐
Net Core 6.0 webApi+sqlServer数据库教程实战
发布评论