• 使用asp.net core web api创建web后台,并连接和使用Sql Server数据库


    前言:因为要写一个安卓端app,实现从服务器中获取电影数据,所以需要搭建服务端代码,之前学过C#,所以想用C#实现服务器段代码用于测试,本文使用C#语言,使用asp.net core web api组件搭建服务器端,并访问sql server 数据库。

    二、 创建ASP.NET Core Web API,选择C#语言。

    如下图所示

    后面一路默认配置即可,创建后会有个实例代码,个人感觉挺有意义,对于初次使用的人很有参考价值。因为程序中用到图片转base64格式字符串和使用sqlserver数据库,需要下载NuGet程序包,下载方法,解决方案--右键--“管理解决方案的NuGet程序包”,下载如下缺少的包,如下图:
     

    2.安装Nuet程序包——项目——依赖项——管理NuGet程序包(版本等级尽量一样)

    Microsoft.EntityFrameworkCore
    Microsoft.EntityFrameworkCore.SqlServer (适用于EF Core SQL Server 提供程序)
    Microsoft.EntityFrameworkCore.Tools(适用于 EF Core 的包管理器控制台工具)

    Microsoft.EntityFrameworkCore.Design(适用于EF Core .NET Core CLI 工具 )

    system.Drawing.Common
    Newtonsoft.Json
    swashbuckle.AspNetCore

    三、连接数据库,并返回查询结果

    1、首先创建一个类,保存web端返回的数据,比如我创建一个电影类,客户端查询电影时,返回电影列表。

    1. namespace MyWebServer.Model
    2. {
    3. // 电影列表使用
    4. public class Film
    5. {
    6. public string? film_name { get; set; }
    7. public string? film_type { get; set; }
    8. public string? film_desc { get; set; }
    9. // base64格式的图片
    10. public string? film_pic { get; set; }
    11. // 平均分
    12. public string? avg_score { get; set; }
    13. public string? film_video_url { get; set; }
    14. // 上架状态,待上架、已上架、已下架
    15. public string? film_status { get; set; }
    16. public string? film_up_time { get; set; }
    17. public string? film_down_time { get; set; }
    18. public string? create_time { get; set; }
    19. public string? update_time { get; set; }
    20. public string? create_oper { get; set; }
    21. public string? update_oper { get; set; }
    22. }
    23. }

    2、创建controller,提供给客户端查询使用。

    1. using Microsoft.AspNetCore.Http;
    2. using Microsoft.AspNetCore.Mvc;
    3. using Microsoft.Data.SqlClient;
    4. using MyWebServer.Model;
    5. using System.Data;
    6. using System.Drawing;
    7. namespace MyWebServer.Controllers
    8. {
    9. [Route("api/[controller]")]
    10. [ApiController]
    11. public class FilmListController : ControllerBase
    12. {
    13. private readonly ILogger _logger;
    14. public FilmListController(ILogger logger)
    15. {
    16. _logger = logger;
    17. }
    18. [HttpPost(Name = "GetFlimList")]
    19. public IEnumerable GetFlimList()
    20. {
    21. List filmList = new List();
    22. try
    23. {
    24. // cinema_db2为数据库名,sa为数据库登录名,dbpassword为数据库密码。
    25. // 修改sa用户密码和设置以sql server身份登录方法见:https://blog.csdn.net/newdriverest/article/details/127120083
    26. // 修改完数据库sa密码后,记得重启数据库才能生效。
    27. SqlConnection sqlConnection = new SqlConnection("Data Source=localhost;Initial Catalog=cinema_db2;Encrypt=True;Integrated Security=True;TrustServerCertificate=True;User Id=sa;Password=dbpassword");
    28. sqlConnection.Open();
    29. // 语句可从sql server management sudio查询查询语句框中直接复制过来,去掉/r/n
    30. string sql = "SELECT [film_name],film_type," +
    31. "[film_desc],[film_pic_url],[film_video_url],film_status," +
    32. "[film_up_time],[film_down_time],[create_time],[update_time]," +
    33. "[create_oper],[update_oper]" +
    34. " FROM [cinema_db2].[dbo].[t_film]";
    35. DataSet dataSet = new DataSet();
    36. SqlDataAdapter sqlDataAdapter = new SqlDataAdapter(sql, sqlConnection);
    37. sqlDataAdapter.Fill(dataSet);
    38. // 遍历结果
    39. if (dataSet.Tables.Count > 0)
    40. {
    41. // 行
    42. for (int i = 0; i < dataSet.Tables[0].Rows.Count; i++)
    43. {
    44. Film tmp = new Film();
    45. // 列
    46. for (int j = 0; j < dataSet.Tables[0].Columns.Count; j++)
    47. {
    48. if (dataSet.Tables[0].Columns[j].ToString().Equals("film_name"))
    49. {
    50. tmp.film_name = dataSet.Tables[0].Rows[i].ItemArray[j].ToString();
    51. }
    52. else if (dataSet.Tables[0].Columns[j].ToString().Equals("film_type"))
    53. {
    54. tmp.film_type = dataSet.Tables[0].Rows[i].ItemArray[j].ToString();
    55. }
    56. else if (dataSet.Tables[0].Columns[j].ToString().Equals("film_desc"))
    57. {
    58. tmp.film_desc = dataSet.Tables[0].Rows[i].ItemArray[j].ToString();
    59. }
    60. else if (dataSet.Tables[0].Columns[j].ToString().Equals("film_pic_url"))
    61. {
    62. tmp.film_pic = ImageToBase64(dataSet.Tables[0].Rows[i].ItemArray[j].ToString());
    63. }
    64. else if (dataSet.Tables[0].Columns[j].ToString().Equals("film_video_url"))
    65. {
    66. tmp.film_video_url = dataSet.Tables[0].Rows[i].ItemArray[j].ToString();
    67. }
    68. else if (dataSet.Tables[0].Columns[j].ToString().Equals("film_status"))
    69. {
    70. tmp.film_status = dataSet.Tables[0].Rows[i].ItemArray[j].ToString();
    71. }
    72. else if (dataSet.Tables[0].Columns[j].ToString().Equals("film_up_time"))
    73. {
    74. tmp.film_up_time = dataSet.Tables[0].Rows[i].ItemArray[j].ToString();
    75. }
    76. else if (dataSet.Tables[0].Columns[j].ToString().Equals("film_down_time"))
    77. {
    78. tmp.film_down_time = dataSet.Tables[0].Rows[i].ItemArray[j].ToString();
    79. }
    80. else if (dataSet.Tables[0].Columns[j].ToString().Equals("create_time"))
    81. {
    82. tmp.create_time = dataSet.Tables[0].Rows[i].ItemArray[j].ToString();
    83. }
    84. else if (dataSet.Tables[0].Columns[j].ToString().Equals("update_time"))
    85. {
    86. tmp.update_time = dataSet.Tables[0].Rows[i].ItemArray[j].ToString();
    87. }
    88. else if (dataSet.Tables[0].Columns[j].ToString().Equals("create_oper"))
    89. {
    90. tmp.create_oper = dataSet.Tables[0].Rows[i].ItemArray[j].ToString();
    91. }
    92. else if (dataSet.Tables[0].Columns[j].ToString().Equals("update_oper"))
    93. {
    94. tmp.update_oper = dataSet.Tables[0].Rows[i].ItemArray[j].ToString();
    95. }
    96. }
    97. filmList.Add(tmp);
    98. }
    99. }
    100. sqlConnection.Close();
    101. // 返回的数据,客户端使用相同的类字段接收即可,比如android端使用okhttp3+retrofit2+rxJava,很方便就能获取到返回的数据
    102. return filmList.ToArray();
    103. }
    104. catch (Exception ex)
    105. {
    106. Console.WriteLine(ex.Message);
    107. return filmList.ToArray();
    108. }
    109. }
    110. ///
    111. /// Image 转成 base64
    112. ///
    113. ///
    114. public static string ImageToBase64(string fileFullName)
    115. {
    116. try
    117. {
    118. if (fileFullName != null && !fileFullName.Equals(""))
    119. {
    120. Bitmap bmp = new Bitmap(fileFullName);
    121. MemoryStream ms = new MemoryStream();
    122. bmp.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
    123. byte[] arr = new byte[ms.Length]; ms.Position = 0;
    124. ms.Read(arr, 0, (int)ms.Length); ms.Close();
    125. return Convert.ToBase64String(arr);
    126. }
    127. return "";
    128. }
    129. catch (Exception ex)
    130. {
    131. return "";
    132. }
    133. }
    134. }
    135. }

    运行程序之后,会打开调试用的web页面和一个命令行窗口,在浏览器测试页面,可以测试服务器接口的可用性,点击如下图的Try it out按钮,再点击Execute按钮,即可测试接口的返回结果。

  • 相关阅读:
    antd——使用a-tree组件实现 检索+自动展开+自定义增删改查功能——技能提升
    Linux开发环境配置(持续更新....)
    Springboot 通过FastJson实现bean对象和Json字符串互转
    为什么那么多自学软件测试的人,后来都放弃了...
    指令重排以及案例
    Colmap 实用教程 —— 整体介绍
    说一下类的生命周期
    MybatisX快速生成代码(mybatis plus模板)
    scapy No such device exists (No such device exists)
    java毕业设计——基于java+JavaBean+jsp的网上零食销售系统设计与实现(毕业论文+程序源码)——网上零食销售系统
  • 原文地址:https://blog.csdn.net/zgscwxd/article/details/133756135