[英]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
是如何介入這里的。
解決方案 - 變通:
截至目前, int
, bigint
總是拋出'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.