- 增加 FreeSql.Provider.Firebird 数据库实现 #443;

This commit is contained in:
28810
2020-09-12 05:46:53 +08:00
parent 020eddb315
commit 951e917015
55 changed files with 12407 additions and 211 deletions

View File

@ -106,6 +106,9 @@ namespace FreeSql.Internal.CommonProvider
case DataType.OdbcOracle:
ExecuteNonQuery(" SELECT 1 FROM dual");
return true;
case DataType.Firebird:
ExecuteNonQuery(" SELECT FIRST 1 1 FROM rdb$database");
return true;
}
ExecuteNonQuery(" SELECT 1");
return true;

View File

@ -24,6 +24,9 @@ namespace FreeSql.Internal.CommonProvider
case DataType.OdbcOracle:
await ExecuteNonQueryAsync(" SELECT 1 FROM dual");
return true;
case DataType.Firebird:
await ExecuteNonQueryAsync(" SELECT FIRST 1 1 FROM rdb$database");
return true;
}
await ExecuteNonQueryAsync(" SELECT 1");
return true;

View File

@ -145,6 +145,12 @@ namespace FreeSql.Internal.CommonProvider
{
if (didx > 0) sb.Append(" \r\nUNION ALL\r\n ");
sb.Append("SELECT ");
switch (_orm.Ado.DataType)
{
case DataType.Firebird:
sb.Append("FIRST 1 ");
break;
}
var colidx2 = 0;
foreach (var col in _table.Columns.Values)
{
@ -167,6 +173,9 @@ namespace FreeSql.Internal.CommonProvider
case DataType.Dameng:
sb.Append(" FROM dual");
break;
case DataType.Firebird:
sb.Append(" FROM rdb$database");
break;
}
++didx;
}

View File

@ -522,10 +522,11 @@ namespace FreeSql.Internal.CommonProvider
return this;
}
public virtual string ToSql() => ToSqlValuesOrSelectUnionAll(true);
public virtual string ToSql() => ToSqlValuesOrSelectUnionAllExtension102(true, null, null);
public string ToSqlValuesOrSelectUnionAll(bool isValues = true) => ToSqlValuesOrSelectUnionAllExtension101(isValues, null);
public string ToSqlValuesOrSelectUnionAllExtension101(bool isValues, Action<object, int, StringBuilder> onrow)
public string ToSqlValuesOrSelectUnionAll(bool isValues = true) => ToSqlValuesOrSelectUnionAllExtension102(isValues, null, null);
public string ToSqlValuesOrSelectUnionAllExtension101(bool isValues, Action<object, int, StringBuilder> onrow) => ToSqlValuesOrSelectUnionAllExtension102(isValues, null, onrow);
public string ToSqlValuesOrSelectUnionAllExtension102(bool isValues, Action<object, int, StringBuilder> onrowPre, Action<object, int, StringBuilder> onrow)
{
if (_source == null || _source.Any() == false) return null;
var sb = new StringBuilder();
@ -549,6 +550,7 @@ namespace FreeSql.Internal.CommonProvider
{
if (didx > 0) sb.Append(isValues ? ", " : " \r\nUNION ALL\r\n ");
sb.Append(isValues ? "(" : "SELECT ");
onrowPre?.Invoke(d, didx, sb);
var colidx2 = 0;
foreach (var col in _table.Columns.Values)
{

View File

@ -287,6 +287,7 @@ namespace FreeSql.Internal.CommonProvider
case DataType.OdbcDameng: //达梦不能这样
case DataType.Oracle:
case DataType.OdbcOracle:
case DataType.Firebird:
break;
default:
_select = "SELECT ";
@ -334,6 +335,7 @@ namespace FreeSql.Internal.CommonProvider
case DataType.OdbcDameng: //达梦不能这样
case DataType.Oracle:
case DataType.OdbcOracle:
case DataType.Firebird:
break;
default:
var beforeSql = this._select;
@ -359,6 +361,7 @@ namespace FreeSql.Internal.CommonProvider
case DataType.OdbcDameng: //达梦不能这样
case DataType.Oracle:
case DataType.OdbcOracle:
case DataType.Firebird:
break;
default:
var beforeSql = this._select;
@ -648,6 +651,9 @@ namespace FreeSql.Internal.CommonProvider
case DataType.ShenTong: //神通测试中发现,不支持 nowait
_tosqlAppendContent = " for update";
break;
case DataType.Firebird:
_tosqlAppendContent = " for update with lock";
break;
}
return this as TSelect;
}

View File

@ -275,6 +275,11 @@ namespace FreeSql.Internal
if (strlen < 0) colattr.DbType = "LONGTEXT";
else colattr.DbType = Regex.Replace(colattr.DbType, charPatten, $"$1({strlen})");
break;
case DataType.Firebird:
charPatten = @"(CHAR|CHAR2|CHARACTER|TEXT)\s*(\([^\)]*\))?";
if (strlen < 0) colattr.DbType = "BLOB SUB_TYPE 1";
else colattr.DbType = Regex.Replace(colattr.DbType, charPatten, $"$1({strlen})");
break;
}
}
if (colattr.MapType == typeof(byte[]) && colattr.StringLength != 0)
@ -318,6 +323,9 @@ namespace FreeSql.Internal
if (strlen < 0) colattr.DbType = "BLOB";
else colattr.DbType = Regex.Replace(colattr.DbType, bytePatten, $"$1({strlen})");
break;
case DataType.Firebird:
colattr.DbType = "BLOB";
break;
}
}
if (colattr.MapType == typeof(decimal) && colattr.Precision > 0)