.net core基于mysql的增删改查

前言

这篇文章的程序已经测试能运行

  • 代码在文章的末尾
  • 本代码使用了Mysql+MVC+ajax
  • 数据库语句在项目的sql文件下

首先我们创建项目

在这里插入图片描述

在这里插入图片描述

文件目录结构为
在这里插入图片描述

仅用代码的一部分进行讲解

1. 数据库操作

在这里插入图片描述

提供一个自用的Mysqlhelper(原来作者已经不知道是哪个了,汗)
mysql和sqlserver代码区别

mysql需要在NuGet管理器下载mysql.data
改为sqlserver需要把mysql的my删除就可以使用了
当然数据库连接字符串在这里插入代码片需要改

由于代码量有200多行就直接给github代码地址吧

MysqlHelper.cs


2. Models实体类

在文件Models下添加ProductModel.cs

namespace Homework.Models
{
    public class ProductModel
    {
        public int id { get; set; }
        public string name { get; set; }
        public int price { get; set; }
    }
}

3. 数据库具体操作类

在文件Models下添加ProductRepository.cs
我们的方法是基于mysqlhelper中的GetDataSet方法书写,用DataSet存储数据库的数据

namespace Homework.Models
{
    public class ProductRepository
    {
        public ProductRepository(){}
        public DataSet Get(int id)
        {
            CommandType cmdType = CommandType.Text;
            string cmdText = "select * from products where id=?id";
            MySqlParameter param = new MySqlParameter("?id", MySqlDbType.Int32);
            param.Value = id;
            DataSet dataSet = MysqlHelper.GetDataSet(cmdType, cmdText, param);
            return dataSet;
        }
        public DataSet GetByName(string name)
        {
            CommandType cmdType = CommandType.Text;
            string cmdText = "select * from products where name =?name";
            MySqlParameter param = new MySqlParameter("?name", MySqlDbType.String);
            param.Value = name;
            DataSet dataSet = MysqlHelper.GetDataSet(cmdType, cmdText, param);

            return dataSet;
        }
    }
}

同时我们在这里介绍一个好用的DataTable转换成Json工具

public class DatasetToJson
    {
        /// <summary>  
        /// dataTable转换成Json格式  
        /// </summary>  
        /// <param name="dt"></param>  
        /// <returns></returns>  
        public static string DataTable2Json(System.Data.DataTable dt)
        {
            StringBuilder jsonBuilder = new StringBuilder();
            jsonBuilder.Append("{\"Name\":\"" + dt.TableName + "\",\"Rows");
            jsonBuilder.Append("\":[");
            for (int i = 0; i < dt.Rows.Count; i++)
            {
                jsonBuilder.Append("{");
                for (int j = 0; j < dt.Columns.Count; j++){
                    jsonBuilder.Append("\"");
                    jsonBuilder.Append(dt.Columns[j].ColumnName);
                    jsonBuilder.Append("\":\"");
                    jsonBuilder.Append(dt.Rows[i][j].ToString().Replace("\"", "\\\"")); //对于特殊字符,还应该进行特别的处理。
                    jsonBuilder.Append("\",");
                }
                jsonBuilder.Remove(jsonBuilder.Length - 1, 1);
                jsonBuilder.Append("},");
            }
            if (dt.Rows.Count > 0){
               jsonBuilder.Remove(jsonBuilder.Length - 1, 1);
            }
            jsonBuilder.Append("]");
            jsonBuilder.Append("}");
            return jsonBuilder.ToString();
        }
        /// <summary>  
        /// DataSet转换成Json格式  
        /// </summary>  
        /// <param name="ds">DataSet</param>  
        /// <returns></returns>  
        public static string Dataset2Json(System.Data.DataSet ds)
        {
            StringBuilder json = new StringBuilder();
            json.Append("{\"Tables\":");
            json.Append("[");
            foreach (System.Data.DataTable dt in ds.Tables)
            {
                json.Append(DataTable2Json(dt));
                json.Append(",");
            }
            json.Remove(json.Length - 1, 1);
            json.Append("]");
            json.Append("}");
            return json.ToString();
        }
    }

4. Controller 控制器

接下来就是书写控制器了
这里的的控制器对于新手有一个小坑。

  1. 假设我们命名一个控制器为HomeController.cs是对应Views文件夹中的Home文件夹的
    在这个时候代码中的
  2.  public IActionResult Index()
     {
         return View();
     }
    
    对应Home文件夹中的Index.cshtml文件
    public IActionResult Products()
    {
        ViewData["Message"] = "Products页面.";
        return View();
    }
    
    对应Home文件夹中的Products.cshtml文件

所以若需要创建一个新的Controller,想要用 return View();就需要创建相对应的文件夹和相对应的文件,但是在使用get或者post方法时候,Controller是可以接受任何的页面传入的。
现在我们在Controllers目录下创建ProductsController.cs

namespace Homework.Controllers
{
    public class ProductsController : Controller
    {
        ProductRepository productRepository = new ProductRepository();//直接数据库操作
        public IActionResult Index()
        {
            return View();
        }
        //GET: /Products/Getid/id
        public string Getid(int id)
        {
            Debug.WriteLine("GetProducts" + id);
            DataSet item = productRepository.Get(id);
            if (item == null)
                return null;
            return DatasetToJson.Dataset2Json(item);
        }
        //POST: /Products/GetProducts
        public string GetProducts([FromBody]dynamic Json)
        {
            ProductModel productModel = new ProductModel
            {
                name = Json.name
            };
            Debug.WriteLine("GetProducts" + productModel.name);
            DataSet item = productRepository.GetByName(productModel.name);
            if (item == null)
                return null;
            return DatasetToJson.Dataset2Json(item);
        }
    }
}

其中DatasetToJson.Dataset2Json方法就是把Dataset类型的数据转换成json给前端,通过return的方式返回

5.Views前端

在这里插入图片描述

在Views目录中的Home目录创建Products.cshtml,这个文件对应的就是刚刚所说的HomeController下的Products()方法

@{
   ViewData["Title"] = "增删改查";
}
<h2>@ViewData["Title"]</h2>
<h3>@ViewData["Message"]</h3>
<div id="body">
   <div class="col-lg-12">
       <div>
           <br />
           <br />
           <h2>查询记录</h2>
           id:<input id="id" type="text" />
           <br />
           name:<input id="name" type="text" />
           <br />
           price:<input id="price" type="text" />
           <br />
           <input id="showItemid" type="button" value="查询id" />
           <input id="showItemname" type="button" value="查询name" />

       </div>
   </div>
</div>

js语句部分
记得我们return回来的是一串json的字符串,
这里有两种方法,我们用的是不添加dataType=json,返回值当成字符串处理,否则变成json对象
创建对象存储数据

//用于保存用户输入数据
var Product = {
    create: function () {
        id: "";
        name: "";
        price: "";
        return Product;
    }
}

把json字符串解析并赋值给我们创建的Product 对象

var obj = eval('(' + data + ')'); //格式转换
$.each(obj.Tables, function (index, table) {
       //根据不同的表名,显示不同的字段。得到特定表,table = obj.Tables[1]
       if (table.Rows.length ==0) {
           $("#id").val("不存在此id");
       } else {
           $.each(table.Rows, function (index, row) {
               $("#name").val(row.name);
               $("#price").val(row.price);
           });
       }
   });

最后加在一起如下

<script src="~/lib/jquery/dist/jquery.js"></script>
<script>
    //用于保存用户输入数据
    var Product = {
        create: function () {
            id: "";
            name: "";
            price: "";
            return Product;
        }
    }
    //先根据name查询记录  请求类型:GET  请求url:  /Products/name
    $("#showItemid").click(function () {
        var inputId = $("#id").val();
        $("#name").val("");
        $("#price").val("");
        $.ajax({
            url: "/Products/Getid/" + inputId,
            type: "GET",
            contentType: "application/json; charset=urf-8",
            success: function (data) {
                var obj = eval('(' + data + ')'); //格式转换
                $.each(obj.Tables, function (index, table) {
                    //根据不同的表名,显示不同的字段。得到特定表,table = obj.Tables[1]
                    if (table.Rows.length ==0) {
                        $("#id").val("不存在此id");
                    } else {
                        $.each(table.Rows, function (index, row) {
                            $("#name").val(row.name);
                            $("#price").val(row.price);
                        });
                    }
                });
            },
            error: function (XMLHttpRequest, textStatus, errorThrown) {
                alert("请求失败,消息:" + textStatus + "  " + errorThrown);
            }
        });
    });
    $("#showItemname").click(function () {
        var newProduct = Product.create();
        newProduct.name = $("#name").val();
        $("#id").val("");
        $("#price").val("");
        $.ajax({
            url: "/Products/GetProducts",
            type: "POST",
            contentType: "application/json; charset=urf-8",
            data: JSON.stringify(newProduct),
            success: function (data) {
                var obj = eval('(' + data + ')'); //格式转换
                $.each(obj.Tables, function (index, table) {
                    //根据不同的表名,显示不同的字段。得到特定表,table = obj.Tables[1]
                    if (table.Rows.length == 0) {
                        $("#name").val("不存在此name");
                    } else {
                        $.each(table.Rows, function (index, row) {
                            $("#id").val(row.id);
                            $("#price").val(row.price);
                        });
                    }
                });
            },
            error: function (XMLHttpRequest, textStatus, errorThrown) {
                alert("请求失败,消息:" + textStatus + "  " + errorThrown);
            }
        });
    });
</script>

代码 book_.net01

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,236评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,867评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,715评论 0 340
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,899评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,895评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,733评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,085评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,722评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,025评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,696评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,816评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,447评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,057评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,009评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,254评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,204评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,561评论 2 343

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,598评论 18 139
  • 关于Mongodb的全面总结 MongoDB的内部构造《MongoDB The Definitive Guide》...
    中v中阅读 31,898评论 2 89
  • MYSQL 基础知识 1 MySQL数据库概要 2 简单MySQL环境 3 数据的存储和获取 4 MySQL基本操...
    Kingtester阅读 7,777评论 5 116
  • 观其大纲 page 01 基础知识 1 MySQL数据库概要 2 简单MySQL环境 3 数据的存储和获取 4 M...
    周少言阅读 3,150评论 0 33
  • 上周末,电视上又一次重播《大话西游》,听到紫霞仙子那句“我猜到了这开头,可是我猜不着这结局”,我哭了,眼泪无声的流...
    646baa785834阅读 528评论 0 0