Firebird Fluentdata
Fluentdata 支持很多种数据库驱动,但对Firebird不友好,不过可以使用DB2Provider来操作大部分功能,
例如: new DbContext().ConnectionString(connectionString, new DB2Provider(), FirebirdClientFactory.Instance)
但是对于Insert后获取自动生成的最大Id,就会报错,因为DB2的语法不通。
起初怀疑获取最大Id方法是通过自动添加select max(id)来获取,这样就有可能访问量大时会存在错误。
好在官网有源码可以查看,结果不是的。
每种数据库都有insert后获取inserted记录的Id的方法,Firebird也不例外,语法是: insert A (x,x) values (x,x) returning id, x, x 和Oracle语法差不多。
那就果断添加一个 FirebirdProvider ,后续我们再查看下其他各数据库ExecuteReturnLastId的具体做法。
FirebirdProvider 代码:
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using FluentData.Providers.Common;
using FluentData.Providers.Common.Builders; namespace FluentData
{
public class FirebirdProvider: IDbProvider
{
public string ProviderName
{
get
{
return "FirebirdSql.Data.FirebirdClient";
}
} public bool SupportsOutputParameters
{
get { return true; }
} public bool SupportsMultipleResultsets
{
get { return true; }
} public bool SupportsMultipleQueries
{
get { return true; }
} public bool SupportsStoredProcedures
{
get { return true; }
} public bool RequiresIdentityColumn
{
get { return false; }
} public IDbConnection CreateConnection(string connectionString)
{
return ConnectionFactory.CreateConnection(ProviderName, connectionString);
} public string GetParameterName(string parameterName)
{
return "@" + parameterName;
} public string GetSelectBuilderAlias(string name, string alias)
{
return name + " as " + alias;
} public string GetSqlForSelectBuilder(SelectBuilderData data)
{
var sql = "";
sql = "select " + data.Select;
sql += " from " + data.From;
if (data.WhereSql.Length > )
sql += " where " + data.WhereSql;
if (data.GroupBy.Length > )
sql += " group by " + data.GroupBy;
if (data.Having.Length > )
sql += " having " + data.Having;
if (data.OrderBy.Length > )
sql += " order by " + data.OrderBy;
if (data.PagingItemsPerPage >
&& data.PagingCurrentPage > )
{
sql += string.Format(" rows {0} to {1}", data.GetFromItems(), data.GetToItems());
} return sql;
} public string GetSqlForInsertBuilder(BuilderData data)
{
return new InsertBuilderSqlGenerator().GenerateSql(this, "@", data);
} public string GetSqlForUpdateBuilder(BuilderData data)
{
return new UpdateBuilderSqlGenerator().GenerateSql(this, "@", data);
} public string GetSqlForDeleteBuilder(BuilderData data)
{
return new DeleteBuilderSqlGenerator().GenerateSql(this, "@", data);
} public string GetSqlForStoredProcedureBuilder(BuilderData data)
{
return data.ObjectName;
} public DataTypes GetDbTypeForClrType(Type clrType)
{
return new DbTypeMapper().GetDbTypeForClrType(clrType);
} public object ExecuteReturnLastId<T>(IDbCommand command, string identityColumnName = null)
{
if (identityColumnName == null) identityColumnName = "id"; string temp = command.Data.Sql.ToString().Trim();
if (temp.EndsWith(";"))
command.Data.Sql.Clear().Append(temp.Substring(, temp.Length - )); command.ParameterOut("FluentDataLastId", command.Data.Context.Data.FluentDataProvider.GetDbTypeForClrType(typeof(T)));
command.Sql(" returning " + identityColumnName); object lastId = null; command.Data.ExecuteQueryHandler.ExecuteQuery(false, () =>
{
command.Data.InnerCommand.ExecuteNonQuery(); lastId = command.ParameterValue<object>("FluentDataLastId");
}); return lastId;
} public void OnCommandExecuting(IDbCommand command)
{
} public string EscapeColumnName(string name)
{
return name;
}
}
}
具体调用方法: new DbContext().ConnectionString(connectionString, new FirebirdProvider(), FirebirdClientFactory.Instance)
DB2做法是: select IDENTITY_VAL_LOCAL() as LastId from sysibm.sysdummy1;
Mysql做法是: select LAST_INSERT_ID() as `LastInsertedId`
Oracle做法是:sql结尾添加输出参数 returning id into :FluentDataLastId
PgSql做法是: select lastval();
Sqlite做法是: select last_insert_rowid();
SqlCe做法是: select cast(@@identity as int)
SqlServer做法是: select SCOPE_IDENTITY()
===================================================
实体方法扩展:
public class Base
{
public long id { get; set; }
} public class T_session : Base
{
public string token { get; set; }
public long? user_id { get; set; }
public DateTime login_time { get; set; }
public DateTime? logout_time { get; set; }
public DateTime update_time { get; set; }
} public static class DbExt
{
public static long Insert(this Base enty, IDbContext db)
{
return db.Insert(enty.GetType().Name, enty).AutoMap(x => x.id).ExecuteReturnLastId<long>();
} public static int Update(this Base enty, IDbContext db)
{
return db.Update(enty.GetType().Name, enty).AutoMap(x => x.id).Where(x => x.id).Execute();
} public static int Delete(this Base enty, IDbContext db)
{
return db.Delete(enty.GetType().Name, enty).Where(x => x.id).Execute();
} }
Firebird Fluentdata的更多相关文章
- FluentData(微型ORM)
using FluentData; using System; using System.Collections.Generic; using System.Linq; using System.Te ...
- 在不安装mysql-connector-net的情况下使用FluentData框架
最近在开发项目中使用了FluentData框架,通过使用这个框架减少了很多开发的工作量,FluentData是一个轻量级的框架操作起来的自由度很大也少了很多负责的配置.但是在开发的时候发现一个问题就是 ...
- FireBird.conf配置文件常用参数
1.RootDirectory "写上Firebird服务器的安装路径" 如果不对FbServer服务是企动会出错的.2.DatabaseAcces 指的是访问Firebird数 ...
- EF for Firebird
今天用了Firebird,记录下怎么用,不然下次给忘记了 1.官网下载包 1.DDEXProvider-3.0.1.0.msi 2.FirebirdSql.Data.FirebirdClient-4. ...
- [转载]Firebird与MySQL:一个使用者的体会
老板要我开发一个LINUX平台上的数据库项目,要求一定要用开源免费数据库.我知道这个数据库必须能够上网操作,同时作为公司的核心骨干数据库,除了必须是稳定的存储数据库外还必须有很强的数据和数据库控管功能 ...
- Firebird数据库系统的开发团队
下载Firebird3的发布文档,上面列出了开发团队,仔细看了看,原来俄罗斯人是主导(内核开发),法国人.智利人.巴西人.日本人.荷兰人.捷克人都有.共17人,3人全职. able 13.1. Fir ...
- Firebird数据库的Select语句
select first 10 skip 8 * from t_data //跳过前8行不要,取10行,即取第9行到18行共10行 select first 10 * from t_data ...
- 【收藏】Firebird知识
本代码在:WinXp Pack 3 + Delphi2009 updata1 火鸟Firebird2.5.0.23247下测试通过.使用了Data Access面板的组件用SQL进行操作作者:LAH ...
- 微型orm fluentdata
http://fluentdata.codeplex.com/documentation#Query
随机推荐
- ZKEACMS 模板组件扩展
前言 如果你还不知道ZKEACMS,不妨先了解一下. ASP.NET MVC 开源建站系统 ZKEACMS 推荐,从此网站“拼”起来 官方地址:http://www.zkea.net/zkeacms ...
- Tomcat源码(一):整体架构
由于tomcat的组件较多,处理流程比较复杂 ,这里是 由浅到深来解释tomcat的整体架构 1.首先应该大致了解下tomcat的 /conf/server.xml 配置文件:在tomcat启动的时 ...
- python3 的zip()函数
重点 https://blog.csdn.net/qq826364410/article/details/78259796 为啥会出现几个两个空列表????
- How to mount a remote directory in Linux using sshfs
Q. I have access rights to one of the remote server through SSH protocol and there is no File share ...
- TCP协议中URG和PSH位
URG(紧急位):设置为1时,首部中的紧急指针有效:为0时,紧急指针没有意义. PSH(推位):当设置为1时,要求把数据尽快的交给应用层,不做处理 通常的数据中都会带有PSH但URG只在紧急数据的时设 ...
- Archlinux 下系统如何设置让 Wine 调用 ibus输入法
前言: 如果你是fcitx输入法用户,那么这篇文章大可不必看.fcitx是一个非常强大的框架,著名搜狗输入法就是基于fcitx输入法架构开发的.据我所知.您遇到这个问题可以通过卸载ibus输入法进行修 ...
- nginx高性能WEB服务器系列之一简介及安装
nginx系列友情链接:nginx高性能WEB服务器系列之一简介及安装https://www.cnblogs.com/maxtgood/p/9597596.htmlnginx高性能WEB服务器系列之二 ...
- webpack中设置jquery为全局对象
通过npm安装jquery npm install jquery -D 然后配置webpack-config.js plugins: [ new webpack.ProvidePlugin({ $: ...
- css加载顺序
最近发现个有意思的事情,印象中的是css中class后面会覆盖前面的, 于是写了代码 div{ width: 100px; height: 100px; } .red{ background-colo ...
- 最新 php oracle 数据库连接 数据库分页
php 5连接 oracle 10g php oracle 分页 <?php//buyicode studio 20/12/2009//总记录数$sql = "select ROWNU ...