mirror of
				https://github.com/nsnail/FreeSql.git
				synced 2025-11-04 17:20:49 +08:00 
			
		
		
		
	- 增加 FreeSql.Provider.Firebird 数据库实现 #443;
This commit is contained in:
		@@ -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;
 | 
			
		||||
 
 | 
			
		||||
@@ -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;
 | 
			
		||||
 
 | 
			
		||||
@@ -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;
 | 
			
		||||
            }
 | 
			
		||||
 
 | 
			
		||||
@@ -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)
 | 
			
		||||
                {
 | 
			
		||||
 
 | 
			
		||||
@@ -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;
 | 
			
		||||
        }
 | 
			
		||||
 
 | 
			
		||||
@@ -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)
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user