Dapper INSERT AccessViolationException

问题描述 投票:0回答:1

我目前正在试用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子类

In the SQLMapper partial class from Dapper

并且只是为了完成来自其他项目的调用(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是调用。我在做什么错?

c# exception dapper blazor
1个回答
0
投票

首先,您应该在打开的连接中创建命令。现在,您创建命令,然后打开连接(如果已关闭)。尝试更改此设置(首先打开连接,然后创建命令)。

您应该注意的下一件事是:

await cmd.ExecuteNonQueryAsync(command.CancellationToken).ConfigureAwait(false);

尝试删除ConfigureAwait并查看会发生什么。如果有效,请尝试将其更改为:

await (cmd.ExecuteNonQueryAsync(command.CancellationToken).ConfigureAwait(false));
© www.soinside.com 2019 - 2024. All rights reserved.