我在一个宠物项目上试验Dapper.我使用SQLite运行所有测试和MySql进行"生产".但是我不确定如何最好地使用Dapper来处理数据库不可知的情况.
我遇到的特殊问题是MySql 不支持主键的Guid类型,因此我使用varchar(40)作为类型(SQLite支持唯一标识符,这是一个guid).所以如果我有一个通用的存储库,问题就出现了,我在尝试从MySql数据库中选择时会遇到麻烦.因为Id属性的类型是Guid,Dapper将抛出" Error parsing column 10 ",因为varchar类型与guid类型不匹配.
如果我将Id属性从guid更改为int,那么GetById中的原始sql会更加棘手,我不知道如何编写.它将类似于:1.启动事务,2.插入,3.选择最后插入的id并返回它.所以如果数据库类型是mysql,那么我将继续使用,然后使用last_insert_id,或者如果它是sqlite,那么使用last_insert_rowid?因为原始sql语法在数据库与数据库之间会有很大差异......
public IEnumerable<T> GetById(Guid id) //convention: Id is always of type Guid.
{
return UnitOfWork.DbConnection.Query<T>(
string.Format(
"select * from {0} where Id = @Id", typeof (T).Name), new {Id = id});
}
Run Code Online (Sandbox Code Playgroud)
其他示例是限制返回的行数(特别是对于分页)等等.那我怎么用dapper编写数据库无关的原始sql查询?也许在我的情况下Dapper不合适?也许我应该在这里使用相同的旧NHibernate.有什么建议?我做错了吗?谢谢!
我刚刚开始使用Dapper访问MySql数据库,在处理日期字段时似乎遇到了问题.每当我尝试映射MySql日期类型字段时,我都会收到无效的强制转换.似乎MySql连接器返回一个MySqlDateTime类型,导致Dapper将其强制转换为Object而不是日期时间.这是相关的代码
我的模型上的属性定义
public DateTime PickupDate { get; set; }
Run Code Online (Sandbox Code Playgroud)
MySql中的字段定义
PickupDate DATE
Run Code Online (Sandbox Code Playgroud)
抛出异常
System.Data.DataException : Error parsing column 1 (PickupDate= - Object)
----> System.InvalidCastException : Specified cast is not valid.
Run Code Online (Sandbox Code Playgroud)
我知道它一定是我遗漏的东西,任何人都可以指出我正确的方向,我需要做些什么才能让这个领域的Dapper映射到DateTime数据类型?
我目前正在为Dapper编写包装器.此包装器强制每个查询都是存储过程.
在我的包装器中,我正在调用Dapper(带问题):
public IEnumerable<T> Select<T>(string storedProcName, dynamic param) {
IEnumerable<T> results;
using(var connection = new SqlConnection(_connectionString) {
results = connection.Query<T>(storedProcName, param, commandType: CommandType.StoredProcedure);
}
return results;
}
Run Code Online (Sandbox Code Playgroud)
当我尝试将"param"传递给Query时,它告诉我"无法解析符号查询".当我删除param pass时,它工作正常.
任何人都可以指出我正确的方向,以便我可以将动态参数(或类似的东西)传递给Dapper吗?
我在项目中有dapper orm,我在数据库中保存了数据(1200000row),但在与dapper的事务中,我想要fast.with nhibernate(session statetless)很慢.我认为短小精悍是快速的,因为获取数据(700000)与nhibernate在33秒,与9秒的精巧.
怎么解决问题?
我的代码是:
IDbTransaction trans = connection.BeginTransaction();
connection.Execute(@"
insert DailyResult(Id, PersonId,DateTaradod,DailyTaradods)
values(@Id, @PersonId,@DateTaradod,@DailyTaradods)", entity, trans);
trans.Commit();
Run Code Online (Sandbox Code Playgroud) 我想执行此简单测试以查看表是否存在。我认为根据表是否存在返回一个int值会很容易。
以下是我尝试过但不起作用的内容:
result = connection.ExecuteScalar<int>(@"
IF (EXISTS (SELECT *
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = '@tableSchema'
AND TABLE_NAME = '@tableName'))
RETURN 0;
RETURN 1;
", new { tableSchema, tableName });
Run Code Online (Sandbox Code Playgroud)
错误信息:
具有返回值的RETURN语句不能在此上下文中使用。
真的很点头...
我最近一直在使用dapper,并希望制作一个动态方法,以便更容易用sql选择.这是我的代码:
类:
public class Method
{
public static IEnumerable<dynamic> QueryAll(string table)
{
dynamic dyn = table;
SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["DbCon"].ToString());
using (con)
{
string sql = String.Format("SELECT * FROM {0}", table);
IEnumerable<dynamic> ie = con.Query<dynamic>(sql, null);
return ie;
}
}
}
Run Code Online (Sandbox Code Playgroud)
这里叫功能:
IEnumerable<posts> = Method.QueryAll("posts");
Run Code Online (Sandbox Code Playgroud)
它给了我一个错误that I cannot convert IEnumerable dynamic to IEnumerable Models.Posts.
我该怎么做才能让它发挥作用.
如何让Dapper将数据转换为带有option属性的F#类型?简单的例子:
type SomeType = {
Count : int option
}
connection.QueryAsync<SomeType>(...)
Run Code Online (Sandbox Code Playgroud)
抛出:
System.InvalidOperationException
A parameterless default constructor or one matching signature
(System.Int32 count) is required for SomeType materialization
Run Code Online (Sandbox Code Playgroud)
使用Nullable而不是选项工作:
type SomeType = {
Count : Nullable<int>
}
Run Code Online (Sandbox Code Playgroud)
但由于各种原因,它并不理想.首先,我有我使用的情况string option(因为F#通常不允许空分配,这很好),并且Nullable<string>不编译.有没有办法配置/指示Dapper自动处理option类型?我想避免每次都使用自定义映射.
如果重要,请使用Npgsql.
我正在开发一个将大型VB6应用程序转换为.NET的项目.我决定创建一个项目来为现有的VB6 ADO代码提供一个外观,我使用了令人惊奇的Dapper扩展方法来处理VB6 ADO函数用来做的所有数据库代码.
我必须在我的新项目中支持的功能之一是能够从T-SQL存储过程(通过FOR XML)获取XML字符串结果.Dapper没有支持返回我能看到的XML.所以,我实现了ADO.NET ExecuteXmlReader方法来提供这种返回.我的项目还使用Dapper DynamicParameters来捕获存储过程所需的所有输入/输出参数.
我没有看到怎么做,是如何转换DynamicParameters为,SqlCommand.SqlParameterCollection以便我可以将这些参数填充到方法的SqlCommand对象中ExecuteXmlReader.我还必须支持此方案的输出参数.
我可以遍历DynamicParameters,但只能获取参数名称和值.我还需要方向,类型,大小,比例和精度.Dapper有一个DynamicParameters.ReplaceLiterals方法,它接受一个IDbCommand对象来替换SQL字符串中的文字.我希望它有一个方法来填写参数.
我错过了一些明显的东西吗?如果我调用Dapper Execute方法,我可以DyanmicParameters直接将其传递给此方法.我只是没有看到如何将它们传递给SqlCommand对象.
我正在使用Dapper并执行以下查询,该查询已映射到type列表MyObject。默认映射器的问题是int我的表(INOUT)中有一个可为空的字段,其中包含整数值。一个可能的值是NULL,它将被映射为整数0。如何防止这种情况?我必须知道INOUT是NULL还是0。
public List<MyObject> GetSomething()
{
using (IDbConnection db = GetOpenConnection())
{
return db.Query<MyObject>("Select * from tbl_foo").ToList<MyObject>();
}
}
public class MyObject
{
public int INOUT { get; set; }
}
Run Code Online (Sandbox Code Playgroud)