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的更多相关文章

  1. FluentData(微型ORM)

    using FluentData; using System; using System.Collections.Generic; using System.Linq; using System.Te ...

  2. 在不安装mysql-connector-net的情况下使用FluentData框架

    最近在开发项目中使用了FluentData框架,通过使用这个框架减少了很多开发的工作量,FluentData是一个轻量级的框架操作起来的自由度很大也少了很多负责的配置.但是在开发的时候发现一个问题就是 ...

  3. FireBird.conf配置文件常用参数

    1.RootDirectory  "写上Firebird服务器的安装路径" 如果不对FbServer服务是企动会出错的.2.DatabaseAcces 指的是访问Firebird数 ...

  4. EF for Firebird

    今天用了Firebird,记录下怎么用,不然下次给忘记了 1.官网下载包 1.DDEXProvider-3.0.1.0.msi 2.FirebirdSql.Data.FirebirdClient-4. ...

  5. [转载]Firebird与MySQL:一个使用者的体会

    老板要我开发一个LINUX平台上的数据库项目,要求一定要用开源免费数据库.我知道这个数据库必须能够上网操作,同时作为公司的核心骨干数据库,除了必须是稳定的存储数据库外还必须有很强的数据和数据库控管功能 ...

  6. Firebird数据库系统的开发团队

    下载Firebird3的发布文档,上面列出了开发团队,仔细看了看,原来俄罗斯人是主导(内核开发),法国人.智利人.巴西人.日本人.荷兰人.捷克人都有.共17人,3人全职. able 13.1. Fir ...

  7. Firebird数据库的Select语句

    select first 10 skip 8 * from t_data   //跳过前8行不要,取10行,即取第9行到18行共10行 select  first 10 * from t_data   ...

  8. 【收藏】Firebird知识

    本代码在:WinXp Pack 3 + Delphi2009 updata1 火鸟Firebird2.5.0.23247下测试通过.使用了Data Access面板的组件用SQL进行操作作者:LAH ...

  9. 微型orm fluentdata

    http://fluentdata.codeplex.com/documentation#Query

随机推荐

  1. SQL Server 隐式转换引发的死锁

    在SQL Server的应用开发过程(尤其是二次开发)中可能由于开发人员对表的结构不够了解,造成开发过程中使用了不合理的方式造成数据库引擎未按预定执行,以致影响业务.这是非常值得注意的.这次为大家介绍 ...

  2. jvisualvm_使用jstatd连接远程linux应用

    [1]确定linux系统正确安装了ssh # sudo ps -e | grep ssh ①注意使用root,使用$会报如下错误: [appadmin@webcsuat2 ~]$ sudo ps -e ...

  3. MyEclipse迁移过程中Tomcat版本不一致的解决办法

    MyEclipse迁移过程中Tomcat版本不一致的解决办法 下面就是在MyEclipse2013迁移被Tomcat6.0X绑定的项目迁移到MyEclipse2014 Tomcat8.0X,报如下pr ...

  4. 条目二十二《切勿修改set或multiset的键》

    条目二十二<切勿修改set或multiset的键> 所有的标准关联容器一样,set和multiset按照一定的顺序来存放自己的元素,而这些容器的正确行为也是建立在其元素保持有序的基础之上的 ...

  5. Boost内存池使用与测试

    目录 Boost内存池使用与测试 什么是内存池 内存池的应用场景 安装 内存池的特征 无内存泄露 申请的内存数组没有被填充 任何数组内存块的位置都和使用operator new[]分配的内存块位置一致 ...

  6. Python解释器的配置

    1.准备工作 安装好Pycharm2017版本 电脑上安装好Python解释器 2.本地解释器配置 配置本地解释器的步骤相对简洁直观: (1)单击工具栏中的设置按钮. (2)在Settings/Pre ...

  7. SQL数据库Truncate的相关用法

    数据库中 Truncate的用法:这个是删除表中的所有数据语法是 Truncate Table tablename他与delete的区别在于1 delete 可以有条件的删除 而truncate 是删 ...

  8. python自动化day3-函数、递归、内置函数

    一.什么是函数 修理工===>程序员 具备某一功能的工具===>函数 要想使用工具,需要事先准备好,然后拿来就用且可以重复使用要想用函数,需要先定义,再使用 二.函数基础 1.函数分类 # ...

  9. java多线程-ReadWriteLock

    大纲: ReadWriteLock接口 ReentrantReadWriteLock ReentrantReadWriteLock使用 一.ReadWriteLock public interface ...

  10. $bzoj1025-SCOI2009$游戏 群论 $dp$

    题面描述 \(windy​\)学会了一种游戏.对于\(1​\)到\(N​\)这\(N​\)个数字,都有唯一且不同的1到N的数字与之对应.最开始\(windy​\)把数字按顺序\(1,2,3,\cdot ...