![cover](https://img-blog.csdnimg.cn/e973cb7ff6434cfe9658dcbcdeccc9d6.gif)
MAUI 第五天 使用MASA Blazor 做个全局异常监测和数据库操作
MAUI Blazor Sqlite
·
目标:
1、捕获全局异常信息。
2、向数据库中插入异常数据。
效果:
实现:
目标捕获全局异常信息。
1、在MainLayout.razor中添加<MErrorHandler OnHandle="Callback">,具体代码如下:
@using BlazorComponent.I18n
@using System.Globalization
@using XXXX.DB
@using XXXX.Models
@using Serilog
@inherits LayoutComponentBase
@inject I18n I18n
@inject ErrorLogsDatabase errorLogsDatabase
//2023-3-23-在这里加了个错误提示信息
@inject IPopupService PopupService
<MApp Id="inspire">
<MErrorHandler OnHandle="Callback">
<CascadingValue Value="@I18n.Culture.ToString()" Name="Culture">
<MNavigationDrawer @bind-Value="_drawer" App>
<!-- Your content -->
<NavMenu/>
</MNavigationDrawer>
<MAppBar Color="deep-purple accent-4"
Dense
Dark App>
<MAppBarNavIcon @onclick="() => _drawer = !_drawer">
</MAppBarNavIcon>
<MToolbarTitle>
@I18n.T("ApplicationName")
</MToolbarTitle>
<MSpacer></MSpacer>
<MSwitch Class="mt-5 mr-10" @bind-Value="IsChinese" LeftText="EN" RightText="中" Color="black" TrackColor="#E5E6EB" MinHeight="30"></MSwitch>
</MAppBar>
<MMain>
<CascadingValue Value="this" IsFixed>
@Body
</CascadingValue>
</MMain>
</CascadingValue>
</MErrorHandler>
</MApp>
@code {
private CultureInfo? _culture;
private bool _showMobileMenuList;
private bool _hideAppBarNavIcon;
private bool _showSettings;
private string? _project;
bool _drawer = true;
bool _isChinee = true;
public bool IsChinese
{
get { return _isChinee; }
set
{
_isChinee = !_isChinee;
SetLanugae();
}
}
private void SetLanugae()
{
if (_isChinee)
{
I18n.SetCulture(new CultureInfo("zh-CN"));//将语言切换成zh-CN
}
else
{
I18n.SetCulture(new CultureInfo("en-US"));//将语言切换成zh-CN
}
}
private async void Callback(Exception obj)
{
await errorLogsDatabase.SaveErrorLogsAsync(new ErrorLogs() { ErrorInformation = obj.Message });
//2023-3-23-在这里加了个错误提示信息
PopupService.EnqueueSnackbarAsync(obj.Message, AlertTypes.Error);
}
}
2、在Index.razor页面中除个0,代码如下:
@page "/"
@using BlazorComponent.I18n
@inject I18n I18n
<h1>Hello, world!</h1>
Welcome to your new app.
<SurveyPrompt Title="How is Blazor working for you?" />
<MButton OnClick="OnClick">Throw exception</MButton>
@code{
[CascadingParameter(Name = "Culture")]
private string Culture { get; set; } = null!;
private void OnClick()
{
int c = 0;
int a = 10 / c;
}
}
目标向数据库中插入异常数据
1、在NuGet中添加sqlite-net-pcl和SQLitePCLRaw.bundle_green,如下图:
2、添加文件夹DB,创建类Constants和ErrorLogsDatabase,代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace XXXX.DB
{
public static class Constants
{
public const string DatabaseFilename = "HJ3201.db3";
public const SQLite.SQLiteOpenFlags Flags =
// open the database in read/write mode
SQLite.SQLiteOpenFlags.ReadWrite |
// create the database if it doesn't exist
SQLite.SQLiteOpenFlags.Create |
// enable multi-threaded database access
SQLite.SQLiteOpenFlags.SharedCache;
public static string DatabasePath =>
Path.Combine(FileSystem.AppDataDirectory, DatabaseFilename);
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using XXXX.Models;
using SQLite;
namespace XXXX.DB
{
public class ErrorLogsDatabase
{
SQLiteAsyncConnection Database;
public ErrorLogsDatabase() { }
/// <summary>
/// 初始化数据库
/// </summary>
/// <returns></returns>
async Task Init()
{
if (Database is not null)
{
return;
}
Database = new SQLiteAsyncConnection(Constants.DatabasePath, Constants.Flags);
var result = await Database.CreateTableAsync<ErrorLogs>();
}
/// <summary>
/// 获取全部数据
/// </summary>
/// <returns></returns>
public async Task<List<ErrorLogs>> GetItemsAsync()
{
await Init();
return await Database.Table<ErrorLogs>().ToListAsync();
}
/// <summary>
/// 获取未被删除的数据
/// </summary>
/// <returns></returns>
public async Task<List<ErrorLogs>> GetItemsNotDelete()
{
await Init();
return await Database.Table<ErrorLogs>().Where(t=>t.IsDelete==false).ToListAsync();
// SQL queries are also possible
//return await Database.QueryAsync<ErrorLogs>("SELECT * FROM [ErrorLogs] WHERE [IsDelete] = 0");
}
/// <summary>
/// 根据id值获取日志
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public async Task<ErrorLogs> GetErroLogsAsync(int id)
{
await Init();
return await Database.Table<ErrorLogs>().Where(t => t.ID == id).FirstOrDefaultAsync();
}
/// <summary>
/// 保存错误日志信息,包含更新和插入
/// </summary>
/// <param name="errorLog"></param>
/// <returns></returns>
public async Task<int> SaveErrorLogsAsync(ErrorLogs errorLog)
{
await Init();
if (errorLog.ID!=0)
{
return await Database.UpdateAsync(errorLog);
}
else
{
return await Database.InsertAsync(errorLog);
}
}
/// <summary>
/// 谨慎使用,直接删除数据。
/// </summary>
/// <param name="errorLog"></param>
/// <returns></returns>
public async Task<int> DeleteErrorLogsAsync(ErrorLogs errorLog)
{
await Init();
return await Database.DeleteAsync(errorLog);
}
}
}
3、添加文件夹Models,添加类ErrorLogs,代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using SQLite;
namespace XXXX.Models
{
public class ErrorLogs
{
/// <summary>
/// 记录序号
/// </summary>
[PrimaryKey, AutoIncrement]
public int ID { get; set; }
/// <summary>
/// 错误信息
/// </summary>
public string ErrorInformation { get; set; }
/// <summary>
/// 是否删除
/// </summary>
public bool IsDelete { get; set; } = false;
/// <summary>
/// 插入时间
/// </summary>
public string InsertDateTime { get; set; }= DateTime.Now.ToString("F");
/// <summary>
/// 是否上传
/// </summary>
public bool IsUpLoad { get; set; } = false;
}
}
4、在MauiProgram类中添加代码,代码如下:
builder.Services.AddSingleton<ErrorLogs>();
builder.Services.AddSingleton<ErrorLogsDatabase>();
更多推荐
所有评论(0)