Blazor入门-连接MySQL的简单例子:列出数据+简单查询

参考:
ASP.NET Core 6.0 Blazor Server APP并使用MySQL数据库_blazor mysql-CSDN博客
https://blog.csdn.net/mzl87/article/details/129199352

本地环境:win10, visual studio 2022 community, mysql 8.0.33 (MySQL Community Server), net core 6.0


目录

  • 问题
  • 实现效果
  • 前置工作
    • 配置VS插件/程序包
    • 配置MySQL
  • blazor配置和编码
    • 1.创建模型类
    • 2.创建连接类
      • 2.1创建连接辅助类
      • 2.2创建连接类
    • 3.创建服务类
    • 4.创建客户端razor
    • 5.配置侧边栏

问题

假设本地装有MySQL,里面有一个数据库名为vector,其下有一个表名为basic_unit,现在需要在某个网页上:

  • 列出basic_unit中所有数据
  • 能根据字段 Name 和(或)Type 查询并列出结果。

实现效果

  1. 列出所有数据
    在这里插入图片描述
  2. 查询
    在这里插入图片描述

前置工作

配置VS插件/程序包

使用 NuGet 安装如下两个程序包。其中,第一个包可能要对照.NET的版本,如果对不上会安装失败。
在这里插入图片描述

配置MySQL

首先创建一个表:

create table basic_unit(
  id int unsigned not null AUTO_INCREMENT,
  name varchar(200) default null,
  ustart int default -1,
  uend int default -1,
  direction varchar(1) default 'n',
  unit_type varchar(100) default null,
  seq varchar(15000) default null,
  primary key(id)
) engine=InnoDB;

然后创建一个procedure:

use vector;
delimiter $$

mysql> create procedure SearchBU(in n varchar(200), in utype varchar(100))
    -> BEGIN
    -> select name, ustart, uend, direction, unit_type, seq
    -> from basic_unit
    -> where
    ->     name like concat('%', n, '%')
    ->     and
    ->     unit_type like concat('%', utype, '%');
    -> END$$
Query OK, 0 rows affected (0.04 sec)

测试一下procedure是否创建成功:

mysql> call SearchBU("AmpR promoter","promoter");
+---------------+--------+------+-----------+-----------+-----------------------------------------------------------------------------------------------------------+
| name          | ustart | uend | direction | unit_type | seq                                                                                                       |
+---------------+--------+------+-----------+-----------+-----------------------------------------------------------------------------------------------------------+
| AmpR promoter |      1 |  105 | f         | promoter  | CGCGGAACCCCTATTTGTTTATTTTTCTAAATACATTCAAATATGTATCCGCTCATGAGACAATAACCCTGATAAATGCTTCAATAATATTGAAAAAGGAAGAGT |
+---------------+--------+------+-----------+-----------+-----------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

Query OK, 0 rows affected (0.01 sec)

blazor配置和编码

blazor项目的创建参见下面的链接,此处不再展开。

Blazor入门-基础知识+vs2022自带例程的理解_blazor教程 菜鸟-CSDN博客
https://blog.csdn.net/pxy7896/article/details/138621017

1.创建模型类

在项目中新建一个文件夹Models,然后创建一个模型类 BasicUnit。我把Models放在Data文件夹下,其实也可以放在根目录,都可以。

namespace BlazorApp1.Data.Models
{
    public class BasicUnit
    {
        public int Id { get; set; }
        public string? Name { get; set; }
        public int Ustart { get; set; } = -1;
        public int Uend { get; set; } = -1;
        public string Direction { get; set; } = "n";
        public string? UnitType { get; set; }
        public string? Seq { get; set; }
    }
}

2.创建连接类

2.1创建连接辅助类

还是在Models下创建一个连接辅助类 MySQLHelper,内容为:

using MySqlConnector;

namespace BlazorApp1.Data.Models
{
    public class MySQLHelper
    {
        //this field gets initialized at Program.cs
        public static string? conStr;

        public static MySqlConnection GetConnection()
        {
            try
            {
                MySqlConnection connection = new MySqlConnection(conStr);
                return connection;
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
                throw;
            }
        }

    }
}

然后在 Program.cs 中初始化这个辅助类:

using BlazorApp1.Data.Models;
....
builder.Services.AddServerSideBlazor();
...
// connect mysql
MySQLHelper.conStr = builder.Configuration["ConnectionStrings:DefaultConnection"];

var app = builder.Build();
...

然后修改 appsettings.json ,增加一段内容:

  "ConnectionStrings": {
    "DefaultConnection": "server=localhost;user id=用户名;password=密码;port=3306;database=数据库名称;"
  },

这样连接辅助类就拿到连接所需的各种信息了。

2.2创建连接类

下面的代码很好理解,就是在函数里执行查询过程,然后包装结果,准备传递给service。

using BlazorApp1.Data.Models;
using MySqlConnector;
using System.Data;

namespace BlazorApp1.Data
{
    public class BasicUnitConnection
    {
        public async Task<BasicUnit[]> SearchBasicUnits(string name, string utype) { 
            List<BasicUnit> basicUnits = new List<BasicUnit>();
            // 辅助类提供了连接信息
            using (MySqlConnection conn = MySQLHelper.GetConnection()) { 
                // open connection
                conn.Open();
                // SearchBU 是前面创建的查询过程(procedure)
                using (MySqlCommand cmd = new MySqlCommand("SearchBU", conn)) {
                    cmd.CommandType = CommandType.StoredProcedure;
                    // add parameters
                    cmd.Parameters.Add(new MySqlParameter { 
                        ParameterName = "@n",
                        DbType = DbType.String,
                        Value = name,
                        Direction = ParameterDirection.Input,
                    });
                    cmd.Parameters.Add(new MySqlParameter
                    {
                        ParameterName = "@utype",
                        DbType = DbType.String,
                        Value = utype,
                        Direction = ParameterDirection.Input,
                    });
                    // 执行查询,将收到的查询结果包装成模型对象
                    // 查询结果应与sql查询语句对应,包括类型
                    using (MySqlDataReader reader = cmd.ExecuteReader()) {
                        while (reader.Read()) {
                            basicUnits.Add(new BasicUnit() { 
                                Name = reader.GetString("name"),
                                Ustart = reader.GetInt32("ustart"),
                                Uend = reader.GetInt32("uend"),
                                Direction = reader.GetString("direction"),
                                UnitType = reader.GetString("unit_type"),
                                Seq = reader.GetString("seq"),
                            });
                        }
                    } 
                }
            
            }
            //Console.WriteLine(basicUnits.Count);
            return basicUnits.ToArray();
        }
    }
}

3.创建服务类

服务类更简单了,只要调用上面的连接类里的函数即可。

using BlazorApp1.Data.Models;

namespace BlazorApp1.Data
{
    public class BasicUnitService
    {
        private BasicUnitConnection conn { get; set; } = new BasicUnitConnection();

        public async Task<BasicUnit[]> GetBasicUnitsByNameType(string name, string type) {
            BasicUnit[] res = conn.SearchBasicUnits(name, type).Result.ToArray();
            return res;
        }
    }
}

4.创建客户端razor

razor是显示内容的元件,里面包括一个查询框和一个查询结果列表,两个都是table。

需要注意的是,如果模型的一个属性可能是null,需要注意处理。

@page "/basicunit/list"
@using BlazorApp1.Data
@using BlazorApp1.Data.Models;
@inject BasicUnitService basicUnitService

<h3>BasicUnitList</h3>

<!-- search frame -->
<table>
    <tr style="height: 30px; background-color:#336699 ;
     color:#FFFFFF ;border: solid 1px #659EC7;">
        <td colspan="5" align="left">
            Search BasicUnit
        </td>
    </tr>
    <tr>
        <td>Name:</td>
        <td>
            <input class="input-group-text" type="text" @bind-value="@custName" />
        </td>

        <td>Type:</td>
        <td>
            <input class="input-group-text" type="text" @bind-value="@custType" />
        </td>
        <td>
            <input type="button" class="btn btn-primary"
                   value="Search" @onclick="@searchDetails" />
        </td>
    </tr>
</table>

<hr/>

@if (basicUnits == null)
{
    <p><em>Loading...</em></p>
} else
{
    <table class="table">
        <thead>
            <tr>
                <th>Name</th>
                <th>Start</th>
                <th>End</th>
                <th>Length</th>
                <th>Direction</th>
                <th>Type</th>
                <th>Seq</th>
            </tr>
        </thead>
        <tbody>
            @foreach(var bu in basicUnits)
            {
                bsize = @bu.Uend - bu.Ustart + 1;
                if (@bu.Seq != null)
                {
                    bseq = bu.Seq;
                    if (bsize > 50)
                    {
                        bseq = bseq.Substring(0, 50) + "...";
                    }
                }
                
                <tr>
                    <td>@bu.Name</td>
                    <td>@bu.Ustart</td>
                    <td>@bu.Uend</td>
                    <td>@bsize</td>
                    <td>@bu.Direction</td>
                    <td>@bu.UnitType</td>
                    <td>@bseq</td>
                    
                </tr>    
            }
        </tbody>
    </table>    
}

代码部分则是:

@code {
    private string custName = "";
    private string custType = "";
    private BasicUnit[]? basicUnits;
    private int bsize = -1; // 因为要计算seq属性的长度,所以额外用一个变量
    private string bseq = ""; // 显示的seq

	protected override async Task OnInitializedAsync()
	{
		basicUnits = await basicUnitService.GetBasicUnitsByNameType(custName, custType);	
	}

	async Task searchDetails()
	{
		basicUnits = await basicUnitService.GetBasicUnitsByNameType(custName, custType);
	} 

}

5.配置侧边栏

修改 NavMenu.razor ,给侧边栏增加一个链接:

<div class="@NavMenuCssClass" @onclick="ToggleNavMenu">
    <nav class="flex-column">
        <div class="nav-item px-3">
            <NavLink class="nav-link" href="/" Match="NavLinkMatch.All">
                <span class="oi oi-home" aria-hidden="true"></span> Home
            </NavLink>
        </div>
        <!-- 新增的部分 -->
        <div class="nav-item px-3">
        	<!-- href就是上面razor里@page后跟的字符串 -->
            <NavLink class="nav-link" href="/basicunit/list">
                <span class="oi oi-list-rich" aria-hidden="true"></span> Basic Unit
            </NavLink>
        </div>
        <!-- 新增的部分 END -->      
    </nav>
</div>

done.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/659808.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

DiffIR论文阅读笔记

ICCV2023的一篇用diffusion模型做Image Restoration的论文&#xff0c;一作是清华的教授&#xff0c;还在NIPS2023上一作发表了Hierarchical Integration Diffusion Model for Realistic Image Deblurring&#xff0c;作者里甚至有Luc Van Gool大佬。模型分三个部分&#xff0c…

Linux静态库、共享动态库介绍、制作及使用

参考学习&#xff1a;Linux下的各种文件 、动态库基本原理和使用方法&#xff0c;-fPIC选项的来龙去脉 、Linux静态库和动态库分析 文章写作参考&#xff1a;Linux共享库、静态库、动态库详解 - sunsky303 - 博客园 (cnblogs.com) 一.Linux共享库、静态库、动态库详解 使用G…

三十五岁零基础转行成为AI大模型开发者怎么样呢?

以下从3个方面帮大家分析&#xff1a; 35岁转行会不会太晚&#xff1f;零基础学习AI大模型开发能不能学会&#xff1f;AI大模型开发行业前景如何&#xff0c;学完后能不能找到好工作&#xff1f; 一、35岁转行会不会太晚&#xff1f; 35岁正处于人生的黄金时期&#xff0c;拥…

将四种算法的预测结果绘制在一张图中

​ 声明&#xff1a;文章是从本人公众号中复制而来&#xff0c;因此&#xff0c;想最新最快了解各类智能优化算法及其改进的朋友&#xff0c;可关注我的公众号&#xff1a;强盛机器学习&#xff0c;不定期会有很多免费代码分享~ 之前的一期推文中&#xff0c;我们推出了…

EI期刊的定金和尾款

当涉及到EI&#xff08;工程索引&#xff09;期刊发表并支付定金和尾款时&#xff0c;许多学者和研究人员可能会感到担忧&#xff0c;因为这涉及到一定的风险。在探讨这个话题时&#xff0c;我们需要考虑几个因素&#xff0c;包括期刊的声誉、可信度、出版质量以及作者的权益保…

wxPython Demo大全系列:ActivityIndicator控件分析

一、ActivityIndicator介绍 wx.ActivityIndicator 控件是 wxPython 中用于显示活动指示器的控件&#xff0c;通常用于指示程序正在执行某些后台任务或操作。它在用户界面中以动画的形式表现出活动状态&#xff0c;让用户知道应用程序正在进行处理而不是被挂起。 主要特点 可视…

【Paddle】稀疏计算的使用指南 稀疏ResNet的学习心得 (2) + Paddle3D应用实例稀疏 ResNet代码解读 (1.6w字超详细)

【Paddle】稀疏计算的使用指南 & 稀疏ResNet的学习心得 Paddle3D应用实例稀疏 ResNet代码解读 写在最前面一、稀疏格式简介1. COO&#xff08;Coordinate Format&#xff09;2. CSR&#xff08;Compressed Sparse Row Format&#xff09; 二、Paddle稀疏张量支持1. 创建 C…

管理能力学习笔记十一:如何通过反馈做好辅导

关于辅导的常见错误 辅导过于细致 辅导的首要障碍: 不相信对方的潜力需要有成长型思维&#xff1a;即便员工现在不OK&#xff0c;未来会更好因材施教&#xff1a;对不同风格的下属&#xff0c;采取不同的辅导风格 凡事亲力亲为 作为管理者&#xff0c;我们要做的是&#xf…

FDW(Foreign Data Wrapper)

在上一篇博客里&#xff0c;最末尾提到了 FDW。 FDW 到底是什么呢&#xff1f; 标准 FDW&#xff08;Foreign Data Wrapper&#xff09;遵循了 SQL/MED 标准&#xff0c;标准全称&#xff1a;ISO/IEC 9075-9 Management of External Data (SQL/MED) 2003 年&#xff0c;SQL…

25 使用MapReduce编程了解垃圾分类情况

测试数据中1表示可回收垃圾&#xff0c;2表示有害垃圾&#xff0c;4表示湿垃圾&#xff0c;8表示干垃圾。 统计数据中各类型垃圾的数量&#xff0c;分别存储可回收垃圾、有害垃圾、湿垃圾和干垃圾的统计结果。 &#xff08;存储到4个不同文件中&#xff0c;垃圾信息&#xff0…

使用 retrievers 在 Elasticsearch 中进行语义重新排序

作者&#xff1a;来自 Elastic Adam Demjen, Nick Chow 什么是语义重新排序&#xff1f; 语义重新排序&#xff08;semantic reranking&#xff09;是一种方法&#xff0c;它允许我们利用快速检索方法的速度和效率&#xff0c;同时在其上分层语义搜索。它还允许我们立即将语义…

【JS基础语法04】运算符分类以及运用

一&#xff1a;赋值运算符 1 类型 赋值运算符包括以下&#xff1a;、、-、*、/ 2 原理 &#xff0c;是将等号右边的数赋值给左边以为例(-、*、/和运算逻辑是相同的) let num 5 num2 等价于 let num 5 numnum2 //num7 二&#xff1a;一元运算符 1怎么判断运算符是几元…

GeoJson和WKT数据格式解析

1. GeoJson数据格式 GEOJSON是gis地图中常用的数据格式&#xff0c;制作地图时用于存储各种地理数据&#xff0c;使用时通过OpenLayer、Leaflet、mapLibre-gl或者Cesium加载GEOJSON即可渲染出GEOJSON中描述的地理要素。 GeoJSON是一种对各种地理数据结构进行编码的格式&#xf…

拍摄的视频内容怎么做成二维码?视频在线转换成二维码的方法

怎么把拍的个人才艺视频做成二维码呢&#xff1f;现在扫码看视频是实现内容快速传播的一种常用方式&#xff0c;所以很多人会将自己拍摄的视频制作二维码图片&#xff0c;然后分享给其他人扫码获取内容&#xff0c;对于内容的传播速度及用户体验有很好的提升&#xff0c;在很多…

Comfyui导出图片的命名技巧,日期文件夹

种子序号命名&#xff1a;%KSampler.seed% 图片宽高序号命名&#xff1a;%Empty Latent Image.width%x%Empty Latent Image.height% 年月日&#xff1a;%date:yyyy-MM-dd% 时分秒&#xff1a;%date:hhmmss% 年月日种子序号&#xff1a;%date:yyyy-MM-dd%/%KSampler.seed%

以果决其行,只为文化的传承

从他们每一个人的身上&#xff0c;我们看到传神的东西&#xff0c;就是他们都能用结果&#xff0c;去指引自己前进的方向&#xff0c;这正是我要解读倪海厦老师的原因&#xff0c;看倪海厦2012年已经去世&#xff0c;到现在已经十几年时间了&#xff0c;但是我们看现在自学中医…

TC3xx分析--如何提高系统运行效率(2)

目录 1.概述 2.限定符对于代码的影响 3.小结 1.概述 上文TC3xx分析--如何提高系统运行效率(1)-CSDN博客讲解了Tasking中lsl的某些关键定义&#xff0c;简述了Tricore寻址模式&#xff0c;接下来我们继续看&#xff0c;不同memory限定符对于代码的影响。 2.限定符对于代码的…

查询sqlserver表占用空间,查询当前数据库缓存的所有数据页面,查询当前数据库经常访问的表

查询某张表的磁盘占用情况&#xff1a; --第一种 EXEC sp_spaceused 表_测试表;--第二种 SELECT OBJECT_NAME(object_id) AS TableName,SUM(used_page_count) * 8 AS UsedSpaceKB FROM sys.dm_db_partition_stats GROUP BY object_id;查询当前数据库缓存的所有数据页面&#x…

mmu之TLB的来源与实现

TLB的由来 遇到的问题 对于两级页表(Page Table)的设计&#xff0c;需要访问两次物理内存才可以得到虚拟地址对应的物理地址(一次访问第一级页表&#xff0c;另一次访问第二级页表)&#xff0c;而物理内存的运行速度相对于处理器本身来说&#xff0c;有几十倍的差距; 因此在处…

zabbix事件告警监控:如何实现对相同部件触发器告警及恢复的强关联

有一定Zabbix使用经验的小伙伴可能会发现&#xff0c;接收告警事件时&#xff0c;其中可能包含着大量不同的部件名&#xff0c;同一部件的事件在逻辑上具有很强关联性&#xff0c;理论上应保持一致的告警/恢复状态&#xff0c;但Zabbix默认并未对它们进行关联&#xff0c;直接后…