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
随机推荐
- django学习篇
https://www.cnblogs.com/alex3714/category/818260.html https://www.cnblogs.com/zhanghongfeng/catego ...
- kvm linux虚拟机在线扩展磁盘
说明: 1) vmware ESXi虚拟化平台也支持这台在线扩展磁盘功能. 2) kvm虚拟机也支持在线扩展磁盘功能,在线扩展有特定的使用环境,主要用于不能随便停用的生产环境中. 3) 经过测试KVM ...
- KVM虚拟化之windows虚拟机性能调整
通过KVM安装WindowsXP/2003/7/2008操作系统后,由于默认的磁盘驱动(IDE)性能与网卡驱动(RTL8139100M)的性能都极其低下,需要调整,通过加载Redhatvirtio驱动 ...
- PHP程序执行流程
1, PHP文件一定放在服务器的,但是PHP中不同的内容会在不同的地方执行.下图演示了浏览器请求一个php页面的流程. 2,时序图如下所示,在浏览器中输入url后,首先去本机hosts文件中解析ip地 ...
- 多张表进行关联查询---->删除某个数据的时候出现还有子记录的提示
多张表进行关联查询的时候,当某张表里面的一个字段在另外一张表有定义,就相当于一张表是另外一张表的子表:比如现在开发所遇到的一个问题: 这个是在删除sys_user表的里面的数据的时候出现的问题,因为s ...
- 通过Nginx部署Django
Django的部署可以有很多方式,采用nginx+uwsgi的方式是其中比较常见的一种方式. 在这种方式中,我们的通常做法是,将nginx作为服务器最前端,它将接收WEB的所有请求,统一管理请求.ng ...
- Python的编码详解
一. 编码介绍 计算机只能处理数字(最底层的0和1),如果要处理文本,就必须将文本转换为数字才能处理.最早的计算机在设计时采用8个比特(bit)作为一个字节(byte),所以一个字节能表示的最大整数就 ...
- 关于云主机Thinkphp框架Session跨页失效的问题
在网站部署到云主机之后,前台一直能够正常显示,后台确登录不上去,验证码也无法显示,研究半天,才确定是Session跨页传递失效的问题.找网上各种解决方法,都是关于Php.ini文件的设置,可又解决不了 ...
- CSS: Multiple Attribute Selector [name="value"][name2="value2"]
this.document.querySelectorAll('div[id*="dayselector"][class*="x-autocontainer-innerC ...
- ubuntu下Android反编译详细教程-apktool,dex2jar,jd-gui的使用
转载请注明出处:http://blog.csdn.net/fightlei/article/details/52432161 最近在学习Android反编译的一些知识,虽然在网上搜到了很多相关的文章, ...