簡體   English   中英

Dapper 擴展將數據插入 SQL 服務器

[英]Dapper extension insert data into SQL Server

數據庫表:

CREATE TABLE [dbo].[EmployeeDetails]
(
    [id] [int] PRIMARY KEY IDENTITY(1,1) NOT NULL,
    [Name] [varchar](max) NULL,
    [Emailid] [varchar](max) NULL,
    [department] [varchar](max) NULL,
    [Salary] [int] NULL,
    [Profile] [varchar](max) NULL,
    [Description] [varchar](max) NULL,
    [ReferencesId] [int] NULL
)

Model class:

public class Employee
{
    #region properties
    public int Id { get; set; }
    public string? Name { get; set; }
    public string? Emailid { get; set; }
    public string? department { get; set; }

    public int salary { get; set; }

    public string? Profile { get; set; }
    public string? Description { get; set; }
    #endregion
}

類映射器

public class EmployeeMapper : ClassMapper<Employee>
{
    public EmployeeMapper() 
    {
        Table("EmployeeDetails");

        Map(x => x.Id).Key(KeyType.Identity).Column("Id").Type(System.Data.DbType.Int32);           
        Map(x => x.Name).Column("Name");
        Map(x => x.Emailid).Column("Emailid");
        Map(x => x.department).Column("department");
        Map(x => x.salary).Column("Salary");
        Map(x => x.Profile).Column("Profile");
        Map(x => x.Description).Column("Description");
    }
}

插入代碼:

public int Add(T entity)
{
    int count = 0;

    using (var con = _dapperContext.CreateConnection())
    {
        int id = con.Insert(entity);

        if (id > 0)
        {
            count++;
        }
    }

    return count;
}

我收到此錯誤:

在此處輸入圖像描述

System.ArgumentException:“‘System.Int64’類型的對象無法轉換為‘System.Int32’類型。”

我在頁面上顯示了這個異常,但數據已成功插入數據庫。 我的數據庫數據類型和 model class 數據類型都是一樣的,但我仍然在頁面上看到這個“轉換錯誤”

我需要在 ASP.NET Core Razor 頁面中使用 Dapper Extension 向數據庫表中插入一個新行

在此處輸入圖像描述

我在頁面上顯示了這個異常,但數據已成功插入數據庫。 我的數據庫數據類型和 model class 數據類型都是一樣的,但我仍然在頁面上看到這個“轉換錯誤”

好吧,一開始我以為你在做一些愚蠢的事情。 出於好奇,我進入了它並了解到問題不在您的代碼中,而是Dapper-Extensions問題。 我對他們的文檔進行了很長時間的調查,似乎是舊版本,目前他們不支持它。 我已經閱讀了這份官方文件。

問題轉載:

我已經重現了Dapper-Extensions方法拋出的問題,如下所示:

Dapper 擴展方法:

在此處輸入圖像描述

例外:

在此處輸入圖像描述

堆棧跟蹤:

at System.RuntimeType.TryChangeType(Object value, Binder binder, CultureInfo culture, Boolean needsSpecialCast)
   at System.Reflection.MethodBase.CheckArguments(Object[] parameters, Binder binder, BindingFlags invokeAttr, CultureInfo culture, Signature sig)
   at System.Reflection.RuntimeMethodInfo.InvokeArgumentsCheck(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
   at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
   at System.Reflection.RuntimePropertyInfo.SetValue(Object obj, Object value, BindingFlags invokeAttr, Binder binder, Object[] index, CultureInfo culture)
   at System.Reflection.RuntimePropertyInfo.SetValue(Object obj, Object value, Object[] index)
   at DapperExtensions.DapperImplementor.InternalInsert[T](IDbConnection connection, T entity, IDbTransaction transaction, Nullable`1 commandTimeout, IClassMapper classMap, IList`1 nonIdentityKeyProperties, IMemberMap identityColumn, IMemberMap triggerIdentityColumn, IList`1 sequenceIdentityColumn)
   at DapperExtensions.DapperImplementor.Insert[T](IDbConnection connection, T entity, IDbTransaction transaction, Nullable`1 commandTimeout)
   at MVCApps.Controllers.UserLogController.Add() in D:\MyComputer\MsPartnerSupport\MVCApps\Controllers\UserLogController.cs:line 1371
   at Microsoft.Extensions.Internal.ObjectMethodExecutor.Execute(Object target, Object[] parameters)
   at Microsoft.AspNetCore.Mvc.Internal.ActionMethodExecutor.SyncObjectResultExecutor.Execute(IActionResultTypeMapper mapper, ObjectMethodExecutor executor, Object controller, Object[] arguments)
   at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.<InvokeActionMethodAsync>d__12.MoveNext()

筆記:

在調試和重現問題時,我嘗試在兩側都使用int數據類型以及其他數據類型,例如bigint但仍然發生轉換錯誤,我發現這個問題在Dapper-Extensions方面是已知的。 因此,一種數據類型相應地計算出來,即GUID 我仍然不確定,這些Object value, Binder binder, CultureInfo culture, Boolean needsSpecialCast是如何介入這里的。

解決方案 - 變通:

截至目前, intbigint總是拋出'Object of type 'System.Int64' cannot be converted to type 'System.Int32'.' 因此,尚不清楚哪個來自DapperExtensions.DapperExtensions.Insert()方法。

此外,為避免上述錯誤,我們可以執行以下操作:

POCO Model:

public class Employee
    {

        public Guid Id { get; set; }
        public string Name { get; set; }
        public string Emailid { get; set; }
        public string Department { get; set; }
        public int Salary { get; set; }
    }

筆記:

除了Guid當前不工作,我不確定這背后的原因。 所以如果你想堅持你的實現,你必須使用Guid到 go 。

數據庫架構:

CREATE TABLE Employee(
      [Id] UNIQUEIDENTIFIER PRIMARY KEY DEFAULT NEWID(),
      [Name] [varchar](25) NULL,
      [Emailid] [varchar](100) NULL,
      [Department] [varchar](25) NULL,
      [Salary] [int] NULL,
)

在此處輸入圖像描述

Asp.Net 核心控制器/存儲庫方法:

public int Add()
        {
            int count = 0;

            Employee employee = new Employee();
            employee.Name = "Kudiya";
            employee.Emailid = "email@someemail.com";
            employee.Department = "Dapper";
            employee.Salary = 500;
            using (SqlConnection conn = new SqlConnection(_connectionString))
            {
                conn.Insert(employee);
                Guid Id = employee.Id;
               
                if (Id != null)
                {
                    count++;
                }
            }
            return count;
        }

注意:請根據您的場景和上下文更新代碼片段。

Output:

在此處輸入圖像描述

注意:此外,基於堆棧跟蹤,如果有人有確切的解釋或發現,請告訴我。 我很高興更新我的答案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM