【问题标题】:Dapper INSERT AccessViolationExceptionDapper INSERT AccessViolationException
【发布时间】:2020-06-03 17:39:43
【问题描述】:

我目前正在试用 Dapper,我真的很惊讶在很短的时间内做出“全天”声明是多么容易。
我正在开发一个 Blazor WebAssembly 项目,并尝试制作简单的 SELECT 和 INSERT 语句。
我会尽量把所有内容都安排得尽可能清楚,以加快回答过程。
我有 2 个项目,一个是带有 4 个类的简单 .Net Standard 2.0 类库,用于 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 部分类

并且只是为了完成来自其他项目的调用(使用带有 Dapper 方法的 DLL 的 Blazor 项目)

@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 是调用位置。
我做错了什么?

【问题讨论】:

  • 这是我在这么多天里看到的关于AccessViolationException似乎有效用法的第三个问题。我想知道 System.Data.SqlClient/MS.Data.SqlClient 的最新更新是否破坏了某些东西
  • @pinkfloydx33 这是 ConnectionString 以防万一:Provider=MSOLEDBSQL;Server=HANKE\\HANKE;Database=Boardcards;Trusted_Connection=Yes;

标签: c# exception dapper blazor


【解决方案1】:

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

接下来你应该注意的是:

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

尝试删除 ConfigureAwait 看看会发生什么。如果可行,请尝试将其更改为:

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

【讨论】:

  • 这是来自扩展 Dapper 的代码。我没有写那个代码。我不好编辑它
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多