我目前正在试用Dapper,真的很惊讶在短时间内做出“全天候”声明是多么容易。我正在开发Blazor WebAssembly项目,并试图制作简单的SELECT和INSERT语句。我将尝试将所有内容布置得尽可能清晰,以加快回答过程。我有2个项目,一个是简单的.Net Standard 2.0类库,其中包含4个类,这些类用于进行SQL和BlazorWebAssembly之类的后台工作。现在概述ClassLibrary中的类:
ProjektData.cs(Blazor应用程序调用方法):
using System.Collections.Generic;
namespace BlazorBoardcardsAppData
{
using System.Threading.Tasks;
using BlazorBoardcardsAppData.Models;
public class ProjektData
{
private readonly AccessDataAccess db;
public ProjektData(AccessDataAccess db)
{
this.db = db;
}
public Task<List<ProjektModel>> GetProjekte()
{
string sql = "SELECT * FROM Projekte";
return this.db.LoadData<ProjektModel, dynamic>(sql, new { });
}
public void SaveProjekte<I>()
{
string sql = "INSERT INTO Projekte (sName, sBeschreibung) " +
"VALUES (@sName, @sBeschreibung);";
this.db.SaveData(sql, new { });
}
}
}
和AccessDataAccess.cs(在这里我已经尝试了各种方法来解决此问题)
namespace BlazorBoardcardsAppData
{
using System.Collections.Generic;
using System.Threading.Tasks;
using System.Data.OleDb;
using System.Linq;
using BlazorBoardcardsAppData.Models;
using Dapper;
using Microsoft.Extensions.Configuration;
public class AccessDataAccess
{
private readonly IConfiguration config;
public string ConnectionString { get; set; } = "Default";
public AccessDataAccess(IConfiguration config)
{
this.config = config;
}
public async Task<List<T>> LoadData<T, U>(string sql, U parameters)
{
string connectionString = this.config.GetConnectionString(ConnectionString);
using (OleDbConnection con = new OleDbConnection(connectionString))
{
var data = await con.QueryAsync<T>(sql, parameters);
return data.ToList();
}
}
public void SaveData<U>(string sql, U parameters)
{
string connectionString = this.config.GetConnectionString(ConnectionString);
//ProjektModel t = new ProjektModel
//{
// sName = "test",
// sBeschreibung = "test",
// bAbgeschlossen = false,
// bDokuVorhanden = true,
// dAusstehendFte = 1,
// dGesamtFte = 2,
// lKanbanProjekt = 2314,
// sAbrechnungsmethode = "test",
// sErforderlicheLizenzen = "test",
// sExterneKontakte = "test",
// sGeplanteErweiterung = "test",
// sRaciqA = "test",
// sRaciqC = "test",
// sRaciqQ = "test",
// sRaciqR = "test",
// sRaciqI = "test",
// sZielgruppe = "test"
//};
//List<ProjektModel> u = new List<ProjektModel>();
//u.Add(t);
using (OleDbConnection con = new OleDbConnection(connectionString))
{
con.Execute(sql, new {
sName = "test",
sBeschreibung = "test",
bAbgeschlossen = false,
bDokuVorhanden = true,
dAusstehendFte = 1,
dGesamtFte = 2,
lKanbanProjekt = 2314,
sAbrechnungsmethode = "test",
sErforderlicheLizenzen = "test",
sExterneKontakte = "test",
sGeplanteErweiterung = "test",
sRaciqA = "test",
sRaciqC = "test",
sRaciqQ = "test",
sRaciqR = "test",
sRaciqI = "test",
sZielgruppe = "test"
});
}
}
}
}
目标是使用“ ProjektModel”作为参数模型插入到SQL数据库中。我尝试了几种方法,其中注释的代码就是其中一种。SELECT语句就像一个超级按钮一样工作,因此我可以排除连接问题或类似问题。我尝试了ExecuteAsync,但没有区别,异常总是出现在同一位置:
@@ EDIT:此屏幕快照来自Dapper的SQLMapper子类
并且只是为了完成来自其他项目的调用(Blazor项目,该项目使用带有Dapper方法的DLL)
@page "/"
@page "/boardcards"
@using BlazorBoardcardsAppData
@using BlazorBoardcardsAppData.Models
@inject ProjektData PjData
@inject IJSRuntime jsRuntime
@inject ProjektModel TProjektModel
@inject ProjektDataDictionary ProjektDataDictionary
<header>
<link href="css/BoardcardsSite.css" rel="stylesheet" type="text/css" />
</header>
<body>
<h1>Projekt Boardkarten</h1>
<div class="row align-items-center">
<button @onclick="@AddProjektToTable">Add</button>
<p id="TextPaddingSpacer" class="col mb-0">Alle Stundenzettel der ** Komponenten</p>
<input class="form-control mr-sm-2 col-2" type="search" placeholder="Suchen" aria-label="Suchen"
@bind-value="SearchTerms" @bind-value:event="oninput" />
</div>
@if (filteredProjects == null)
{
<p><em>Loading...</em></p>
}
else
{
<table class="table table-hover">
<thead>
<tr>
<th id="BoardcardsNameColumnWidth">Name</th>
<th>Beschreibung</th>
</tr>
</thead>
<tbody>
@foreach (var projects in filteredProjects)
{
<tr class="TableRows" @onclick="@(e => OpenNewTab(projects))">
<td>@projects.sName</td>
@if (string.IsNullOrEmpty(projects.sBeschreibung) || projects.sBeschreibung.Equals("?"))
{
<td>(Keine Informationen)</td>
}
else
{
<td>@projects.sBeschreibung</td>
}
</tr>
}
</tbody>
</table>
}
</body>
@code {
private List<ProjektModel> projects;
private string SearchTerms { get; set; } = string.Empty;
protected override async Task OnInitializedAsync()
{
projects = await PjData.GetProjekte();
if (ProjektDataDictionary.AllProjekt.Count == 0)
{
foreach (ProjektModel projektModel in projects)
{
ProjektDataDictionary.AllProjekt[projektModel.gID] = projektModel;
}
}
}
private List<ProjektModel> filteredProjects => projects.Where(x => x.sName.ToLower().Contains(SearchTerms.ToLower())
|| (x.sBeschreibung?.ToLower().Contains(SearchTerms.ToLower()) ?? false)).ToList();
private async Task OpenNewTab(ProjektModel pj)
{
await jsRuntime.InvokeVoidAsync("Open", $"/BoardcardViewer/{pj.gID}");
}
private void AddProjektToTable()
{
PjData.SaveProjekte<ProjektModel>();
}
}
其中AddProjectToTable是调用。我在做什么错?
首先,您应该在打开的连接中创建命令。现在,您创建命令,然后打开连接(如果已关闭)。尝试更改此设置(首先打开连接,然后创建命令)。
您应该注意的下一件事是:
await cmd.ExecuteNonQueryAsync(command.CancellationToken).ConfigureAwait(false);
尝试删除ConfigureAwait并查看会发生什么。如果有效,请尝试将其更改为:
await (cmd.ExecuteNonQueryAsync(command.CancellationToken).ConfigureAwait(false));