// // OracleConnection.cs // // Part of the Mono class libraries at // mcs/class/System.Data.OracleClient/System.Data.OracleClient // // Assembly: System.Data.OracleClient.dll // Namespace: System.Data.OracleClient // // Authors: // Daniel Morgan // Tim Coleman // Hubert FONGARNAND // Marek Safar // // Copyright (C) Daniel Morgan, 2002, 2005, 2006, 2009 // Copyright (C) Tim Coleman, 2003 // Copyright (C) Hubert FONGARNAND, 2005 // // Original source code for setting ConnectionString // by Tim Coleman // // Copyright (C) Tim Coleman, 2002 // // Licensed under the MIT/X11 License. // //#define ORACLE_DATA_ACCESS // define ORACLE_DATA_ACCESS for Oracle.DataAccess functionality // otherwise it defaults to Microsoft's System.Data.OracleClient using System; using System.Collections; using System.Collections.Specialized; using System.ComponentModel; using System.Data; using System.Data.OracleClient.Oci; using System.Drawing.Design; using System.EnterpriseServices; using System.Globalization; using System.Text; //#if ORACLE_DATA_ACCESS //namespace Oracle.DataAccess //#else namespace System.Data.OracleClient //#endif { internal struct OracleConnectionInfo { internal string Username; internal string Password; internal string Database; internal string ConnectionString; internal OciCredentialType CredentialType; internal bool SetNewPassword; internal string NewPassword; } [DefaultEvent ("InfoMessage")] public sealed class OracleConnection : Common.DbConnection, ICloneable { #region Fields OciGlue oci; ConnectionState state; OracleConnectionInfo conInfo; OracleTransaction transaction; string connectionString = String.Empty; string parsedConnectionString; OracleDataReader dataReader; bool pooling = true; static OracleConnectionPoolManager pools = new OracleConnectionPoolManager (); OracleConnectionPool pool; int minPoolSize; int maxPoolSize = 100; byte persistSecurityInfo = 1; bool disposed; IFormatProvider format_info; #endregion // Fields #region Constructors public OracleConnection () { state = ConnectionState.Closed; } public OracleConnection (string connectionString) : this() { SetConnectionString (connectionString, false); } #endregion // Constructors #region Properties [MonoTODO ("Currently not respected.")] public override int ConnectionTimeout { get { return 0; } } [Browsable (false)] [EditorBrowsable (EditorBrowsableState.Never)] public override string Database { [MonoTODO] get { return String.Empty; } } internal OracleDataReader DataReader { get { return dataReader; } set { dataReader = value; } } internal OciEnvironmentHandle Environment { get { return oci.Environment; } } internal OciErrorHandle ErrorHandle { get { return oci.ErrorHandle; } } internal OciServiceHandle ServiceContext { get { return oci.ServiceContext; } } internal OciSessionHandle Session { get { return oci.SessionHandle; } } [Browsable (false)] [MonoTODO] [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)] public override string DataSource { get { return conInfo.Database; } } [Browsable (false)] [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)] public override ConnectionState State { get { return state; } } [DefaultValue ("")] [SettingsBindableAttribute (true)] [RefreshProperties (RefreshProperties.All)] [Editor ("Microsoft.VSDesigner.Data.Oracle.Design.OracleConnectionStringEditor, " + Consts.AssemblyMicrosoft_VSDesigner, typeof(UITypeEditor))] public override string ConnectionString { get { if (parsedConnectionString == null) return string.Empty; return parsedConnectionString; } set { SetConnectionString (value, false); } } [MonoTODO] [Browsable (false)] [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)] public override string ServerVersion { get { if (this.State != ConnectionState.Open) throw new System.InvalidOperationException ("Invalid operation. The connection is closed."); return GetOracleVersion (); } } internal string GetOracleVersion () { byte[] buffer = new Byte[256]; uint bufflen = (uint) buffer.Length; IntPtr sh = oci.ServiceContext; IntPtr eh = oci.ErrorHandle; OciCalls.OCIServerVersion (sh, eh, ref buffer, bufflen, OciHandleType.Service); // Get length of returned string int rsize = 0; IntPtr env = oci.Environment; OciCalls.OCICharSetToUnicode (env, null, buffer, out rsize); // Get string StringBuilder ret = new StringBuilder(rsize); OciCalls.OCICharSetToUnicode (env, ret, buffer, out rsize); return ret.ToString (); } internal OciGlue Oci { get { return oci; } } internal OracleTransaction Transaction { get { return transaction; } set { transaction = value; } } #endregion // Properties #region Methods public new OracleTransaction BeginTransaction () { return BeginTransaction (IsolationLevel.ReadCommitted); } public new OracleTransaction BeginTransaction (IsolationLevel il) { if (state == ConnectionState.Closed) throw new InvalidOperationException ("The connection is not open."); if (transaction != null) throw new InvalidOperationException ("OracleConnection does not support parallel transactions."); OciTransactionHandle transactionHandle = oci.CreateTransaction (); if (transactionHandle == null) throw new Exception("Error: Unable to start transaction"); else { transactionHandle.Begin (); transaction = new OracleTransaction (this, il, transactionHandle); } return transaction; } [MonoTODO] public override void ChangeDatabase (string value) { throw new NotImplementedException (); } public new OracleCommand CreateCommand () { OracleCommand command = new OracleCommand (); command.Connection = this; return command; } [MonoTODO] object ICloneable.Clone () { OracleConnection con = new OracleConnection (); con.SetConnectionString (connectionString, true); // TODO: what other properties need to be cloned? return con; } [MonoTODO] protected override void Dispose (bool disposing) { if (!disposed) { if (State == ConnectionState.Open) Close (); dataReader = null; transaction = null; oci = null; pool = null; conInfo.Username = string.Empty; conInfo.Database = string.Empty; conInfo.Password = string.Empty; connectionString = null; parsedConnectionString = null; base.Dispose (disposing); disposed = true; } } [MonoTODO] public void EnlistDistributedTransaction (ITransaction distributedTransaction) { throw new NotImplementedException (); } // Get NLS_DATE_FORMAT string from Oracle server internal string GetSessionDateFormat () { // 23 is 22 plus 1 for NUL terminated character // a DATE format has a max size of 22 return GetNlsInfo (Session, 23, OciNlsServiceType.DATEFORMAT); } // Get NLS Info // // handle = OciEnvironmentHandle or OciSessionHandle // bufflen = Length of byte buffer to allocate to retrieve the NLS info // item = OciNlsServiceType enum value // // if unsure how much you need, use OciNlsServiceType.MAXBUFSZ internal string GetNlsInfo (OciHandle handle, uint bufflen, OciNlsServiceType item) { byte[] buffer = new Byte[bufflen]; OciCalls.OCINlsGetInfo (handle, ErrorHandle, ref buffer, bufflen, (ushort) item); // Get length of returned string int rsize = 0; OciCalls.OCICharSetToUnicode (Environment, null, buffer, out rsize); // Get string StringBuilder ret = new StringBuilder (rsize); OciCalls.OCICharSetToUnicode (Environment, ret, buffer, out rsize); return ret.ToString (); } // An instance of IFormatProvider for locale - independent IFormattable.ToString () in Bind () [MonoTODO("Handle other culture-specific informations, restrict buffer sizes")] internal IFormatProvider SessionFormatProvider { get { if (format_info == null && state == ConnectionState.Open) { NumberFormatInfo numberFormatInfo = new NumberFormatInfo (); numberFormatInfo.NumberGroupSeparator = GetNlsInfo (Session, (uint)OciNlsServiceType.MAXBUFSZ, OciNlsServiceType.GROUP); numberFormatInfo.NumberDecimalSeparator = GetNlsInfo (Session, (uint)OciNlsServiceType.MAXBUFSZ, OciNlsServiceType.DECIMAL); numberFormatInfo.CurrencyGroupSeparator = GetNlsInfo (Session, (uint)OciNlsServiceType.MAXBUFSZ, OciNlsServiceType.MONGROUP); numberFormatInfo.CurrencyDecimalSeparator = GetNlsInfo (Session, (uint)OciNlsServiceType.MAXBUFSZ, OciNlsServiceType.MONDECIMAL); format_info = numberFormatInfo; } return format_info; } } public override void Open () { if (State == ConnectionState.Open) return; PersistSecurityInfo (); if (!pooling || conInfo.SetNewPassword == true) { oci = new OciGlue (); oci.CreateConnection (conInfo); } else { pool = pools.GetConnectionPool (conInfo, minPoolSize, maxPoolSize); oci = pool.GetConnection (); } state = ConnectionState.Open; CreateStateChange (ConnectionState.Closed, ConnectionState.Open); } #if ORACLE_DATA_ACCESS public void OpenWithNewPassword (string newPassword) { if (State == ConnectionState.Open) throw new InvalidOperationException (); conInfo.SetNewPassword = true; conInfo.NewPassword = newPassword; Open (); conInfo.SetNewPassword = false; conInfo.NewPassword = string.Empty; conInfo.Password = newPassword; } #endif internal void CreateInfoMessage (OciErrorInfo info) { OracleInfoMessageEventArgs a = new OracleInfoMessageEventArgs (info); OnInfoMessage (a); } private void OnInfoMessage (OracleInfoMessageEventArgs e) { if (InfoMessage != null) InfoMessage (this, e); } internal void CreateStateChange (ConnectionState original, ConnectionState current) { StateChangeEventArgs a = new StateChangeEventArgs (original, current); OnStateChange (a); } public override void Close () { if (transaction != null) transaction.Rollback (); if (!pooling) oci.Disconnect (); else if (pool != null) pool.ReleaseConnection (oci); state = ConnectionState.Closed; CreateStateChange (ConnectionState.Open, ConnectionState.Closed); } protected override Common.DbTransaction BeginDbTransaction (IsolationLevel isolationLevel) { return BeginTransaction (isolationLevel); } protected override Common.DbCommand CreateDbCommand () { return CreateCommand (); } private void PersistSecurityInfo () { // persistSecurityInfo: // 0 = true/yes // 1 = false/no (have not parsed out password yet) // 2 = like 1, but have parsed out password if (persistSecurityInfo == 0 || persistSecurityInfo == 2) return; persistSecurityInfo = 2; if (connectionString == null || connectionString.Length == 0) return; string conString = connectionString + ";"; bool inQuote = false; bool inDQuote = false; int inParen = 0; string name = String.Empty; StringBuilder sb = new StringBuilder (); int nStart = 0; int nFinish = 0; int i = -1; foreach (char c in conString) { i ++; switch (c) { case '\'': inQuote = !inQuote; break; case '"' : inDQuote = !inDQuote; break; case '(': inParen++; sb.Append (c); break; case ')': inParen--; sb.Append (c); break; case ';' : if (!inDQuote && !inQuote) { if (name != String.Empty && name != null) { name = name.ToUpper ().Trim (); if (name.Equals ("PASSWORD") || name.Equals ("PWD")) { nFinish = i; string part1 = String.Empty; string part3 = String.Empty; sb = new StringBuilder (); if (nStart > 0) { part1 = conString.Substring (0, nStart); if (part1[part1.Length - 1] == ';') part1 = part1.Substring (0, part1.Length - 1); sb.Append (part1); } if (!part1.Equals (String.Empty)) sb.Append (';'); if (conString.Length - nFinish - 1 > 0) { part3 = conString.Substring (nFinish, conString.Length - nFinish); if (part3[0] == ';') part3 = part3.Substring(1, part3.Length - 1); sb.Append (part3); } parsedConnectionString = sb.ToString (); return; } } name = String.Empty; sb = new StringBuilder (); nStart = i; nFinish = i; } else sb.Append (c); break; case '=' : if (!inDQuote && !inQuote && inParen == 0) { name = sb.ToString (); sb = new StringBuilder (); } else sb.Append (c); break; default: sb.Append (c); break; } } } internal void SetConnectionString (string connectionString, bool persistSecurity) { persistSecurityInfo = 1; conInfo.Username = string.Empty; conInfo.Database = string.Empty; conInfo.Password = string.Empty; conInfo.CredentialType = OciCredentialType.RDBMS; conInfo.SetNewPassword = false; conInfo.NewPassword = string.Empty; if (connectionString == null || connectionString.Length == 0) { this.connectionString = connectionString; this.parsedConnectionString = connectionString; return; } this.connectionString = String.Copy (connectionString); this.parsedConnectionString = this.connectionString; connectionString += ";"; NameValueCollection parameters = new NameValueCollection (); bool inQuote = false; bool inDQuote = false; int inParen = 0; string name = String.Empty; string value = String.Empty; StringBuilder sb = new StringBuilder (); foreach (char c in connectionString) { switch (c) { case '\'': inQuote = !inQuote; break; case '"' : inDQuote = !inDQuote; break; case '(': inParen++; sb.Append (c); break; case ')': inParen--; sb.Append (c); break; case ';' : if (!inDQuote && !inQuote) { if (name != String.Empty && name != null) { name = name.ToUpper ().Trim (); value = sb.ToString ().Trim (); parameters [name] = value; } name = String.Empty; value = String.Empty; sb = new StringBuilder (); } else sb.Append (c); break; case '=' : if (!inDQuote && !inQuote && inParen == 0) { name = sb.ToString (); sb = new StringBuilder (); } else sb.Append (c); break; default: sb.Append (c); break; } } SetProperties (parameters); conInfo.ConnectionString = this.connectionString; if (persistSecurity) PersistSecurityInfo (); } private void SetProperties (NameValueCollection parameters) { string value; foreach (string name in parameters) { value = parameters[name]; switch (name) { case "UNICODE": break; case "ENLIST": break; case "CONNECTION LIFETIME": // TODO: break; case "INTEGRATED SECURITY": if (!ConvertToBoolean ("integrated security", value)) conInfo.CredentialType = OciCredentialType.RDBMS; else conInfo.CredentialType = OciCredentialType.External; break; case "PERSIST SECURITY INFO": if (!ConvertToBoolean ("persist security info", value)) persistSecurityInfo = 1; else persistSecurityInfo = 0; break; case "MIN POOL SIZE": minPoolSize = int.Parse (value); break; case "MAX POOL SIZE": maxPoolSize = int.Parse (value); break; case "DATA SOURCE" : case "SERVER" : conInfo.Database = value; break; case "PASSWORD" : case "PWD" : conInfo.Password = value; break; case "UID" : case "USER ID" : conInfo.Username = value; break; case "POOLING" : pooling = ConvertToBoolean("pooling", value); break; default: throw new ArgumentException("Connection parameter not supported: '" + name + "'"); } } } private bool ConvertToBoolean(string key, string value) { string upperValue = value.ToUpper(); if (upperValue == "TRUE" || upperValue == "YES") { return true; } else if (upperValue == "FALSE" || upperValue == "NO") { return false; } throw new ArgumentException(string.Format(CultureInfo.InvariantCulture, "Invalid value \"{0}\" for key '{1}'.", value, key)); } #endregion // Methods public event OracleInfoMessageEventHandler InfoMessage; public override DataTable GetSchema () { if (State != ConnectionState.Open) throw new InvalidOperationException ("Invalid operation. The connection is closed."); return GetSchemaMetaDataCollections (); } public override DataTable GetSchema (String collectionName) { return GetSchema (collectionName, null); } public override DataTable GetSchema (String collectionName, string [] restrictionValues) { if (State != ConnectionState.Open) throw new InvalidOperationException ("Invalid operation. The connection is closed."); int restrictionsCount = 0; if (restrictionValues != null) restrictionsCount = restrictionValues.Length; DataTable metaTable = GetSchemaMetaDataCollections (); foreach (DataRow row in metaTable.Rows) { if (String.Compare (row ["CollectionName"].ToString (), collectionName, true) == 0) { int restrictions = (int)row ["NumberOfRestrictions"]; if (restrictionsCount > restrictions) throw new ArgumentException ("More restrictions were provided than needed."); } } switch (collectionName.ToUpper ()) { case "METADATACOLLECTIONS": return metaTable; case "DATASOURCEINFORMATION": return GetSchemaDataSourceInformation (); case "DATATYPES": return GetSchemaDataTypes (); case "RESTRICTIONS": return GetSchemaRestrictions (); case "RESERVEDWORDS": return GetSchemaReservedWords (); case "USERS": return GetSchemaUsers (restrictionValues); case "TABLES": return GetSchemaTables (restrictionValues); case "COLUMNS": return GetSchemaColumns (restrictionValues); case "VIEWS": return GetSchemaViews (restrictionValues); case "SYNONYMS": return GetSchemaSynonyms (restrictionValues); case "SEQUENCES": return GetSchemaSequences (restrictionValues); case "FUNCTIONS": return GetSchemaProcedures (restrictionValues, "FUNCTION"); case "PACKAGES": return GetSchemaProcedures (restrictionValues, "PACKAGE"); case "PACKAGEBODIES": return GetSchemaProcedures (restrictionValues, "PACKAGE BODY"); case "PROCEDURES": return GetSchemaProcedures (restrictionValues, "PROCEDURE"); case "PROCEDUREPARAMETERS": throw new NotImplementedException (collectionName); // see ALL_ARGUMENTS case "ARGUMENTS": throw new NotImplementedException (collectionName); // see ALL_ARGUMENTS case "INDEXCOLUMNS": throw new NotImplementedException (collectionName); // see ALL_IND_COLS case "INDEXES": throw new NotImplementedException (collectionName); // see ALL_INDEXES case "UNIQUEKEYS": throw new NotImplementedException (collectionName); // see ALL_CONSTRAINTS and CONSTRAINT_TYPE of U case "PRIMARYKEYS": throw new NotImplementedException (collectionName); // see ALL_CONSTRAINTS and CONSTRAINT_TYPE of P case "FOREIGNKEYS": throw new NotImplementedException (collectionName); // see ALL_CONSTRAINTS and CONSTRAINT_TYPE of R case "FOREIGNKEYCOLUMNS": throw new NotImplementedException (collectionName); // see ALL_CONS_COLUMNS } throw new ArgumentException ("The requested collection is not defined."); } static DataTable metaDataCollections = null; DataTable GetSchemaMetaDataCollections () { if (metaDataCollections != null) return metaDataCollections; DataTable dt = new DataTable (); dt.Columns.Add ("CollectionName", typeof(System.String)); dt.Columns.Add ("NumberOfRestrictions", typeof(System.Int32)); dt.Columns.Add ("NumberOfIdentifierParts", typeof(System.Int32)); dt.LoadDataRow (new object [] { "MetaDataCollections", 0, 0 }, true); dt.LoadDataRow (new object [] { "DataSourceInformation", 0, 0 }, true); dt.LoadDataRow (new object [] { "DataTypes", 0, 0 }, true); dt.LoadDataRow (new object [] { "Restrictions", 0, 0 }, true); dt.LoadDataRow (new object [] { "ReservedWords", 0, 0 }, true); dt.LoadDataRow (new object [] { "Users", 1, 1 }, true); dt.LoadDataRow (new object [] { "Tables", 2, 2 }, true); dt.LoadDataRow (new object [] { "Columns", 3, 3 }, true); dt.LoadDataRow (new object [] { "Views", 2, 2 }, true); dt.LoadDataRow (new object [] { "Synonyms", 2, 2 }, true); dt.LoadDataRow (new object [] { "Sequences", 2, 2 }, true); dt.LoadDataRow (new object [] { "ProcedureParameters", 2, 2 }, true); dt.LoadDataRow (new object [] { "Functions", 2, 2 }, true); dt.LoadDataRow (new object [] { "IndexColumns", 5, 3 }, true); dt.LoadDataRow (new object [] { "Indexes", 4, 2 }, true); dt.LoadDataRow (new object [] { "Packages", 2, 2 }, true); dt.LoadDataRow (new object [] { "PackageBodies", 2, 2 }, true); dt.LoadDataRow (new object [] { "Arguments", 4, 4 }, true); dt.LoadDataRow (new object [] { "Procedures", 2, 2 }, true); dt.LoadDataRow (new object [] { "UniqueKeys", 3, 3 }, true); dt.LoadDataRow (new object [] { "PrimaryKeys", 3, 3 }, true); dt.LoadDataRow (new object [] { "ForeignKeys", 3, 3 }, true); dt.LoadDataRow (new object [] { "ForeignKeyColumns", 3, 2 }, true); return dt; } DataTable GetSchemaRestrictions () { DataTable dt = new DataTable (); dt.Columns.Add ("CollectionName", typeof (System.String)); dt.Columns.Add ("RestrictionName", typeof (System.String)); dt.Columns.Add ("ParameterName", typeof (System.String)); dt.Columns.Add ("RestrictionDefault", typeof (System.String)); dt.Columns.Add ("RestrictionNumber", typeof (System.Int32)); dt.LoadDataRow (new object [] { "Users", "UserName", "NAME", "USERNAME", 1 }, true); dt.LoadDataRow (new object [] { "Tables", "Owner", "OWNER", "OWNER", 1 }, true); dt.LoadDataRow (new object [] { "Tables", "Table", "TABLENAME", "TABLE_NAME", 2 }, true); dt.LoadDataRow (new object [] { "Columns", "Owner", "OWNER", "OWNER", 1 }, true); dt.LoadDataRow (new object [] { "Columns", "Table", "TABLENAME", "TABLE_NAME", 2 }, true); dt.LoadDataRow (new object [] { "Columns", "Column", "COLUMNNAME", "COLUMN_NAME", 3 }, true); dt.LoadDataRow (new object [] { "Views", "Owner", "OWNER", "OWNER", 1 }, true); dt.LoadDataRow (new object [] { "Views", "View", "VIEWNAME", "VIEW_NAME", 2 }, true); dt.LoadDataRow (new object [] { "Synonyms", "Owner", "OWNER", "OWNER", 1 }, true); dt.LoadDataRow (new object [] { "Synonyms", "Synonym", "SYNONYMNAME", "SYNONYM_NAME", 2 }, true); dt.LoadDataRow (new object [] { "Sequences", "Owner", "OWNER", "SEQUENCE_OWNER", 1 }, true); dt.LoadDataRow (new object [] { "Sequences", "Sequence", "SEQUENCE", "SEQUENCE_NAME", 2 }, true); dt.LoadDataRow (new object [] { "ProcedureParameters", "Owner", "OWNER", "OWNER", 1 }, true); dt.LoadDataRow (new object [] { "ProcedureParameters", "ObjectName", "OBJECTNAME", "OBJECT_NAME", 2 }, true); dt.LoadDataRow (new object [] { "Functions", "Owner", "OWNER", "OWNER", 1 }, true); dt.LoadDataRow (new object [] { "Functions", "Name", "NAME", "OBJECT_NAME", 2 }, true); dt.LoadDataRow (new object [] { "IndexColumns", "Owner", "OWNER", "INDEX_OWNER", 1 }, true); dt.LoadDataRow (new object [] { "IndexColumns", "Name", "NAME", "INDEX_NAME", 2 }, true); dt.LoadDataRow (new object [] { "IndexColumns", "TableOwner", "TABLEOWNER", "TABLE_OWNER", 3 }, true); dt.LoadDataRow (new object [] { "IndexColumns", "TableName", "TABLENAME", "TABLE_NAME", 4 }, true); dt.LoadDataRow (new object [] { "IndexColumns", "Column", "COLUMNNAME", "COLUMN_NAME", 5 }, true); dt.LoadDataRow (new object [] { "Indexes", "Owner", "OWNER", "OWNER", 1 }, true); dt.LoadDataRow (new object [] { "Indexes", "Name", "NAME", "INDEX_NAME", 2 }, true); dt.LoadDataRow (new object [] { "Indexes", "TableOwner", "TABLEOWNER", "TABLE_OWNER", 3 }, true); dt.LoadDataRow (new object [] { "Indexes", "TableName", "TABLENAME", "TABLE_NAME", 4 }, true); dt.LoadDataRow (new object [] { "Packages", "Owner", "OWNER", "OWNER", 1 }, true); dt.LoadDataRow (new object [] { "Packages", "Name", "PACKAGENAME", "OBJECT_NAME", 2 }, true); dt.LoadDataRow (new object [] { "PackageBodies", "Owner", "OWNER", "OWNER", 1 }, true); dt.LoadDataRow (new object [] { "PackageBodies", "Name", "NAME", "OBJECT_NAME", 2 }, true); dt.LoadDataRow (new object [] { "Arguments", "Owner", "OWNER", "OWNER", 1 }, true); dt.LoadDataRow (new object [] { "Arguments", "PackageName", "PACKAGENAME", "PACKAGE_NAME", 2 }, true); dt.LoadDataRow (new object [] { "Arguments", "ObjectName", "OBJECTNAME", "OBJECT_NAME", 3 }, true); dt.LoadDataRow (new object [] { "Arguments", "ArgumentName", "ARGUMENTNAME", "ARGUMENT_NAME", 4 }, true); dt.LoadDataRow (new object [] { "Procedures", "Owner", "OWNER", "OWNER", 1 }, true); dt.LoadDataRow (new object [] { "Procedures", "Name", "NAME", "OBJECT_NAME", 2 }, true); dt.LoadDataRow (new object [] { "UniqueKeys", "Owner", "OWNER", "OWNER", 1 }, true); dt.LoadDataRow (new object [] { "UniqueKeys", "Table_Name", "TABLENAME", "TABLE_NAME", 2 }, true); dt.LoadDataRow (new object [] { "UniqueKeys", "Constraint_Name", "CONSTRAINTNAME", "CONSTRAINT_NAME", 3 }, true); dt.LoadDataRow (new object [] { "PrimaryKeys", "Owner", "OWNER", "OWNER", 1 }, true); dt.LoadDataRow (new object [] { "PrimaryKeys", "Table_Name", "TABLENAME", "TABLE_NAME", 2 }, true); dt.LoadDataRow (new object [] { "PrimaryKeys", "Constraint_Name", "CONSTRAINTNAME", "CONSTRAINT_NAME", 3 }, true); dt.LoadDataRow (new object [] { "ForeignKeys", "Foreign_Key_Owner", "OWNER", "FKCON.OWNER", 1 }, true); dt.LoadDataRow (new object [] { "ForeignKeys", "Foreign_Key_Table_Name", "TABLENAME", "FKCON.TABLE_NAME", 2 }, true); dt.LoadDataRow (new object [] { "ForeignKeys", "Foreign_Key_Constraint_Name", "CONSTRAINTNAME", "FKCON.CONSTRAINT_NAME", 3 }, true); dt.LoadDataRow (new object [] { "ForeignKeyColumns", "Owner", "OWNER", "FKCOLS.OWNER", 1 }, true); dt.LoadDataRow (new object [] { "ForeignKeyColumns", "Table_Name", "TABLENAME", "FKCOLS.TABLE_NAME", 2 }, true); dt.LoadDataRow (new object [] { "ForeignKeyColumns", "Constraint_Name", "CONSTRAINTNAME", "FKCOLS.CONSTRAINT_NAME", 3 }, true); return dt; } DataTable GetSchemaTables (string [] restrictionValues) { OracleCommand cmd = CreateCommand (); // TODO: determine whether a table is a System or a User type cmd.CommandText = "SELECT OWNER, TABLE_NAME, DECODE(OWNER, 'SYS', 'System', 'User') AS TYPE " + " FROM SYS.ALL_TABLES " + " WHERE (OWNER = :POWNER OR :POWNER IS NULL) " + " AND (TABLE_NAME = :PTABLE_NAME OR :PTABLE_NAME IS NULL) " + " ORDER BY OWNER, TABLE_NAME"; cmd.Parameters.Add (":POWNER", OracleType.VarChar, 30).Value = DBNull.Value; cmd.Parameters.Add (":PTABLE_NAME", OracleType.VarChar, 30).Value = DBNull.Value; return GetSchemaDataTable (cmd, restrictionValues); } DataTable GetSchemaColumns (string [] restrictionValues) { OracleCommand cmd = CreateCommand(); cmd.CommandText = "SELECT OWNER, TABLE_NAME, COLUMN_NAME, COLUMN_ID AS ID, DATA_TYPE AS DATATYPE, " + " DATA_LENGTH AS LENGTH, DATA_PRECISION AS PRECISION, DATA_SCALE AS SCALE, NULLABLE " + " FROM SYS.ALL_TAB_COLUMNS " + " WHERE (OWNER = :POWNER OR :POWNER IS NULL) " + " AND (TABLE_NAME = :PTABLE_NAME OR :PTABLE_NAME IS NULL) " + " AND (COLUMN_NAME = 'ENAME' OR :PCOLUMN_NAME IS NULL) " + " ORDER BY OWNER, TABLE_NAME, COLUMN_ID;"; cmd.Parameters.Add (":POWNER", OracleType.VarChar, 30).Value = DBNull.Value; cmd.Parameters.Add (":PTABLE_NAME", OracleType.VarChar, 30).Value = DBNull.Value; cmd.Parameters.Add (":PCOLUMN_NAME", OracleType.VarChar, 30).Value = DBNull.Value; return GetSchemaDataTable (cmd, restrictionValues); } DataTable GetSchemaViews (string [] restrictionValues) { OracleCommand cmd = CreateCommand (); cmd.CommandText = "SELECT OWNER,VIEW_NAME,TEXT_LENGTH,TEXT,TYPE_TEXT_LENGTH,TYPE_TEXT,OID_TEXT_LENGTH,OID_TEXT, " + " VIEW_TYPE_OWNER,VIEW_TYPE,SUPERVIEW_NAME " + " FROM SYS.ALL_VIEWS " + " WHERE (OWNER = :POWNER OR :POWNER IS NULL) " + " AND (VIEW_NAME = :PVIEW_NAME OR :PVIEW_NAME IS NULL) " + " ORDER BY OWNER, VIEW_NAME"; cmd.Parameters.Add (":POWNER", OracleType.VarChar, 30).Value = DBNull.Value; cmd.Parameters.Add (":PVIEW_NAME", OracleType.VarChar, 30).Value = DBNull.Value; return GetSchemaDataTable (cmd, restrictionValues); } DataTable GetSchemaUsers (string [] restrictionValues) { OracleCommand cmd = CreateCommand (); cmd.CommandText = "SELECT USERNAME AS NAME, USER_ID AS ID, CREATED AS CREATEDATE " + " FROM SYS.ALL_USERS " + " WHERE (USERNAME = :PUSERNAME OR :PUSERNAME IS NULL)"; cmd.Parameters.Add (":PUSERNAME", OracleType.VarChar, 30).Value = DBNull.Value; return GetSchemaDataTable (cmd, restrictionValues); } DataTable GetSchemaSynonyms (string [] restrictionValues) { OracleCommand cmd = CreateCommand (); cmd.CommandText = "SELECT OWNER, SYNONYM_NAME, TABLE_OWNER, TABLE_NAME, DB_LINK " + " FROM SYS.ALL_SYNONYMS " + " WHERE (OWNER = :POWNER OR :POWNER IS NULL) " + " AND (SYNONYM_NAME = :PSYNONYM_NAME OR :PSYNONYM_NAME IS NULL) " + " ORDER BY OWNER, SYNONYM_NAME"; cmd.Parameters.Add (":POWNER", OracleType.VarChar, 30).Value = DBNull.Value; cmd.Parameters.Add (":PSYNONYM_NAME", OracleType.VarChar, 30).Value = DBNull.Value; return GetSchemaDataTable (cmd, restrictionValues); } DataTable GetSchemaSequences (string [] restrictionValues) { OracleCommand cmd = CreateCommand (); cmd.CommandText = "SELECT SEQUENCE_OWNER, SEQUENCE_NAME, MIN_VALUE, MAX_VALUE, " + " INCREMENT_BY, CYCLE_FLAG, ORDER_FLAG, CACHE_SIZE, LAST_NUMBER " + " FROM SYS.ALL_SEQUENCES " + " WHERE (SEQUENCE_OWNER = :PSEQUENCE_OWNER OR :PSEQUENCE_OWNER IS NULL) " + " AND (SEQUENCE_NAME = :PSEQUENCE_NAME OR :PSEQUENCE_NAME IS NULL) " + " ORDER BY SEQUENCE_OWNER, SEQUENCE_NAME"; cmd.Parameters.Add (":SEQUENCE_OWNER", OracleType.VarChar, 30).Value = DBNull.Value; cmd.Parameters.Add (":SEQUENCE_NAME", OracleType.VarChar, 30).Value = DBNull.Value; return GetSchemaDataTable (cmd, restrictionValues); } DataTable GetSchemaProcedures(string [] restrictionValues, string objType) { OracleCommand cmd = CreateCommand (); cmd.CommandText = "SELECT OWNER, OBJECT_NAME, SUBOBJECT_NAME, OBJECT_ID, DATA_OBJECT_ID, LAST_DDL_TIME, " + " TIMESTAMP, STATUS, TEMPORARY, GENERATED, SECONDARY, CREATED " + " FROM ALL_OBJECTS " + " WHERE OBJECT_TYPE = '" + objType + "' " + " AND (OWNER = :POWNER OR :POWNER IS NULL) " + " AND (OBJECT_NAME = :POBJECT_NAME OR :POBJECT_NAME IS NULL) " + " ORDER BY OWNER, OBJECT_NAME, SUBOBJECT_NAME"; cmd.Parameters.Add (":POWNER", OracleType.VarChar, 30).Value = DBNull.Value; cmd.Parameters.Add (":POBJECT_NAME", OracleType.VarChar, 30).Value = DBNull.Value; return GetSchemaDataTable (cmd, restrictionValues); } DataTable GetSchemaDataSourceInformation () { DataTable dt = new DataTable (); dt.Columns.Add ("CompositeIdentifierSeparatorPattern", typeof (System.String)); dt.Columns.Add ("DataSourceProductName", typeof (System.String)); dt.Columns.Add ("DataSourceProductVersion", typeof (System.String)); dt.Columns.Add ("DataSourceProductVersionNormalized", typeof (System.String)); dt.Columns.Add ("GroupByBehavior", typeof (System.Data.Common.GroupByBehavior)); dt.Columns.Add ("IdentifierPattern", typeof (System.String)); dt.Columns.Add ("IdentifierCase", typeof (System.Data.Common.IdentifierCase)); dt.Columns.Add ("OrderByColumnsInSelect", typeof (System.Boolean)); dt.Columns.Add ("ParameterMarkerFormat", typeof (System.String)); dt.Columns.Add ("ParameterMarkerPattern", typeof (System.String)); dt.Columns.Add ("ParameterNameMaxLength", typeof (System.Int32)); dt.Columns.Add ("ParameterNamePattern", typeof (System.String)); dt.Columns.Add ("QuotedIdentifierPattern", typeof (System.String)); dt.Columns.Add ("QuotedIdentifierCase", typeof (System.Data.Common.IdentifierCase)); dt.Columns.Add ("StatementSeparatorPattern", typeof (System.String)); dt.Columns.Add ("StringLiteralPattern", typeof (System.String)); dt.Columns.Add ("SupportedJoinOperators", typeof (System.Data.Common.SupportedJoinOperators)); string ver = ServerVersion; string [] ver2 = ver.Substring (0, ver.IndexOf (' ')).Split (new char [] { '.' }); StringBuilder sb = new StringBuilder(); for (int i = 0; i < ver2.Length; i++) { if (i > 0) { sb.Append ("."); } sb.AppendFormat ("{0:00}", Int32.Parse (ver2 [i])); } sb.Append (' '); ver = sb.ToString (); dt.LoadDataRow (new object [] { "@|\\.", "Oracle", ServerVersion, ver, 3, "^[\\p{Lo}\\p{Lu}\\p{Ll}\\p{Lm}__#$][\\p{Lo}\\p{Lu}\\p{Ll}\\p{Lm}\\p{Nd}__#$]*$", 1, false, ":{0}", ":([\\p{Lo}\\p{Lu}\\p{Ll}\\p{Lm}__#$][\\p{Lo}\\p{Lu}\\p{Ll}\\p{Lm}\\p{Nd}__#$]*)", 30, "^[\\p{Lo}\\p{Lu}\\p{Ll}\\p{Lm}__#$][\\p{Lo}\\p{Lu}\\p{Ll}\\p{Lm}\\p{Nd}__#$]*$", "\"^(([^\"]|\"\")*)$\"", 2, DBNull.Value, "'(([^']|'')*)'", 15 }, true); return dt; } DataTable GetSchemaDataTypes () { DataTable dt = new DataTable (); dt.Columns.Add ("TypeName", typeof (System.String)); dt.Columns.Add ("ProviderDbType", typeof (System.Int32)); dt.Columns.Add ("ColumnSize", typeof (System.Int64)); dt.Columns.Add ("CreateFormat", typeof (System.String)); dt.Columns.Add ("CreateParameters", typeof (System.String)); dt.Columns.Add ("DataType", typeof (System.String)); dt.Columns.Add ("IsAutoIncrementable", typeof (System.Boolean)); dt.Columns.Add ("IsBestMatch", typeof (System.Boolean)); dt.Columns.Add ("IsCaseSensitive", typeof (System.Boolean)); dt.Columns.Add ("IsFixedLength", typeof (System.Boolean)); dt.Columns.Add ("IsFixedPrecisionScale", typeof (System.Boolean)); dt.Columns.Add ("IsLong", typeof (System.Boolean)); dt.Columns.Add ("IsNullable", typeof (System.Boolean)); dt.Columns.Add ("IsSearchable", typeof (System.Boolean)); dt.Columns.Add ("IsSearchableWithLike", typeof (System.Boolean)); dt.Columns.Add ("IsUnsigned", typeof (System.Boolean)); dt.Columns.Add ("MaximumScale", typeof (System.Int16)); dt.Columns.Add ("MinimumScale", typeof (System.Int16)); dt.Columns.Add ("IsConcurrencyType", typeof (System.Boolean)); dt.Columns.Add ("IsLiteralSupported", typeof (System.Boolean)); dt.Columns.Add ("LiteralPrefix", typeof (System.String)); dt.Columns.Add ("LiteralSuffix", typeof (System.String)); dt.LoadDataRow (new object [] { "BFILE", 1, 4294967296, "BFILE", DBNull.Value, "System.Byte[]", false, false, false, false, false, true, true, false, false, DBNull.Value, DBNull.Value, DBNull.Value, false, false, DBNull.Value, DBNull.Value }, true); dt.LoadDataRow (new object [] { "BLOB", 2, 4294967296, "BLOB", DBNull.Value, "System.Byte[]", false, false, false, false, false, true, true, false, false, DBNull.Value, DBNull.Value, DBNull.Value, false, false, DBNull.Value, DBNull.Value }, true); dt.LoadDataRow (new object [] { "CHAR", 3, 2000, "CHAR({0})", "size", "System.String", false, false, true, true, false, false, true, true, true, DBNull.Value, DBNull.Value, DBNull.Value, false, true, "'", "'" }, true); dt.LoadDataRow (new object [] { "CLOB", 4, 4294967296, "CLOB", DBNull.Value, "System.String", false, true, true, false, false, false, true, false, false, DBNull.Value, DBNull.Value, DBNull.Value, false, false, DBNull.Value, DBNull.Value }, true); dt.LoadDataRow (new object [] { "DATE", 6, 19, "DATE", DBNull.Value, "System.DateTime", false, true, false, true, false, false, true, true, true, DBNull.Value, DBNull.Value, DBNull.Value, false, true, "TO_DATE('", "','YYYY-MM-DD HH24:MI:SS')" }, true); dt.LoadDataRow (new object [] { "FLOAT", 29, 38, "FLOAT", DBNull.Value, "System.Decimal", false, true, false, true, false, false, true, true, true, false, DBNull.Value, DBNull.Value, false, true, DBNull.Value, DBNull.Value }, true); dt.LoadDataRow (new object [] { "INTERVAL DAY TO SECOND", 7, 0, "INTERVAL DAY({0}) TO SECOND({1})", "dayprecision,secondsprecision", "System.TimeSpan", false, true, false, true, false, false, true, true, false, DBNull.Value, DBNull.Value, DBNull.Value, false, true, "TO_DSINTERVAL('", "')" }, true); dt.LoadDataRow (new object [] { "INTERVAL YEAR TO MONTH", 8, 0, "INTERVAL YEAR({0}) TO MONTH", "yearprecision", "System.Int32", false, false, false, true, false, false, true, true, false, DBNull.Value, DBNull.Value, DBNull.Value, false, true, "TO_YMINTERVAL('", "')" }, true); dt.LoadDataRow (new object [] { "LONG", 10, 2147483647, "LONG", DBNull.Value, "System.String", false, false, false, false, false, true, true, false, false, DBNull.Value, DBNull.Value, DBNull.Value, false, false, DBNull.Value, DBNull.Value }, true); dt.LoadDataRow (new object [] { "LONG RAW", 9, 2147483647, "LONG RAW", DBNull.Value, "System.Byte[]", false, false, false, false, false, true, true, false, false, DBNull.Value, DBNull.Value, DBNull.Value, false, false, DBNull.Value, DBNull.Value }, true); dt.LoadDataRow (new object [] { "NCHAR", 11, 2000, "NCHAR({0})", "size", "System.String", false, false, true, true, false, false, true, true, true, DBNull.Value, DBNull.Value, DBNull.Value, false, true, "N'", "'" }, true); dt.LoadDataRow (new object [] { "NCLOB", 12, 4294967296, "NCLOB", DBNull.Value, "System.String", false, false, true, false, false, true, true, false, false, DBNull.Value, DBNull.Value, DBNull.Value, false, false, DBNull.Value, DBNull.Value }, true); dt.LoadDataRow (new object [] { "NUMBER", 13, 38, "NUMBER ({0},{1})", "precision,scale", "System.Decimal", false, true, false, true, false, false, true, true, true, false, 127, -84, false, true, "", "" }, true); dt.LoadDataRow (new object [] { "NVARCHAR2", 14, 4000, "NVARCHAR2({0})", "size", "System.String", false, false, true, false, false, false, true, true, false, DBNull.Value, DBNull.Value, DBNull.Value, false, true, "N'", "'" }, true); dt.LoadDataRow (new object [] { "RAW", 15, 2000, "RAW({0})", "size", "System.Byte[]", false, true, false, false, true, false, true, true, true, DBNull.Value, DBNull.Value, DBNull.Value, false, true, "HEXTORAW('", "')" }, true); dt.LoadDataRow (new object [] { "ROWID", 16, 3950, "ROWID", DBNull.Value, "System.String", true, false, false, false, false, false, false, true, false, DBNull.Value, DBNull.Value, DBNull.Value, false, false, DBNull.Value, DBNull.Value }, true); dt.LoadDataRow (new object [] { "TIMESTAMP", 18, 27, "TIMESTAMP({0})", "precision of fractional seconds", "System.DateTime", false, false, false, true, false, false, true, true, false, DBNull.Value, DBNull.Value, DBNull.Value, false, true, "TO_TIMESTAMP('", "','YYYY-MM-DD HH24:MI:SS.FF')" }, true); dt.LoadDataRow (new object [] { "TIMESTAMP WITH LOCAL TIME ZONE", 19, 27, "TIMESTAMP({0} WITH LOCAL TIME ZONE)", "precision of fractional seconds", "System.DateTime", false, false, false, true, false, false, true, true, false, DBNull.Value, DBNull.Value, DBNull.Value, false, true, "TO_TIMESTAMP_TZ('", "','YYYY-MM-DD HH24:MI:SS.FF')" }, true); dt.LoadDataRow (new object [] { "TIMESTAMP WITH TIME ZONE", 20, 34, "TIMESTAMP({0} WITH TIME ZONE)", "precision of fractional seconds", "System.DateTime", false, false, false, true, false, false, true, true, false, DBNull.Value, DBNull.Value, DBNull.Value, false, true, "TO_TIMESTAMP_TZ('", "','YYYY-MM-DD HH24:MI:SS.FF TZH:TZM')" }, true); dt.LoadDataRow (new object [] { "VARCHAR2", 22, 4000, "VARCHAR2({0})", "size", "System.String", false, false, true, false, true, false, true, true, true, DBNull.Value, DBNull.Value, DBNull.Value, false, true, "'", "'" }, true); return dt; } DataTable GetSchemaReservedWords () { DataTable dt = new DataTable (); dt.Columns.Add ("ReservedWord", typeof (System.String)); dt.LoadDataRow (new object [] { "ACCESS" }, true); dt.LoadDataRow (new object [] { "ADD" }, true); dt.LoadDataRow (new object [] { "ALL" }, true); dt.LoadDataRow (new object [] { "ALTER" }, true); dt.LoadDataRow (new object [] { "AND" }, true); dt.LoadDataRow (new object [] { "ANY" }, true); dt.LoadDataRow (new object [] { "AS" }, true); dt.LoadDataRow (new object [] { "ASC" }, true); dt.LoadDataRow (new object [] { "AUDIT" }, true); dt.LoadDataRow (new object [] { "BETWEEN" }, true); dt.LoadDataRow (new object [] { "BY" }, true); dt.LoadDataRow (new object [] { "CHAR" }, true); dt.LoadDataRow (new object [] { "CHECK" }, true); dt.LoadDataRow (new object [] { "CLUSTER" }, true); dt.LoadDataRow (new object [] { "COLUMN" }, true); dt.LoadDataRow (new object [] { "COMMENT" }, true); dt.LoadDataRow (new object [] { "COMPRESS" }, true); dt.LoadDataRow (new object [] { "CONNECT" }, true); dt.LoadDataRow (new object [] { "CREATE" }, true); dt.LoadDataRow (new object [] { "CURRENT" }, true); dt.LoadDataRow (new object [] { "DATE" }, true); dt.LoadDataRow (new object [] { "DECIMAL" }, true); dt.LoadDataRow (new object [] { "DEFAULT" }, true); dt.LoadDataRow (new object [] { "DELETE" }, true); dt.LoadDataRow (new object [] { "DESC" }, true); dt.LoadDataRow (new object [] { "DISTINCT" }, true); dt.LoadDataRow (new object [] { "DROP" }, true); dt.LoadDataRow (new object [] { "ELSE" }, true); dt.LoadDataRow (new object [] { "EXCLUSIVE" }, true); dt.LoadDataRow (new object [] { "EXISTS" }, true); dt.LoadDataRow (new object [] { "FILE" }, true); dt.LoadDataRow (new object [] { "FLOAT" }, true); dt.LoadDataRow (new object [] { "FOR" }, true); dt.LoadDataRow (new object [] { "FROM" }, true); dt.LoadDataRow (new object [] { "GRANT" }, true); dt.LoadDataRow (new object [] { "GROUP" }, true); dt.LoadDataRow (new object [] { "HAVING" }, true); dt.LoadDataRow (new object [] { "IDENTIFIED" }, true); dt.LoadDataRow (new object [] { "IMMEDIATE" }, true); dt.LoadDataRow (new object [] { "IN" }, true); dt.LoadDataRow (new object [] { "INCREMENT" }, true); dt.LoadDataRow (new object [] { "INDEX" }, true); dt.LoadDataRow (new object [] { "INITAL" }, true); dt.LoadDataRow (new object [] { "INSERT" }, true); dt.LoadDataRow (new object [] { "INTEGER" }, true); dt.LoadDataRow (new object [] { "INTERSECT" }, true); dt.LoadDataRow (new object [] { "INTO" }, true); dt.LoadDataRow (new object [] { "IS" }, true); dt.LoadDataRow (new object [] { "LEVEL" }, true); dt.LoadDataRow (new object [] { "LIKE" }, true); dt.LoadDataRow (new object [] { "LOCK" }, true); dt.LoadDataRow (new object [] { "LONG" }, true); dt.LoadDataRow (new object [] { "MAXEXTENTS" }, true); dt.LoadDataRow (new object [] { "MINUS" }, true); dt.LoadDataRow (new object [] { "MLSLABEL" }, true); dt.LoadDataRow (new object [] { "MODE" }, true); dt.LoadDataRow (new object [] { "MODIFY" }, true); dt.LoadDataRow (new object [] { "NOAUDIT" }, true); dt.LoadDataRow (new object [] { "NOCOMPRESS" }, true); dt.LoadDataRow (new object [] { "NOT" }, true); dt.LoadDataRow (new object [] { "NOWAIT" }, true); dt.LoadDataRow (new object [] { "NULL" }, true); dt.LoadDataRow (new object [] { "NUMBER" }, true); dt.LoadDataRow (new object [] { "OF" }, true); dt.LoadDataRow (new object [] { "OFFLINE" }, true); dt.LoadDataRow (new object [] { "ON" }, true); dt.LoadDataRow (new object [] { "ONLINE" }, true); dt.LoadDataRow (new object [] { "OPTION" }, true); dt.LoadDataRow (new object [] { "OR" }, true); dt.LoadDataRow (new object [] { "ORDER" }, true); dt.LoadDataRow (new object [] { "PCTFREE" }, true); dt.LoadDataRow (new object [] { "PRIOR" }, true); dt.LoadDataRow (new object [] { "PRIVILEGES" }, true); dt.LoadDataRow (new object [] { "PUBLIC" }, true); dt.LoadDataRow (new object [] { "RAW" }, true); dt.LoadDataRow (new object [] { "RENAME" }, true); dt.LoadDataRow (new object [] { "RESOURCE" }, true); dt.LoadDataRow (new object [] { "REVOKE" }, true); dt.LoadDataRow (new object [] { "ROW" }, true); dt.LoadDataRow (new object [] { "ROWID" }, true); dt.LoadDataRow (new object [] { "ROWNUM" }, true); dt.LoadDataRow (new object [] { "ROWS" }, true); dt.LoadDataRow (new object [] { "SELECT" }, true); dt.LoadDataRow (new object [] { "SESSION" }, true); dt.LoadDataRow (new object [] { "SET" }, true); dt.LoadDataRow (new object [] { "SHARE" }, true); dt.LoadDataRow (new object [] { "SIZE" }, true); dt.LoadDataRow (new object [] { "SMALLINT" }, true); dt.LoadDataRow (new object [] { "START" }, true); dt.LoadDataRow (new object [] { "SUCCESSFUL" }, true); dt.LoadDataRow (new object [] { "SYNONYM" }, true); dt.LoadDataRow (new object [] { "SYSDATE" }, true); dt.LoadDataRow (new object [] { "TABLE" }, true); dt.LoadDataRow (new object [] { "THEN" }, true); dt.LoadDataRow (new object [] { "TO" }, true); dt.LoadDataRow (new object [] { "TRIGGER" }, true); dt.LoadDataRow (new object [] { "UID" }, true); dt.LoadDataRow (new object [] { "UNION" }, true); dt.LoadDataRow (new object [] { "UNIQUE" }, true); dt.LoadDataRow (new object [] { "UPDATE" }, true); dt.LoadDataRow (new object [] { "USER" }, true); dt.LoadDataRow (new object [] { "VALIDATE" }, true); dt.LoadDataRow (new object [] { "VALUES" }, true); dt.LoadDataRow (new object [] { "VARCHAR" }, true); dt.LoadDataRow (new object [] { "VARCHAR2" }, true); dt.LoadDataRow (new object [] { "VIEW" }, true); dt.LoadDataRow (new object [] { "WHENEVER" }, true); dt.LoadDataRow (new object [] { "WHERE" }, true); dt.LoadDataRow (new object [] { "WITH" }, true); return dt; } DataTable GetSchemaDataTable (OracleCommand cmd, string [] restrictionValues) { if (restrictionValues != null) { for (int i = 0; i < restrictionValues.Length; i++) cmd.Parameters [i].Value = restrictionValues [i]; } OracleDataAdapter adapter = new OracleDataAdapter (cmd); DataTable dt = new DataTable (); adapter.Fill (dt); return dt; } } }