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
随机推荐
- C#中匿名函数、委托delegate和Action、Func、Expression、还有Lambda的关系和区别
以前一直迷迷糊糊的,现在总算搞明白. Lambda表达式 Lamda表达式基本写法是()=>{ };Lambda和方法一样都可以传入参数和拥有返回值.(int x)=>{return x; ...
- dom4j学习总结(一)
dom4j学习总结(一) (一)创建Document的基本操作 /** * xml基本操作 */ public void BaseOperation(){ //创建一个document Doc ...
- 201621123023《Java程序设计》第6周学习总结
一.本周学习总结 1.1 面向对象学习暂告一段落,请使用思维导图,以封装.继承.多态为核心概念画一张思维导图或相关笔记,对面向对象思想进行一个总结. 二.书面作业 1. clone方法 1.1 在te ...
- Linux centos 6.4安装
Linux系统安装: 开启虚拟机: 界面说明:Install or upgrade an existing system 安装或升级现有的系统install system with basic vid ...
- 案例1-合并2个不同文件夹中的csv文件到另外一个目录,相同的文件名进行数据合并,不同的文件名直接移到新文件夹
发现在ubuntu和centos中有些命令还不一样,比如<<<可在centos中使用,但是ubuntu中不行 csv文件名以及格式如下 3669_20180121.csv 总笔数,2 ...
- java多线程那点事
屌丝程序员们对自己的技术能力总是毫不掩饰的高调,更有甚者每当完成一个简单的功能或算法实现,恨不得从工位上跳起来,生怕谁不知道一样,心情能理解,但个人完全鄙视这种行为.说到底,大家日常的coding,大 ...
- UITableView编辑模式
UITableView有两种模式,普通模式和编辑模式.在编辑模式下可以对cell进行排序.删除.插入等等. 如何进入编辑模式 调用tableView的setEditing(editing: Bool, ...
- Review notes
- [jvm]运行时数据区域详解
了解虚拟机是怎么使用内存的,有助于我们解决和排查内存泄漏和溢出方面的问题.详解java虚拟机内存的各个区域,分析这些区域的作用服务对象以及可能发生的问题. 一.运行时数据区域 java虚拟机在执行ja ...
- 1.ajax简单实现异步交互
效果:点击获取信息 testAjax.jsp: <%@ page language="java" contentType="text/html; charset=U ...