示例#1
0
		protected FbCommand BuildCommand(FbConnection connection, string collectionName, string[] restrictions)
		{
			string          filter = String.Format("CollectionName='{0}'", collectionName);
			StringBuilder	builder = this.GetCommandText(restrictions);
			DataRow[]       restriction = connection.GetSchema(DbMetaDataCollectionNames.Restrictions).Select(filter);
			FbTransaction	transaction = connection.InnerConnection.ActiveTransaction;
			FbCommand		command	= new FbCommand(builder.ToString(), connection, transaction);

			if (restrictions != null && restrictions.Length > 0)
			{
				int index = 0;

				for (int i = 0; i < restrictions.Length; i++)
				{
					string rname = restriction[i]["RestrictionName"].ToString();
					if (restrictions[i] != null)
					{
						// Catalog, Schema and TableType are no real restrictions
						if (!rname.EndsWith("Catalog") && !rname.EndsWith("Schema") && rname != "TableType")
						{
							string pname = String.Format(CultureInfo.CurrentUICulture, "@p{0}", index++);

							command.Parameters.Add(pname, FbDbType.VarChar, 255).Value = restrictions[i];
						}
					}
				}
			}					

			return command;
		}
示例#2
0
        override internal void LoadForTable()
        {
            try
            {
                FbConnection cn = new FirebirdSql.Data.FirebirdClient.FbConnection(this._dbRoot.ConnectionString);
                cn.Open();
                DataTable metaData = cn.GetSchema("Columns", new string[] { null, null, this.Table.Name });

                DataColumn c;
                if (!metaData.Columns.Contains("IS_AUTO_KEY"))
                {
                    c = metaData.Columns.Add("IS_AUTO_KEY", typeof(Boolean)); c.DefaultValue = false;
                }
                if (!metaData.Columns.Contains("AUTO_KEY_SEED"))
                {
                    c = metaData.Columns.Add("AUTO_KEY_SEED"); c.DefaultValue = 0;
                }
                if (!metaData.Columns.Contains("AUTO_KEY_INCREMENT"))
                {
                    c = metaData.Columns.Add("AUTO_KEY_INCREMENT"); c.DefaultValue = 0;
                }
                if (!metaData.Columns.Contains("AUTO_KEY_SEQUENCE"))
                {
                    c = metaData.Columns.Add("AUTO_KEY_SEQUENCE"); c.DefaultValue = string.Empty;
                }

                PopulateArray(metaData);
                LoadExtraData(cn, this.Table.Name, "T");
                cn.Close();
            }
            catch (Exception ex)
            {
                string m = ex.Message;
            }
        }
示例#3
0
文件: Indexes.cs 项目: zhh007/MyGen
        override internal void LoadAll()
        {
            try
            {
                using (FbConnection cn = new FirebirdSql.Data.FirebirdClient.FbConnection(this._dbRoot.ConnectionString))
                {
                    cn.Open();

                    DataTable idxMetaData = cn.GetSchema("Indexes", new string[] { null, null, this.Table.Name });

                    if (!idxMetaData.Columns.Contains("CARDINALITY"))
                    {
                        idxMetaData.Columns.Add("CARDINALITY");
                    }
                    if (!idxMetaData.Columns.Contains("COLUMN_NAME"))
                    {
                        idxMetaData.Columns.Add("COLUMN_NAME");
                    }

                    idxMetaData.Columns["IS_UNIQUE"].ColumnName  = "UNIQUE";
                    idxMetaData.Columns["INDEX_TYPE"].ColumnName = "TYPE";

                    DataTable metaData = idxMetaData.Clone();
                    metaData.Clear();
                    foreach (DataRow row in idxMetaData.Rows)
                    {
                        string    indexName       = (string)row["INDEX_NAME"];
                        DataTable metaDataColumns = cn.GetSchema("IndexColumns", new string[] { null, null, null, indexName });
                        metaDataColumns.DefaultView.Sort = "ORDINAL_POSITION ASC";
                        foreach (DataRowView vrow in metaDataColumns.DefaultView)
                        {
                            DataRow newrow = metaData.Rows.Add(row.ItemArray);
                            newrow["CARDINALITY"] = vrow["ORDINAL_POSITION"];
                            newrow["COLUMN_NAME"] = vrow["COLUMN_NAME"];
                        }
                    }
                    cn.Close();

                    PopulateArray(metaData);
                }
            }
            catch (Exception ex)
            {
                string m = ex.Message;
            }
        }
示例#4
0
		private static List<TableSchema> GetTables(FbConnection con)
		{
			string[] restrict3 = {null, null, null};
			string[] restrict4 = {null, null, null, null};
			var aStore = new List<TableSchema>();

			restrict4[0] = null;
			restrict4[1] = null;
			restrict4[2] = null;
			restrict4[3] = "TABLE";
			var dtTables = con.GetSchema("Tables", restrict4);
			for (var i = 0; i < dtTables.Rows.Count; i++)
			{
				var tRow = dtTables.Rows[i];
				var eTable = new TableSchema {Name = tRow["TABLE_NAME"].ToString()};
				// Columns
				restrict3[0] = null;
				restrict3[1] = null;
				restrict3[2] = eTable.Name;
				var dtShema = con.GetSchema("Columns", restrict3);
				if (dtShema.Rows.Count > 0)
					eTable.Columns = new TableColumnSchema[dtShema.Rows.Count];
				for (var j = 0; j < dtShema.Rows.Count; j++)
				{
					var cRow = dtShema.Rows[j];

					var eColumn = new TableColumnSchema
									{
									Name = cRow["COLUMN_NAME"].ToString(),
									Size = Convert.ToInt32(cRow["COLUMN_SIZE"], CultureInfo.InvariantCulture),
									Type = TypeFbToDbsm(cRow["COLUMN_DATA_TYPE"].ToString()),
									Nullable = Convert.ToBoolean(cRow["IS_NULLABLE"], CultureInfo.InvariantCulture)
									};
					eColumn.DefaultValue = HelpDbscColumnDefault(con, eColumn.Name, eTable.Name);
					eColumn.DefaultValue = string.IsNullOrEmpty(eColumn.DefaultValue) ? null : eColumn.DefaultValue;
					eColumn.DecimalPrecision = cRow["NUMERIC_PRECISION"] == DBNull.Value
												? 0
												: Convert.ToInt32(cRow["NUMERIC_PRECISION"], CultureInfo.InvariantCulture);
					eColumn.DecimalScale = Convert.ToInt32(cRow["NUMERIC_SCALE"], CultureInfo.InvariantCulture);

					eTable.Columns[j] = eColumn;
				}
				aStore.Add(eTable);
			}
			return aStore;
		}
示例#5
0
		override internal void LoadAll()
		{
			try
			{
                using (FbConnection cn = new FirebirdSql.Data.FirebirdClient.FbConnection(this._dbRoot.ConnectionString))
                {
                    cn.Open();
                    
                    DataTable idxMetaData = cn.GetSchema("Indexes", new string[] { null, null, this.Table.Name });

                    if (!idxMetaData.Columns.Contains("CARDINALITY")) idxMetaData.Columns.Add("CARDINALITY");
                    if (!idxMetaData.Columns.Contains("COLUMN_NAME")) idxMetaData.Columns.Add("COLUMN_NAME");

                    idxMetaData.Columns["IS_UNIQUE"].ColumnName = "UNIQUE";
                    idxMetaData.Columns["INDEX_TYPE"].ColumnName = "TYPE";

                    DataTable metaData = idxMetaData.Clone();
                    metaData.Clear();
                    foreach (DataRow row in idxMetaData.Rows)
                    {
                        string indexName = (string)row["INDEX_NAME"];
                        DataTable metaDataColumns = cn.GetSchema("IndexColumns", new string[] { null, null, null, indexName });
                        metaDataColumns.DefaultView.Sort = "ORDINAL_POSITION ASC";
                        foreach (DataRowView vrow in metaDataColumns.DefaultView)
                        {
                            DataRow newrow = metaData.Rows.Add(row.ItemArray);
                            newrow["CARDINALITY"] = vrow["ORDINAL_POSITION"];
                            newrow["COLUMN_NAME"] = vrow["COLUMN_NAME"];
                        }
                    }
                    cn.Close();
                 
                    PopulateArray(metaData);
                }
			}
			catch(Exception ex)
			{
				string m = ex.Message;
			}
		}
示例#6
0
        internal override void LoadAll()
        {
            try
            {
                var cn = new FbConnection(_dbRoot.ConnectionString);
                cn.Open();
                DataTable metaData1 = cn.GetSchema("ForeignKeys", new[] {null, null, Table.Name});
                DataTable metaData2 = cn.GetSchema("ForeignKeys", new[] {null, null, null, null, null, Table.Name});
                cn.Close();

                DataRowCollection rows = metaData2.Rows;
                int count = rows.Count;
                for (int i = 0; i < count; i++)
                {
                    metaData1.ImportRow(rows[i]);
                }

                PopulateArrayNoHookup(metaData1);

                ForeignKey key = null;
                string keyName = "";

                foreach (DataRow row in metaData1.Rows)
                {
                    keyName = row["FK_NAME"] as string;

                    key = GetByName(keyName);

                    key.AddForeignColumn(null, null, (string) row["PK_TABLE_NAME"], (string) row["PK_COLUMN_NAME"], true);
                    key.AddForeignColumn(null, null, (string) row["FK_TABLE_NAME"], (string) row["FK_COLUMN_NAME"],
                                         false);
                }
            }
            catch (Exception ex)
            {
                string m = ex.Message;
            }
        }
示例#7
0
		override internal void LoadAll()
		{
			try
			{
				FbConnection cn = new FirebirdSql.Data.FirebirdClient.FbConnection(this._dbRoot.ConnectionString);
				cn.Open();
				DataTable metaData = cn.GetSchema("Procedures", new string[] {this.Database.Name});
				cn.Close();

				PopulateArray(metaData);
			}
			catch(Exception ex)
			{
				string m = ex.Message;
			}
		}
示例#8
0
        override internal void LoadAll()
        {
            try
            {
                FbConnection cn = new FirebirdSql.Data.FirebirdClient.FbConnection(this._dbRoot.ConnectionString);
                cn.Open();
                DataTable metaData = cn.GetSchema("Procedures", new string[] { this.Database.Name });
                cn.Close();

                PopulateArray(metaData);
            }
            catch (Exception ex)
            {
                string m = ex.Message;
            }
        }
示例#9
0
        internal override void LoadAll()
        {
            try
            {
                var cn = new FbConnection(_dbRoot.ConnectionString);
                cn.Open();
                DataTable metaData = cn.GetSchema("Procedures", new[] {Database.Name});
                cn.Close();

                PopulateArray(metaData);
            }
            catch (Exception ex)
            {
                string m = ex.Message;
            }
        }
示例#10
0
        internal override void LoadForTable()
        {
            try
            {
                var cn = new FbConnection(_dbRoot.ConnectionString);
                cn.Open();
                DataTable metaData = cn.GetSchema("Columns", new[] {null, null, Table.Name});

                PopulateArray(metaData);
                LoadExtraData(cn, Table.Name, "T");
                cn.Close();
            }
            catch (Exception ex)
            {
                string m = ex.Message;
            }
        }
示例#11
0
        override internal void LoadAll()
        {
            try
            {
                FbConnection cn = new FirebirdSql.Data.FirebirdClient.FbConnection(this._dbRoot.ConnectionString);
                cn.Open();
                DataTable metaData = cn.GetSchema("Views", new string[] { null, null, null });
                cn.Close();

                metaData.Columns["VIEW_NAME"].ColumnName = "TABLE_NAME";

                PopulateArray(metaData);
            }
            catch (Exception ex)
            {
                string m = ex.Message;
            }
        }
示例#12
0
		override internal void LoadAll()
		{
			try
			{
				string type = this.dbRoot.ShowSystemData ? "SYSTEM TABLE" : "TABLE";

				FbConnection cn = new FirebirdSql.Data.FirebirdClient.FbConnection(this._dbRoot.ConnectionString);
				cn.Open();
				DataTable metaData = cn.GetSchema("Tables", new string[] {null, null, null, type});
				cn.Close();

				PopulateArray(metaData);
			}
			catch(Exception ex)
			{
				string m = ex.Message;
			}
		}
示例#13
0
		override internal void LoadForView()
		{
			try
			{
				FbConnection cn = new FirebirdSql.Data.FirebirdClient.FbConnection(this._dbRoot.ConnectionString);
				cn.Open();

				DataTable metaData = cn.GetSchema("Columns", new string[] {null, null, this.View.Name});

                PopulateArray(metaData);
				LoadExtraData(cn, this.View.Name, "V");
				cn.Close();				
			}
			catch(Exception ex)
			{
				string m = ex.Message;
			}
		}
示例#14
0
        internal override void LoadAll()
        {
            try
            {
                string type = dbRoot.ShowSystemData ? "SYSTEM TABLE" : "TABLE";

                var cn = new FbConnection(_dbRoot.ConnectionString);
                cn.Open();
                DataTable metaData = cn.GetSchema("Tables", new[] {null, null, null, type});
                cn.Close();

                PopulateArray(metaData);
            }
            catch (Exception ex)
            {
                string m = ex.Message;
            }
        }
示例#15
0
文件: Tables.cs 项目: zxbe/OMeta
        override internal void LoadAll()
        {
            try
            {
                string type = this.dbRoot.ShowSystemData ? "SYSTEM TABLE" : "TABLE";

                FbConnection cn = new FirebirdSql.Data.FirebirdClient.FbConnection(this._dbRoot.ConnectionString);
                cn.Open();
                DataTable metaData = cn.GetSchema("Tables", new string[] { null, null, null, type });
                cn.Close();

                PopulateArray(metaData);
            }
            catch (Exception ex)
            {
                string m = ex.Message;
            }
        }
示例#16
0
        override internal void LoadForView()
        {
            try
            {
                FbConnection cn = new FirebirdSql.Data.FirebirdClient.FbConnection(this._dbRoot.ConnectionString);
                cn.Open();

                DataTable metaData = cn.GetSchema("Columns", new string[] { null, null, this.View.Name });

                PopulateArray(metaData);
                LoadExtraData(cn, this.View.Name, "V");
                cn.Close();
            }
            catch (Exception ex)
            {
                string m = ex.Message;
            }
        }
示例#17
0
		override internal void LoadAll()
		{
			try
			{
				FbConnection cn = new FirebirdSql.Data.FirebirdClient.FbConnection(this._dbRoot.ConnectionString);
				cn.Open();
				DataTable metaData = cn.GetSchema("Views", new string[] {null, null, null});
				cn.Close();

				metaData.Columns["VIEW_NAME"].ColumnName = "TABLE_NAME";

				PopulateArray(metaData);
			}
			catch(Exception ex)
			{
				string m = ex.Message;
			}
		}
示例#18
0
        internal override void LoadAll()
        {
            try
            {
                var cn = new FbConnection(_dbRoot.ConnectionString);
                cn.Open();
                DataTable metaData = cn.GetSchema("Indexes", new[] {null, null, Table.Name});
                cn.Close();

                metaData.Columns["IS_UNIQUE"].ColumnName = "UNIQUE";
                metaData.Columns["INDEX_TYPE"].ColumnName = "TYPE";
                metaData.Columns["ORDINAL_POSITION"].ColumnName = "CARDINALITY";
                PopulateArray(metaData);
            }
            catch (Exception ex)
            {
                string m = ex.Message;
            }
        }
示例#19
0
        override internal void LoadAll()
        {
            try
            {
                FbConnection cn = new FirebirdSql.Data.FirebirdClient.FbConnection(this._dbRoot.ConnectionString);
                cn.Open();
                DataTable metaData = cn.GetSchema("Domains", null);
                cn.Close();

                if (metaData.Columns.Contains("DOMAIN_DATA_TYPE"))
                {
                    metaData.Columns["DOMAIN_DATA_TYPE"].ColumnName = "DATA_TYPE";
                }

                PopulateArray(metaData);

                LoadExtraData(cn);
            }
            catch (Exception ex)
            {
                string m = ex.Message;
            }
        }
示例#20
0
		override internal void LoadForTable()
		{
			try
			{
				FbConnection cn = new FirebirdSql.Data.FirebirdClient.FbConnection(this._dbRoot.ConnectionString);
				cn.Open();
                DataTable metaData = cn.GetSchema("Columns", new string[] { null, null, this.Table.Name });

                DataColumn c;
                if (!metaData.Columns.Contains("IS_AUTO_KEY")) { c = metaData.Columns.Add("IS_AUTO_KEY", typeof(Boolean)); c.DefaultValue = false; }
                if (!metaData.Columns.Contains("AUTO_KEY_SEED")) { c = metaData.Columns.Add("AUTO_KEY_SEED"); c.DefaultValue = 0; }
                if (!metaData.Columns.Contains("AUTO_KEY_INCREMENT")) { c = metaData.Columns.Add("AUTO_KEY_INCREMENT"); c.DefaultValue = 0; }
                if (!metaData.Columns.Contains("AUTO_KEY_SEQUENCE")) { c = metaData.Columns.Add("AUTO_KEY_SEQUENCE"); c.DefaultValue = string.Empty; }

				PopulateArray(metaData);
				LoadExtraData(cn, this.Table.Name, "T");
				cn.Close();
			}
			catch(Exception ex)
			{
				string m = ex.Message;
			}
		}
示例#21
0
		override internal void LoadAll()
		{
			try
			{
				FbConnection cn = new FirebirdSql.Data.FirebirdClient.FbConnection(this._dbRoot.ConnectionString);
				cn.Open();
				DataTable metaData = cn.GetSchema("Domains", null);
				cn.Close();

				if(metaData.Columns.Contains("DOMAIN_DATA_TYPE"))
				{
					metaData.Columns["DOMAIN_DATA_TYPE"].ColumnName = "DATA_TYPE";
				}

				PopulateArray(metaData);
				
				LoadExtraData(cn);
			}
			catch(Exception ex)
			{
				string m = ex.Message;
			}
		}
示例#22
0
        override internal void LoadAll()
        {
            try
            {
                using (FbConnection cn = new FirebirdSql.Data.FirebirdClient.FbConnection(this._dbRoot.ConnectionString))
                {
                    cn.Open();
                    if (allFkData == null)
                    {
                        allFkData = cn.GetSchema("ForeignKeys");
                        allFkData.Columns.Add("COLUMN_NAME");
                        allFkData.Columns.Add("REFERENCED_COLUMN_NAME");
                        allFkData.Columns.Add("ORDINAL_POSITION");
                        allFkData.Columns.Add("DEFERRABILITY");

                        mappingHash = new NameValueCollection();
                        mappingHash["FK_TABLE_CATALOG"] = "TABLE_CATALOG";
                        mappingHash["FK_TABLE_SCHEMA"]  = "TABLE_SCHEMA";
                        mappingHash["FK_TABLE_NAME"]    = "TABLE_NAME";
                        mappingHash["PK_TABLE_CATALOG"] = "REFERENCED_TABLE_CATALOG";
                        mappingHash["PK_TABLE_SCHEMA"]  = "REFERENCED_TABLE_SCHEMA";
                        mappingHash["PK_TABLE_NAME"]    = "REFERENCED_TABLE_NAME";
                        mappingHash["ORDINAL"]          = "ORDINAL_POSITION";
                        mappingHash["UPDATE_RULE"]      = "UPDATE_RULE";
                        mappingHash["DELETE_RULE"]      = "DELETE_RULE";
                        mappingHash["PK_NAME"]          = "INDEX_NAME";
                        mappingHash["FK_NAME"]          = "CONSTRAINT_NAME";
                        mappingHash["DEFERRABILITY"]    = "DEFERRABILITY";
                    }

                    DataTable metaData = allFkData.Clone();
                    metaData.Clear();
                    foreach (DataRow row in allFkData.Rows)
                    {
                        if ((this.Table.Name == (string)row["TABLE_NAME"]) ||
                            (this.Table.Name == (string)row["REFERENCED_TABLE_NAME"]))
                        {
                            string indexName    = (string)row["INDEX_NAME"];
                            string refTableName = (string)row["REFERENCED_TABLE_NAME"];
                            string isDef        = (string)row["IS_DEFERRABLE"];
                            string initDef      = (string)row["INITIALLY_DEFERRED"];


                            row["DEFERRABILITY"] = (isDef == "NO" ? 3 : (initDef == "YES" ? 2 : 1));
                            DataTable metaDataColumns = cn.GetSchema("IndexColumns", new string[] { null, null, null, indexName });
                            metaDataColumns.DefaultView.Sort = "ORDINAL_POSITION ASC";

                            DataTable metaDataPKIndex = cn.GetSchema("Indexes", new string[] { null, null, refTableName });
                            metaDataPKIndex.DefaultView.RowFilter = "IS_PRIMARY = True";

                            string refPkIndexName = (string)metaDataPKIndex.DefaultView[0]["INDEX_NAME"];

                            DataTable metaDataColumnsRefPk = cn.GetSchema("IndexColumns", new string[] { null, null, null, refPkIndexName });
                            metaDataColumnsRefPk.DefaultView.Sort = "ORDINAL_POSITION ASC";

                            if (metaDataColumnsRefPk.Rows.Count == metaDataColumns.Rows.Count)
                            {
                                for (int i = 0; i < metaDataColumnsRefPk.Rows.Count; i++)
                                {
                                    DataRow newrow = metaData.Rows.Add(row.ItemArray);
                                    newrow["ORDINAL_POSITION"]       = metaDataColumnsRefPk.DefaultView[i]["ORDINAL_POSITION"];
                                    newrow["COLUMN_NAME"]            = metaDataColumns.DefaultView[i]["COLUMN_NAME"];
                                    newrow["REFERENCED_COLUMN_NAME"] = metaDataColumnsRefPk.DefaultView[i]["COLUMN_NAME"];
                                }
                            }
                        }
                    }
                    cn.Close();

                    PopulateArrayNoHookup(metaData, mappingHash);

                    ForeignKey key     = null;
                    string     keyName = "";

                    foreach (DataRow row in metaData.Rows)
                    {
                        keyName = row["CONSTRAINT_NAME"] as string;

                        key = this.GetByName(keyName);

                        key.AddForeignColumn(null, null, (string)row["TABLE_NAME"], (string)row["COLUMN_NAME"], false);
                        key.AddForeignColumn(null, null, (string)row["REFERENCED_TABLE_NAME"], (string)row["REFERENCED_COLUMN_NAME"], true);
                    }
                }
            }
            catch (Exception ex)
            {
                string m = ex.Message;
            }
        }
示例#23
0
		private void LoadExtraData(FbConnection cn, string name, string type)
		{
			try
			{
				int dialect = 1;
				object o = null;
				short scale = 0;

				try
				{
					FbConnectionStringBuilder cnString = new FbConnectionStringBuilder(cn.ConnectionString);
					dialect = cnString.Dialect;
				}
				catch {}

				// AutoKey Data
                Dictionary<string, object[]> autoKeyFields = new Dictionary<string, object[]>();
                DataTable triggers = cn.GetSchema("Triggers", new string[] {null, null, name});
                foreach (DataRow row in triggers.Rows)
                {
                    int isSystemTrigger = Convert.ToInt32(row["IS_SYSTEM_TRIGGER"]);
                    int isInactive = Convert.ToInt32(row["IS_INACTIVE"]);
                    int triggerType = Convert.ToInt32(row["TRIGGER_TYPE"]);

                    if ((isSystemTrigger == 0) && (isInactive == 0) && (triggerType == 1))
                    {
                        string source = row["SOURCE"].ToString();
                        int end = 0;
                        do
                        {
                            string field = null, generatorName = string.Empty;
                            int tmp, increment = 1, seed = 0;

                            end = source.IndexOf("gen_id(", end, StringComparison.CurrentCultureIgnoreCase);
                            if (end >= 0)
                            {
                                string s = source.Substring(0, end);
                                int start = s.LastIndexOf(".");
                                if (start >= 0 && start < end)
                                {
                                    field = s.Substring(start).Trim(' ', '.', '=').ToUpper();
                                }

                                int end2 = source.IndexOf(")", end);
                                string s2 = source.Substring(0, end2);
                                int start2 = s2.LastIndexOf(",");
                                if (start2 >= 0 && start2 < end2)
                                {
                                    if (int.TryParse(s2.Substring(start2 + 1).Trim(' ', ','), out tmp))
                                        increment = tmp;
                                    
                                    s2 = s2.Substring(0, start2);
                                    generatorName = s2.Substring(end + 7).Trim();
                                }


                                if (field != null)
                                {
                                    autoKeyFields[field] = new object[] { increment, seed, generatorName };
                                }

                                end += 7;
                            }
                        } while (end != -1);
                    }
                }

                string select = "select r.rdb$field_name, f.rdb$field_scale AS SCALE, f.rdb$computed_source AS IsComputed, f.rdb$field_type as FTYPE, f.rdb$field_sub_type AS SUBTYPE, f.rdb$dimensions AS DIM from rdb$relation_fields r, rdb$types t, rdb$fields f where r.rdb$relation_name='" + name + "' and f.rdb$field_name=r.rdb$field_source and t.rdb$field_name='RDB$FIELD_TYPE' and f.rdb$field_type=t.rdb$type order by r.rdb$field_position;";

                // Column Data
				FbDataAdapter adapter = new FbDataAdapter(select, cn);
				DataTable dataTable = new DataTable();
				adapter.Fill(dataTable);

				// Dimension Data
				string dimSelect = "select r.rdb$field_name AS Name , d.rdb$dimension as DIM, d.rdb$lower_bound as L, d.rdb$upper_bound as U from rdb$fields f, rdb$field_dimensions d, rdb$relation_fields r where r.rdb$relation_name='" + name + "' and f.rdb$field_name = d.rdb$field_name and f.rdb$field_name=r.rdb$field_source order by d.rdb$dimension;";

				FbDataAdapter dimAdapter = new FbDataAdapter(dimSelect, cn);
				DataTable dimTable = new DataTable();
				dimAdapter.Fill(dimTable);

				if(this._array.Count > 0)
				{
					Column col = this._array[0] as Column;

					f_TypeName = new DataColumn("TYPE_NAME", typeof(string));
					col._row.Table.Columns.Add(f_TypeName);

					f_TypeNameComplete = new DataColumn("TYPE_NAME_COMPLETE", typeof(string));
					col._row.Table.Columns.Add(f_TypeNameComplete);

					this.f_IsComputed = new DataColumn("IS_COMPUTED", typeof(bool));
					col._row.Table.Columns.Add(f_IsComputed);

					short ftype = 0;
					short dim = 0;
					DataRowCollection rows = dataTable.Rows;

					int count = this._array.Count;
					Column c = null;

					for( int index = 0; index < count; index++)
					{
						c = (Column)this[index];
                        if (autoKeyFields.ContainsKey(c.Name.ToUpper()))
                        {
                            c._row["IS_AUTO_KEY"] = true;
                            c._row["AUTO_KEY_INCREMENT"] = autoKeyFields[c.Name][0];
                            c._row["AUTO_KEY_SEED"] = autoKeyFields[c.Name][1];
                            c._row["AUTO_KEY_SEQUENCE"] = autoKeyFields[c.Name][2];
                        }
						if(!c._row.IsNull("DOMAIN_NAME"))
						{
							// Special Hack, if there is a domain 
							c._row["TYPE_NAME"]			 = c._row["DOMAIN_NAME"] as string;
							c._row["TYPE_NAME_COMPLETE"] = c._row["DOMAIN_NAME"] as string;

							o = rows[index]["IsComputed"];
							if(o != DBNull.Value)
							{
								c._row["IS_COMPUTED"] = true;
							}

							scale = (short)rows[index]["SCALE"];
							if(scale < 0)
							{
								c._row["NUMERIC_SCALE"] = Math.Abs(scale);
							}
							continue;
						}

						try
						{
							string bigint = c._row["COLUMN_DATA_TYPE"] as string;
							if(bigint.ToUpper() == "BIGINT")
							{
								c._row["TYPE_NAME"]			 = "BIGINT";
								c._row["TYPE_NAME_COMPLETE"] = "BIGINT";
								continue;
							}
						}
						catch {}

//		public const int blr_text		= 14;
//		public const int blr_text2		= 15;
//		public const int blr_short		= 7;
//		public const int blr_long		= 8;
//		public const int blr_quad		= 9;
//		public const int blr_int64		= 16;
//		public const int blr_float		= 10;
//		public const int blr_double		= 27;
//		public const int blr_d_float	= 11;
//		public const int blr_timestamp	= 35;
//		public const int blr_varying	= 37;
//		public const int blr_varying2	= 38;
//		public const int blr_blob		= 261;
//		public const int blr_cstring	= 40;
//		public const int blr_cstring2	= 41;
//		public const int blr_blob_id	= 45;
//		public const int blr_sql_date	= 12;
//		public const int blr_sql_time	= 13;

						// Step 1: DataTypeName
						ftype = (short)rows[index]["FTYPE"];

						switch(ftype)
						{
							case 7:
								c._row["TYPE_NAME"] = "SMALLINT";
								break;

							case 8:
								c._row["TYPE_NAME"] = "INTEGER";
								break;

							case 9:
								c._row["TYPE_NAME"] = "QUAD";
								break;

							case 10:
								c._row["TYPE_NAME"] = "FLOAT";
								break;

							case 11:
								c._row["TYPE_NAME"] = "DOUBLE PRECISION";
								break;

							case 12:
								c._row["TYPE_NAME"] = "DATE";
								break;

							case 13:
								c._row["TYPE_NAME"] = "TIME";
								break;

							case 14:
								c._row["TYPE_NAME"] = "CHAR";
								break;

							case 16:
								c._row["TYPE_NAME"] = "NUMERIC";
								break;

							case 27:
								c._row["TYPE_NAME"] = "DOUBLE PRECISION";
								break;

							case 35:

								if(dialect > 2)
								{
									c._row["TYPE_NAME"] = "TIMESTAMP";
								}
								else
								{
									c._row["TYPE_NAME"] = "DATE";
								}
								break;

							case 37:
								c._row["TYPE_NAME"] = "VARCHAR";
								break;

							case 40:
								c._row["TYPE_NAME"] = "CSTRING";
								break;

							case 261:
								short subtype = (short)rows[index]["SUBTYPE"];
								
								switch(subtype)
								{
									case 0:
										c._row["TYPE_NAME"] = "BLOB(BINARY)";
										break;
									case 1:
										c._row["TYPE_NAME"] = "BLOB(TEXT)";
										break;
									default:
										c._row["TYPE_NAME"] = "BLOB(UNKNOWN)";
										break;
								}
								break;
						}

						scale = (short)rows[index]["SCALE"];
						if(scale < 0)
						{
							c._row["TYPE_NAME"]     = "NUMERIC";
							c._row["NUMERIC_SCALE"] = Math.Abs(scale);
						}

						o = rows[index]["IsComputed"];
						if(o != DBNull.Value)
						{
							c._row["IS_COMPUTED"] = true;
						}

						// Step 2: DataTypeNameComplete
						string s = c._row["TYPE_NAME"] as string;
						switch(s)
						{
							case "VARCHAR":
							case "CHAR":
								c._row["TYPE_NAME_COMPLETE"] = s + "(" + c.CharacterMaxLength + ")";
								break;

							case "NUMERIC":

							switch((int)c._row["COLUMN_SIZE"])
							{
								case 2:
									c._row["TYPE_NAME_COMPLETE"] = s + "(4, " + c.NumericScale.ToString() + ")";
									break;
								case 4:
									c._row["TYPE_NAME_COMPLETE"] = s + "(9, " + c.NumericScale.ToString() + ")";
									break;
								case 8:
									c._row["TYPE_NAME_COMPLETE"] = s + "(15, " + c.NumericScale.ToString() + ")";
									break;
								default:
									c._row["TYPE_NAME_COMPLETE"] = "NUMERIC(18,0)";
									break;
							}
								break;

							case "BLOB(TEXT)":
							case "BLOB(BINARY)":
								c._row["TYPE_NAME_COMPLETE"] = "BLOB";
								break;

							default:
								c._row["TYPE_NAME_COMPLETE"] = s;
								break;
						}

						s = c._row["TYPE_NAME_COMPLETE"] as string;

						dim = 0;
						o = rows[index]["DIM"];
						if(o != DBNull.Value)
						{
							dim = (short)o;
						}

						if(dim > 0)
						{
							dimTable.DefaultView.RowFilter = "Name = '" + c.Name + "'";
							dimTable.DefaultView.Sort = "DIM";

							string a = "[";
							bool bFirst = true;

							foreach(DataRowView vrow in dimTable.DefaultView)
							{
								DataRow row = vrow.Row;

								if(!bFirst)	a += ",";

								a += row["L"].ToString() + ":" + row["U"].ToString();

								bFirst = false;
							}

							a += "]";

							c._row["TYPE_NAME_COMPLETE"] = s + a;

							c._row["TYPE_NAME"] = c._row["TYPE_NAME"] + ":A";
						}
					}
				}
			}
			catch(Exception ex)
			{
				string e = ex.Message;
			}
		}
示例#24
0
		private static List<DBGenerator> GetGenerators(FbConnection con)
		{
			using (var cmd = con.CreateCommand())
			{
				var generators = new List<DBGenerator>();

				string[] restrict4 = {null, null, null, null};

				restrict4[0] = null;
				restrict4[1] = null;
				restrict4[2] = null;
				restrict4[3] = null;

				var dtGenerators = con.GetSchema("Generators", restrict4);
				for (var i = 0; i < dtGenerators.Rows.Count; i++)
				{
					var trRow = dtGenerators.Rows[i];
					if (Convert.ToBoolean(trRow["IS_SYSTEM_GENERATOR"], CultureInfo.InvariantCulture))
						continue;

					var eGenerator = new DBGenerator
										{
											Name = trRow["GENERATOR_NAME"].ToString()
										};
					cmd.CommandText = $"SELECT gen_id(\"{eGenerator.Name}\", 0) FROM rdb$database";
					eGenerator.StartValue = Convert.ToInt32(cmd.ExecuteScalar(), CultureInfo.InvariantCulture);

					generators.Add(eGenerator);
				}

				return generators;
			}
		}
示例#25
0
        public static bool DatabaseHelperTableExists(string tableName)
        {
            FbConnection connection = new FbConnection(GetConnectionString());
            string[] restrictions = new string[4];
            restrictions[2] = tableName;
            connection.Open();
            DataTable table = connection.GetSchema("Tables", restrictions);
            connection.Close();
            if (table != null)
            {
                return (table.Rows.Count > 0);
            }

            return false;
        }
示例#26
0
        public override void RecreateDataBase()
        {
            // ConnectionString Builder
            FbConnectionStringBuilder csb = new FbConnectionStringBuilder();
            csb.DataSource = "localhost";
            csb.Dialect = 3;
            csb.Charset = "UTF8";
            csb.Pooling = false;
            csb.UserID = "SYSDBA"; // default user
            csb.Password = "******"; // default password

            string serverConnectionString = csb.ToString();
            csb.Database = csb.Database = FQDBFile;

            string databaseConnectionString = csb.ToString();

            Console.WriteLine("-------------------------");
            Console.WriteLine("Using Firebird Database  ");
            Console.WriteLine("-------------------------");

            base.RecreateDataBase();

            // Create simple user
            FbSecurity security = new FbSecurity();
            security.ConnectionString = serverConnectionString;
            var userData = security.DisplayUser(FbUserName);
            if (userData == null)
            {
                userData = new FbUserData();
                userData.UserName = FbUserName;
                userData.UserPassword = FbUserPass;
                security.AddUser(userData);
            }

            // Try to shutdown & delete database
            if (File.Exists(FQDBFile))
            {
                FbConfiguration configuration = new FbConfiguration();
                configuration.ConnectionString = databaseConnectionString;
                try
                {
                    configuration.DatabaseShutdown(FbShutdownMode.Forced, 0);
                    Thread.Sleep(1000);
                }
                finally
                {
                    File.Delete(FQDBFile);
                }
            }

            // Create the new DB
            FbConnection.CreateDatabase(databaseConnectionString, 4096, true, true);
            if (!File.Exists(FQDBFile)) throw new Exception("Database failed to create");

            // Create the Schema
            string script = @"
CREATE TABLE Users(
    UserId integer PRIMARY KEY NOT NULL, 
    Name varchar(200), 
    Age integer, 
    DateOfBirth timestamp, 
    Savings decimal(10,5),
    Is_Male smallint,
    UniqueId char(38),
    TimeSpan time,
    TestEnum varchar(10),
    HouseId integer,
    SupervisorId integer
                );
          
CREATE TABLE ExtraUserInfos(
    ExtraUserInfoId integer PRIMARY KEY NOT NULL, 
    UserId integer NOT NULL, 
    Email varchar(200), 
    Children integer 
);

CREATE TABLE Houses(
    HouseId integer PRIMARY KEY NOT NULL, 
    Address varchar(200)
);

CREATE TABLE CompositeObjects(
    Key1ID integer PRIMARY KEY NOT NULL, 
    Key2ID integer NOT NULL, 
    Key3ID integer NOT NULL, 
    TextData varchar(512), 
    DateEntered timestamp NOT NULL,
    DateUpdated timestamp  
);

CREATE GENERATOR USERS_USERID_GEN;
CREATE GENERATOR EXTRAUSERINFOS_ID_GEN;
CREATE GENERATOR HOUSES_HOUSEID_GEN;

SET TERM ^ ;

CREATE TRIGGER BI_USERS_USERID FOR USERS
ACTIVE BEFORE INSERT
POSITION 0
AS
BEGIN
  IF (NEW.USERID IS NULL) THEN
      NEW.USERID = GEN_ID(USERS_USERID_GEN, 1);
END^


CREATE TRIGGER BI_EXTRAUSERINFOS_ID1 FOR EXTRAUSERINFOS
ACTIVE BEFORE INSERT
POSITION 0
AS
BEGIN
  IF (NEW.EXTRAUSERINFOID IS NULL) THEN
      NEW.EXTRAUSERINFOID = GEN_ID(EXTRAUSERINFOS_ID_GEN, 1);
END^

CREATE TRIGGER BI_HOUSES_HOUSEID FOR HOUSES
ACTIVE BEFORE INSERT
POSITION 0
AS
BEGIN
  IF (NEW.HOUSEID IS NULL) THEN
      NEW.HOUSEID = GEN_ID(HOUSES_HOUSEID_GEN, 1);
END^

SET TERM ; ^

CREATE ROLE %role%;

GRANT SELECT, UPDATE, INSERT, DELETE ON Users TO ROLE %role%;
GRANT SELECT, UPDATE, INSERT, DELETE ON ExtraUserInfos TO ROLE %role%;
GRANT SELECT, UPDATE, INSERT, DELETE ON Houses TO ROLE %role%;
GRANT SELECT, UPDATE, INSERT, DELETE ON CompositeObjects TO ROLE %role%;

GRANT %role% TO %user%;
".Replace("%role%", FbRole).Replace("%user%", FbUserName);

/* 
 * Using new connection so that when a transaction is bound to Connection if it rolls back 
 * it doesn't blow away the tables
 */

            using (var conn = new FbConnection(databaseConnectionString))
            {
                FbScript fbScript = new FbScript(script);
                fbScript.Parse();
                FbBatchExecution fbBatch = new FbBatchExecution(conn, fbScript);
                fbBatch.Execute(true);

                conn.Open();
                Console.WriteLine("Tables (CreateDB): " + Environment.NewLine);
                var dt = conn.GetSchema("Tables", new[] {null, null, null, "TABLE"});
                foreach (DataRow row in dt.Rows)
                {
                    Console.WriteLine(row[2]);
                }

                conn.Close();
            }
        }
示例#27
0
		override internal void LoadAll()
		{
			try
			{
                using (FbConnection cn = new FirebirdSql.Data.FirebirdClient.FbConnection(this._dbRoot.ConnectionString))
                {
                    cn.Open();
                    if (allFkData == null)
                    {
                        allFkData = cn.GetSchema("ForeignKeys");
                        allFkData.Columns.Add("COLUMN_NAME");
                        allFkData.Columns.Add("REFERENCED_COLUMN_NAME");
                        allFkData.Columns.Add("ORDINAL_POSITION");
                        allFkData.Columns.Add("DEFERRABILITY");

                        mappingHash = new NameValueCollection();
                        mappingHash["FK_TABLE_CATALOG"] = "TABLE_CATALOG";
                        mappingHash["FK_TABLE_SCHEMA"] = "TABLE_SCHEMA";
                        mappingHash["FK_TABLE_NAME"] = "TABLE_NAME";
                        mappingHash["PK_TABLE_CATALOG"] = "REFERENCED_TABLE_CATALOG";
                        mappingHash["PK_TABLE_SCHEMA"] = "REFERENCED_TABLE_SCHEMA";
                        mappingHash["PK_TABLE_NAME"] = "REFERENCED_TABLE_NAME";
                        mappingHash["ORDINAL"] = "ORDINAL_POSITION";
                        mappingHash["UPDATE_RULE"] = "UPDATE_RULE";
                        mappingHash["DELETE_RULE"] = "DELETE_RULE";
                        mappingHash["PK_NAME"] = "INDEX_NAME";
                        mappingHash["FK_NAME"] = "CONSTRAINT_NAME";
                        mappingHash["DEFERRABILITY"] = "DEFERRABILITY";
                    }

                    DataTable metaData = allFkData.Clone();
                    metaData.Clear();
                    foreach (DataRow row in allFkData.Rows)
                    {
                        if ((this.Table.Name == (string)row["TABLE_NAME"]) ||
                            (this.Table.Name == (string)row["REFERENCED_TABLE_NAME"]))
                        {
                            string indexName = (string)row["INDEX_NAME"];
                            string refTableName = (string)row["REFERENCED_TABLE_NAME"];
                            string isDef = (string)row["IS_DEFERRABLE"];
                            string initDef = (string)row["INITIALLY_DEFERRED"];


                            row["DEFERRABILITY"] = (isDef == "NO" ? 3 : (initDef == "YES" ? 2 : 1));
                            DataTable metaDataColumns = cn.GetSchema("IndexColumns", new string[] { null, null, null, indexName });
                            metaDataColumns.DefaultView.Sort = "ORDINAL_POSITION ASC";

                            DataTable metaDataPKIndex = cn.GetSchema("Indexes", new string[] { null, null, refTableName });
                            metaDataPKIndex.DefaultView.RowFilter = "IS_PRIMARY = True";

                            string refPkIndexName = (string)metaDataPKIndex.DefaultView[0]["INDEX_NAME"];

                            DataTable metaDataColumnsRefPk = cn.GetSchema("IndexColumns", new string[] { null, null, null, refPkIndexName });
                            metaDataColumnsRefPk.DefaultView.Sort = "ORDINAL_POSITION ASC";

                            if (metaDataColumnsRefPk.Rows.Count == metaDataColumns.Rows.Count)
                            {
                                for (int i = 0; i < metaDataColumnsRefPk.Rows.Count; i++)
                                {
                                    DataRow newrow = metaData.Rows.Add(row.ItemArray);
                                    newrow["ORDINAL_POSITION"] = metaDataColumnsRefPk.DefaultView[i]["ORDINAL_POSITION"];
                                    newrow["COLUMN_NAME"] = metaDataColumns.DefaultView[i]["COLUMN_NAME"];
                                    newrow["REFERENCED_COLUMN_NAME"] = metaDataColumnsRefPk.DefaultView[i]["COLUMN_NAME"];
                                }
                            }
                        }
                    }
                    cn.Close();

                    PopulateArrayNoHookup(metaData, mappingHash);

                    ForeignKey key = null;
                    string keyName = "";

                    foreach (DataRow row in metaData.Rows)
                    {
                        keyName = row["CONSTRAINT_NAME"] as string;

                        key = this.GetByName(keyName);

                        key.AddForeignColumn(null, null, (string)row["TABLE_NAME"], (string)row["COLUMN_NAME"], false);
                        key.AddForeignColumn(null, null, (string)row["REFERENCED_TABLE_NAME"], (string)row["REFERENCED_COLUMN_NAME"], true);
                    }
                }
            }
			catch(Exception ex)
			{
				string m = ex.Message;
			}
		}