我有一个表,有一个名为“水”的字段,该字段中的数据类型为sql server 2008float。
在我的代码中,我也使用float。
public float? Water { get; set; }
Run Code Online (Sandbox Code Playgroud)
这是我收到的错误消息。
{"Specified cast is not valid."}
{"Error parsing column 2 (Water=15.87 - Double)"}
Run Code Online (Sandbox Code Playgroud)
如果我将类型更改为double,则一切正常。
public double? Water { get; set; }
Run Code Online (Sandbox Code Playgroud)
我回到数据库,水域的所有值都在0-100之间。有一些空值。
请向我解释为什么我必须使用double而不是float?
假设我有一组“模型”实体和一组难度级别。在给定的难度级别下,每个模型在给定的一天中具有一定的成功率。
模型实体具有一个名称,该名称在任何情况下都是唯一且不可变的,因此它成为自然的主键。难度级别仅通过名称来描述(容易,正常等)。难度级别非常非常不可能改变,尽管有可能添加一个新的难度级别。成功率记录由其所属的模型,难度级别和日期唯一标识。
这是此方案中最简单的数据库设计:

在此设计中,“名称”是表“模型”的主键,并由VARCHAR(20)字段表示。同样,VARCHAR(20)字段“名称”是表“ difficulty_levels”(查找表)的主键。在“ success_rates”表中,“ model_name”是引用“ model”表中“ name”字段的外键,而“ difficulty_level”是引用“ difficulty_levels”表中“ name”字段的外键。字段“ model_name”,“ difficulty_level”和“ date”构成“ success_rates”表的复合主键。
最常用的查询是:
获取特定模型,难度级别和日期期限的所有成功率
在特定时期和难度级别获得最多/最少成功的模型。
现在,我的问题是-我需要向“模型”和“ difficulty_levels”表中添加代理主键吗?我猜想在'success_rates'的外键字段中存储int值而不是varchar值会占用较少的空间,并且查询可能会更快(只是我的疯狂猜测,不确定这一点)?
我使用代理键看到的问题是它们与业务逻辑本身的相关性为零。我正在计划使用一个迷你ORM(很可能是Dapper),并且没有代理键,我就可以在非常干净地代表我正在使用的实体的类上进行操作。现在,如果添加代理键,则必须在类中添加“ Id”属性,而我真的反对将这样的数据库存储实现添加到可在应用程序中任何位置使用的类,甚至不能在与数据库存储的连接。我可以使用Id属性添加代理存储类,但这又增加了另一层次的复杂性。加上“ Id”属性不是只读的事实(因此,ORM在将实体保存到数据库后可以设置ID)意味着可能会意外地将其设置为随机/无效值。
我对ORM不太熟悉,对Dapper的知识为零,因此,如果我在上述任何方面都不对,请更正我。
最好的方法是什么?
我试图使用Dapper和存储过程在MVC中进行CRUD操作,但由于我无法解决的转换错误,我无法将结果从模型返回到控制器.任何人都可以帮助我回复我的结果
这是我的控制器
public ActionResult AllMobileList()
{
MobileMain MM = new MobileMain();
return View(MM.AllMobileListing().ToList());
}
[HttpGet]
public ActionResult Edit(string MobileID)
{
MobileMain MM = new MobileMain();
return View(MM.GetMobileList(MobileID));
}
Run Code Online (Sandbox Code Playgroud)
模型
public IEnumerable<TBMobileDetails> AllMobileListing()
{
var para = new DynamicParameters();
para.Add("@Type", 1);
var result= con.Execute("Sp_MVCDapper", para, commandType: CommandType.StoredProcedure).ToString();
return result; // Error happens here
}
public TBMobileDetails GetMobileList(string MobileId)
{
var para = new DynamicParameters();
para.Add("@Type", 2);
para.Add("@MobileId",Convert.ToInt32(MobileId));
var result = con.Execute("Sp_MVCDapper", para, commandType: CommandType.StoredProcedure).ToString();
return result; // Error happens here
} …Run Code Online (Sandbox Code Playgroud) 我的数据库中有这些类及其等效表:
public class Entity
{
public int Id { get; set; }
public List<EntityIdentifier> Identifiers { get; set; }
public BaseEntity()
{
Identifiers = new List<EntityIdentifier>();
}
}
public class EntityIdentifier
{
public int Id { get; set; }
public int EntityId { get; set; }
public string Code { get; set; }
public string Value { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我想用Dapper查询数据库并自动映射数据。
我在Dapper git页面上有这个多重映射的例子:
var sql =
@"select * from #Posts p
left join #Users u on u.Id …Run Code Online (Sandbox Code Playgroud) public class MyType
{
public int Id { get; set;}
public int[] MyArray { get; set; }
}
var sql = "SELECT id, MyArrayAsJson as MyArray";
var x = await connection.QueryAsync<MyType>(sql);
Run Code Online (Sandbox Code Playgroud)
我有一个存储在数据库中的字符串,看起来像json: [1,2,3,4,5]
当我用Dapper查询数据库时,我希望dapper反序列化为一个对象MyType.Dapper希望MyArrayAsJson成为一个字符串,因为它是,但我希望它反序列化为一个int数组.这可能吗?
我正在尝试使用Dapper.ContribIDbConnection以及其他.insert()方法来扩展接口的功能。
为此,我在此处和此处遵循了一些简短而分散的文档。总之,我使用NuGet添加Dapper和Dapper.Contrib我的项目,我已经加入using Dapper;,并using Dapper.Contrib;在我的仓库类的顶部,和我使用的System.Data.SqlClient.SqlConnection()创建IDbConnection。
仍然,我的连接对象没有可用的扩展方法。例如,当尝试使用该.insert()方法时,我收到消息:
'IDbConnection'C#不包含'Insert'的定义,找不到找不到接受第一个类型参数的扩展方法'Insert'(您是否缺少using指令或程序集引用?)
这是在使用Razor Pages的ASP.NET Core 2.0项目中。
为了完整起见,您可以在下面找到Repository类。
也许有趣的是,usingDapper和Dapper.Contrib 的行显示为灰色...
另外,当然,我有一个TEST实体(非常简单)的Model类,其中包含一个参数TEST_COLUMN,用注释[Key]。
using Dapper.Contrib;
using Dapper;
using Microsoft.Extensions.Configuration;
using TestProject.Model;
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Threading.Tasks;
namespace TestProject.Repository
{
public class TEST_Repository
{
IConfiguration configuration;
public TEST_Repository(IConfiguration configuration)
{
this.configuration = …Run Code Online (Sandbox Code Playgroud) 在我的Dapper CRUD中,是否有人知道或具有如何使用https://github.com/henkmollema/Dapper-FluentMap的链接?现在,我正在使用Dapper.Contrib,但我们正在尝试实现Clean体系结构,该结构将删除我们结构中的Dapper.Contrib。现在,我尝试使用此Dapper-FluentMap来映射属性,但是那里的文档非常差。
我的存储库中有以下方法。到目前为止,我相信返回的int只是一个指示操作是否成功的int。我希望int是成功执行后返回的id(即表的单列)。我该如何完成?
public async Task<int> AddNewGroup()
{
using(_connection)
{
_connection.Open();
var id = await _connection.ExecuteAsync("INSERT INTO groups").Single();
}
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用Dapper对我本地计算机上可用的数据库执行一些简单查询.
大多数查询工作正常,但是当我尝试将对象插入数据库中的相应表时,我得到了一个SqlException.我有一个类似的插入方法,首先实例化方法体内的对象并将其插入数据库,该方法工作正常.但是这个没有.更具体地说,这是异常的回应:
System.Data.SqlClient.SqlException: 'Must declare the scalar variable "@VersionId".'
Run Code Online (Sandbox Code Playgroud)
以下是产生异常的调用代码:
public int CreateNewSchema(Schema schema)
{
string sql = "INSERT INTO Schemas(VersionId, Created, Updated, SchemaData) " +
" values (@VersionId, @Created, @Updated, @SchemaData);";
var affectedRows = _connection.Execute(sql, new{schema});
return affectedRows;
}
Run Code Online (Sandbox Code Playgroud)
我的数据库中相应的Schema表具有以下设计.
Schema
ID int
VersionID nvarchar(max)
Created datetime2(7)
Updated datetime2(7)
SchemaData nvarchar(max)
Run Code Online (Sandbox Code Playgroud)
最后,我试图在此表中插入的POCO对象定义如下:
public class Schema
{
public int ID { get; set; }
public string VersionId { get; set; }
public DateTime Created { get; set; } …Run Code Online (Sandbox Code Playgroud) dapper ×10
c# ×5
asp.net ×3
sql ×3
asp.net-core ×2
.net ×1
asp.net-mvc ×1
json ×1
orm ×1
razor ×1
sql-server ×1