public DataSourceInformation(DataTable dt)
        {
            //DataTable dt = Connection.GetSchema(
            //   DbMetaDataCollectionNames.DataSourceInformation);
            foreach (DataRow r in dt.Rows)
            {
                foreach (DataColumn c in dt.Columns)
                {
                    string s = c.ColumnName;
                    object o = r[c.ColumnName];
                    //just for safety
                    if (o == DBNull.Value)
                    {
                        o = null;
                    }
                    if (!string.IsNullOrEmpty(s) && o != null)
                    {
                        switch (s)
                        {
                        case "QuotedIdentifierCase":
                            _quotedIdentifierCase = new Regex(o.ToString());
                            break;

                        case "StringLiteralPattern":
                            _stringLiteralPattern = new Regex(o.ToString());
                            break;

                        case "GroupByBehavior":
                            o = Convert.ChangeType(o, _GroupByBehaviorType);
                            _groupByBehavior = (GroupByBehavior)o;
                            break;

                        case "IdentifierCase":
                            o = Convert.ChangeType(o, _IdentifierCaseType);
                            _identifierCase = (IdentifierCase)o;
                            break;

                        case "SupportedJoinOperators":
                            o = Convert.ChangeType(o, _SupportedJoinOperatorsType);
                            _supportedJoinOperators = (SupportedJoinOperators)o;
                            // (o as SupportedJoinOperators?) ??
                            //    SupportedJoinOperators.None;
                            break;

                        default:
                            FieldInfo fi = _Type.GetField("_" + s,
                                                          BindingFlags.IgnoreCase | BindingFlags.NonPublic |
                                                          BindingFlags.Instance);
                            if (fi != null)
                            {
                                fi.SetValue(this, o);
                            }
                            break;
                        }
                    }
                }
                //there should only ever be a single row.
                break;
            }
        }
 public DataSourceInformation(DataTable dt)
 {
     //DataTable dt = Connection.GetSchema(
     //   DbMetaDataCollectionNames.DataSourceInformation);
     foreach (DataRow r in dt.Rows)
     {
         foreach (DataColumn c in dt.Columns)
         {
             string s = c.ColumnName;
             object o = r[c.ColumnName];
             //just for safety
             if (o == DBNull.Value)
             {
                 o = null;
             }
             if (!string.IsNullOrEmpty(s) && o != null)
             {
                 switch (s)
                 {
                     case "QuotedIdentifierCase":
                         _quotedIdentifierCase = new Regex(o.ToString());
                         break;
                     case "StringLiteralPattern":
                         _stringLiteralPattern = new Regex(o.ToString());
                         break;
                     case "GroupByBehavior":
                         o = Convert.ChangeType(o, _GroupByBehaviorType);
                         _groupByBehavior = (GroupByBehavior)o;
                         break;
                     case "IdentifierCase":
                         o = Convert.ChangeType(o, _IdentifierCaseType);
                         _identifierCase = (IdentifierCase)o;
                         break;
                     case "SupportedJoinOperators":
                         o = Convert.ChangeType(o, _SupportedJoinOperatorsType);
                         _supportedJoinOperators = (SupportedJoinOperators)o;
                         // (o as SupportedJoinOperators?) ??
                         //    SupportedJoinOperators.None;
                         break;
                     default:
                         FieldInfo fi = _Type.GetField("_" + s,
                           BindingFlags.IgnoreCase | BindingFlags.NonPublic |
                           BindingFlags.Instance);
                         if (fi != null)
                         {
                             fi.SetValue(this, o);
                         }
                         break;
                 }
             }
         }
         //there should only ever be a single row.
         break;
     }
 }
예제 #3
0
        /// <summary>
        /// Adds a row to the given <c>DataSourceInformationCollection</c> table.
        /// </summary>
        /// <param name="table">
        /// The table to which to add the row.
        /// </param>
        /// <param name="compositeIdentifierSeparatorPattern">
        /// The composite identifier separator pattern.
        /// </param>
        /// <param name="dataSourceProductName">
        /// Name of the data source product.
        /// </param>
        /// <param name="dataSourceProductVersion">
        /// The data source product version.
        /// </param>
        /// <param name="dataSourceProductVersionNormalized">
        /// The data source product version normalized.
        /// </param>
        /// <param name="groupByBehavior">
        /// The group by behavior.
        /// </param>
        /// <param name="identifierPattern">
        /// The identifier pattern.
        /// </param>
        /// <param name="identifierCase">
        /// The identifier case.
        /// </param>
        /// <param name="orderByColumnsInSelect">
        /// if set to <c>true</c> [order by columns in select].
        /// </param>
        /// <param name="parameterMarkerFormat">
        /// The parameter marker format.
        /// </param>
        /// <param name="parameterMarkerPattern">
        /// The parameter marker pattern.
        /// </param>
        /// <param name="parameterNameMaxLength">
        /// Length of the parameter name max.
        /// </param>
        /// <param name="parameterNamePattern">
        /// The parameter name pattern.
        /// </param>
        /// <param name="quotedIdentifierPattern">
        /// The quoted identifier pattern.
        /// </param>
        /// <param name="quotedIdentifierCase">
        /// The quoted identifier case.
        /// </param>
        /// <param name="statementSeparatorPattern">
        /// The statement separator pattern.
        /// </param>
        /// <param name="stringLiteralPattern">
        /// The string literal pattern.
        /// </param>
        /// <param name="supportedJoinOperators">
        /// The supported join operators.
        /// </param>
        public static void AddRow(
            DataTable table,
            string compositeIdentifierSeparatorPattern,
            string dataSourceProductName,
            string dataSourceProductVersion,
            string dataSourceProductVersionNormalized,
            GroupByBehavior groupByBehavior,
            string identifierPattern,
            IdentifierCase identifierCase,
            bool orderByColumnsInSelect,
            string parameterMarkerFormat,
            string parameterMarkerPattern,
            int parameterNameMaxLength,
            string parameterNamePattern,
            string quotedIdentifierPattern,
            IdentifierCase quotedIdentifierCase,
            string statementSeparatorPattern,
            string stringLiteralPattern,
            SupportedJoinOperators supportedJoinOperators)
        {
            DataRow row = table.NewRow();

            row[MDCN.CompositeIdentifierSeparatorPattern]
                = compositeIdentifierSeparatorPattern;
            row[MDCN.DataSourceProductName]    = dataSourceProductName;
            row[MDCN.DataSourceProductVersion] = dataSourceProductVersion;
            row[MDCN.DataSourceProductVersionNormalized]
                = dataSourceProductVersionNormalized;
            row[MDCN.GroupByBehavior]           = groupByBehavior;
            row[MDCN.IdentifierPattern]         = identifierPattern;
            row[MDCN.IdentifierCase]            = identifierCase;
            row[MDCN.OrderByColumnsInSelect]    = orderByColumnsInSelect;
            row[MDCN.ParameterMarkerFormat]     = parameterMarkerFormat;
            row[MDCN.ParameterMarkerPattern]    = parameterMarkerPattern;
            row[MDCN.ParameterNameMaxLength]    = parameterNameMaxLength;
            row[MDCN.ParameterNamePattern]      = parameterNamePattern;
            row[MDCN.QuotedIdentifierPattern]   = quotedIdentifierPattern;
            row[MDCN.QuotedIdentifierCase]      = quotedIdentifierCase;
            row[MDCN.StatementSeparatorPattern] = statementSeparatorPattern;
            row[MDCN.StringLiteralPattern]      = stringLiteralPattern;
            row[MDCN.SupportedJoinOperators]    = supportedJoinOperators;

            table.Rows.Add(row);
        }
예제 #4
0
        private DataTable GetDataSourceInformationTable(OleDbConnection connection, OleDbConnectionInternal internalConnection)
        {
            // verify that the data source information table is in the data set
            DataTable dataSourceInformationTable = CollectionDataSet.Tables[DbMetaDataCollectionNames.DataSourceInformation];

            if (dataSourceInformationTable == null)
            {
                throw ADP.UnableToBuildCollection(DbMetaDataCollectionNames.DataSourceInformation);
            }

            // copy the table filtering out any rows that don't apply to tho current version of the prrovider
            dataSourceInformationTable = CloneAndFilterCollection(DbMetaDataCollectionNames.DataSourceInformation, null);

            // after filtering there better be just one row
            if (dataSourceInformationTable.Rows.Count != 1)
            {
                throw ADP.IncorrectNumberOfDataSourceInformationRows();
            }
            DataRow dataSourceInformation = dataSourceInformationTable.Rows[0];

            // update the identifier separator
            string catalogSeparatorPattern = internalConnection.GetLiteralInfo(ODB.DBLITERAL_CATALOG_SEPARATOR);
            string schemaSeparatorPattern  = internalConnection.GetLiteralInfo(ODB.DBLITERAL_SCHEMA_SEPARATOR);

            if (catalogSeparatorPattern != null)
            {
                StringBuilder compositeSeparatorPattern = new StringBuilder();
                StringBuilder patternEscaped            = new StringBuilder();
                ADP.EscapeSpecialCharacters(catalogSeparatorPattern, patternEscaped);
                compositeSeparatorPattern.Append(patternEscaped.ToString());
                if ((schemaSeparatorPattern != null) && (schemaSeparatorPattern != catalogSeparatorPattern))
                {
                    compositeSeparatorPattern.Append("|");
                    patternEscaped.Length = 0;
                    ADP.EscapeSpecialCharacters(schemaSeparatorPattern, patternEscaped);
                    compositeSeparatorPattern.Append(patternEscaped.ToString());
                }
                dataSourceInformation[DbMetaDataColumnNames.CompositeIdentifierSeparatorPattern] = compositeSeparatorPattern.ToString();
            }
            else if (schemaSeparatorPattern != null)
            {
                StringBuilder patternEscaped = new StringBuilder();
                ADP.EscapeSpecialCharacters(schemaSeparatorPattern, patternEscaped);
                dataSourceInformation[DbMetaDataColumnNames.CompositeIdentifierSeparatorPattern] = patternEscaped.ToString();
                ;
            }

            // update the DataSourceProductName
            object property;

            property = connection.GetDataSourcePropertyValue(OleDbPropertySetGuid.DataSourceInfo, ODB.DBPROP_DBMSNAME);
            if (property != null)
            {
                dataSourceInformation[DbMetaDataColumnNames.DataSourceProductName] = (string)property;
            }

            // update the server version strings
            dataSourceInformation[DbMetaDataColumnNames.DataSourceProductVersion]           = ServerVersion;
            dataSourceInformation[DbMetaDataColumnNames.DataSourceProductVersionNormalized] = ServerVersionNormalized;

            // values that are the same for all OLE DB Providers.
            dataSourceInformation[DbMetaDataColumnNames.ParameterMarkerFormat]  = "?";
            dataSourceInformation[DbMetaDataColumnNames.ParameterMarkerPattern] = "\\?";
            dataSourceInformation[DbMetaDataColumnNames.ParameterNameMaxLength] = 0;

            property = connection.GetDataSourcePropertyValue(OleDbPropertySetGuid.DataSourceInfo, ODB.DBPROP_GROUPBY);
            GroupByBehavior groupByBehavior = GroupByBehavior.Unknown;

            if (property != null)
            {
                switch ((int)property)
                {
                case ODB.DBPROPVAL_GB_CONTAINS_SELECT:
                    groupByBehavior = GroupByBehavior.MustContainAll;
                    break;

                case ODB.DBPROPVAL_GB_EQUALS_SELECT:
                    groupByBehavior = GroupByBehavior.ExactMatch;
                    break;

                case ODB.DBPROPVAL_GB_NO_RELATION:
                    groupByBehavior = GroupByBehavior.Unrelated;
                    break;

                case ODB.DBPROPVAL_GB_NOT_SUPPORTED:
                    groupByBehavior = GroupByBehavior.NotSupported;
                    break;
                }
            }
            dataSourceInformation[DbMetaDataColumnNames.GroupByBehavior] = groupByBehavior;

            SetIdentifierCase(DbMetaDataColumnNames.IdentifierCase, ODB.DBPROP_IDENTIFIERCASE, dataSourceInformation, connection);
            SetIdentifierCase(DbMetaDataColumnNames.QuotedIdentifierCase, ODB.DBPROP_QUOTEDIDENTIFIERCASE, dataSourceInformation, connection);

            property = connection.GetDataSourcePropertyValue(OleDbPropertySetGuid.DataSourceInfo, ODB.DBPROP_ORDERBYCOLUNSINSELECT);
            if (property != null)
            {
                dataSourceInformation[DbMetaDataColumnNames.OrderByColumnsInSelect] = (bool)property;
            }

            DataTable infoLiterals = internalConnection.BuildInfoLiterals();

            if (infoLiterals != null)
            {
                DataRow[] tableNameRow = infoLiterals.Select("Literal = " + ODB.DBLITERAL_TABLE_NAME.ToString(CultureInfo.InvariantCulture));
                if (tableNameRow != null)
                {
                    object invalidCharsObject = tableNameRow[0]["InvalidChars"];
                    if (invalidCharsObject.GetType() == typeof(string))
                    {
                        string invalidChars = (string)invalidCharsObject;
                        object invalidStartingCharsObject = tableNameRow[0]["InvalidStartingChars"];
                        string invalidStartingChars;
                        if (invalidStartingCharsObject.GetType() == typeof(string))
                        {
                            invalidStartingChars = (string)invalidStartingCharsObject;
                        }
                        else
                        {
                            invalidStartingChars = invalidChars;
                        }
                        dataSourceInformation[DbMetaDataColumnNames.IdentifierPattern] =
                            BuildRegularExpression(invalidChars, invalidStartingChars);
                    }
                }
            }

            // build the QuotedIdentifierPattern using the quote prefix and suffix from the provider and
            // assuming that the quote suffix is escaped via repetion (i.e " becomes "")
            string quotePrefix;
            string quoteSuffix;

            connection.GetLiteralQuotes(ADP.GetSchema, out quotePrefix, out quoteSuffix);

            if (quotePrefix != null)
            {
                // if the quote suffix is null assume that it is the same as the prefix (See OLEDB spec
                // IDBInfo::GetLiteralInfo DBLITERAL_QUOTE_SUFFIX.)
                if (quoteSuffix == null)
                {
                    quoteSuffix = quotePrefix;
                }

                // only know how to build the parttern if the suffix is 1 character
                // in all other cases just leave the field null
                if (quoteSuffix.Length == 1)
                {
                    StringBuilder scratchStringBuilder = new StringBuilder();
                    ADP.EscapeSpecialCharacters(quoteSuffix, scratchStringBuilder);
                    string escapedQuoteSuffixString = scratchStringBuilder.ToString();
                    scratchStringBuilder.Length = 0;

                    ADP.EscapeSpecialCharacters(quotePrefix, scratchStringBuilder);
                    scratchStringBuilder.Append("(([^");
                    scratchStringBuilder.Append(escapedQuoteSuffixString);
                    scratchStringBuilder.Append("]|");
                    scratchStringBuilder.Append(escapedQuoteSuffixString);
                    scratchStringBuilder.Append(escapedQuoteSuffixString);
                    scratchStringBuilder.Append(")*)");
                    scratchStringBuilder.Append(escapedQuoteSuffixString);
                    dataSourceInformation[DbMetaDataColumnNames.QuotedIdentifierPattern] = scratchStringBuilder.ToString();
                }
            }

            dataSourceInformationTable.AcceptChanges();

            return(dataSourceInformationTable);
        }
        private DataTable GetDataSourceInformationTable(OleDbConnection connection, OleDbConnectionInternal internalConnection)
        {
            string str3;
            string str4;

            if (base.CollectionDataSet.Tables[DbMetaDataCollectionNames.DataSourceInformation] == null)
            {
                throw ADP.UnableToBuildCollection(DbMetaDataCollectionNames.DataSourceInformation);
            }
            DataTable table = base.CloneAndFilterCollection(DbMetaDataCollectionNames.DataSourceInformation, null);

            if (table.Rows.Count != 1)
            {
                throw ADP.IncorrectNumberOfDataSourceInformationRows();
            }
            DataRow row             = table.Rows[0];
            string  literalInfo     = internalConnection.GetLiteralInfo(3);
            string  unescapedString = internalConnection.GetLiteralInfo(0x1b);

            if (literalInfo != null)
            {
                StringBuilder builder3      = new StringBuilder();
                StringBuilder escapedString = new StringBuilder();
                ADP.EscapeSpecialCharacters(literalInfo, escapedString);
                builder3.Append(escapedString.ToString());
                if ((unescapedString != null) && (unescapedString != literalInfo))
                {
                    builder3.Append("|");
                    escapedString.Length = 0;
                    ADP.EscapeSpecialCharacters(unescapedString, escapedString);
                    builder3.Append(escapedString.ToString());
                }
                row[DbMetaDataColumnNames.CompositeIdentifierSeparatorPattern] = builder3.ToString();
            }
            else if (unescapedString != null)
            {
                StringBuilder builder4 = new StringBuilder();
                ADP.EscapeSpecialCharacters(unescapedString, builder4);
                row[DbMetaDataColumnNames.CompositeIdentifierSeparatorPattern] = builder4.ToString();
            }
            object dataSourcePropertyValue = connection.GetDataSourcePropertyValue(OleDbPropertySetGuid.DataSourceInfo, 40);

            if (dataSourcePropertyValue != null)
            {
                row[DbMetaDataColumnNames.DataSourceProductName] = (string)dataSourcePropertyValue;
            }
            row[DbMetaDataColumnNames.DataSourceProductVersion]           = base.ServerVersion;
            row[DbMetaDataColumnNames.DataSourceProductVersionNormalized] = base.ServerVersionNormalized;
            row[DbMetaDataColumnNames.ParameterMarkerFormat]  = "?";
            row[DbMetaDataColumnNames.ParameterMarkerPattern] = @"\?";
            row[DbMetaDataColumnNames.ParameterNameMaxLength] = 0;
            dataSourcePropertyValue = connection.GetDataSourcePropertyValue(OleDbPropertySetGuid.DataSourceInfo, 0x2c);
            GroupByBehavior unknown = GroupByBehavior.Unknown;

            if (dataSourcePropertyValue != null)
            {
                switch (((int)dataSourcePropertyValue))
                {
                case 1:
                    unknown = GroupByBehavior.NotSupported;
                    break;

                case 2:
                    unknown = GroupByBehavior.ExactMatch;
                    break;

                case 4:
                    unknown = GroupByBehavior.MustContainAll;
                    break;

                case 8:
                    unknown = GroupByBehavior.Unrelated;
                    break;
                }
            }
            row[DbMetaDataColumnNames.GroupByBehavior] = unknown;
            this.SetIdentifierCase(DbMetaDataColumnNames.IdentifierCase, 0x2e, row, connection);
            this.SetIdentifierCase(DbMetaDataColumnNames.QuotedIdentifierCase, 100, row, connection);
            dataSourcePropertyValue = connection.GetDataSourcePropertyValue(OleDbPropertySetGuid.DataSourceInfo, 0x55);
            if (dataSourcePropertyValue != null)
            {
                row[DbMetaDataColumnNames.OrderByColumnsInSelect] = (bool)dataSourcePropertyValue;
            }
            DataTable table2 = internalConnection.BuildInfoLiterals();

            if (table2 != null)
            {
                DataRow[] rowArray = table2.Select("Literal = " + 0x11.ToString(CultureInfo.InvariantCulture));
                if (rowArray != null)
                {
                    object obj4 = rowArray[0]["InvalidChars"];
                    if (obj4.GetType() == typeof(string))
                    {
                        string str6;
                        string invalidChars = (string)obj4;
                        object obj3         = rowArray[0]["InvalidStartingChars"];
                        if (obj3.GetType() == typeof(string))
                        {
                            str6 = (string)obj3;
                        }
                        else
                        {
                            str6 = invalidChars;
                        }
                        row[DbMetaDataColumnNames.IdentifierPattern] = this.BuildRegularExpression(invalidChars, str6);
                    }
                }
            }
            connection.GetLiteralQuotes("GetSchema", out str4, out str3);
            if (str4 != null)
            {
                if (str3 == null)
                {
                    str3 = str4;
                }
                if (str3.Length == 1)
                {
                    StringBuilder builder = new StringBuilder();
                    ADP.EscapeSpecialCharacters(str3, builder);
                    string str2 = builder.ToString();
                    builder.Length = 0;
                    ADP.EscapeSpecialCharacters(str4, builder);
                    builder.Append("(([^");
                    builder.Append(str2);
                    builder.Append("]|");
                    builder.Append(str2);
                    builder.Append(str2);
                    builder.Append(")*)");
                    builder.Append(str2);
                    row[DbMetaDataColumnNames.QuotedIdentifierPattern] = builder.ToString();
                }
            }
            table.AcceptChanges();
            return(table);
        }
        /// <summary>
        /// Adds a row to the given <c>DataSourceInformationCollection</c> table.
        /// </summary>
        /// <param name="table">
        /// The table to which to add the row.
        /// </param>
        /// <param name="compositeIdentifierSeparatorPattern">
        /// The composite identifier separator pattern.
        /// </param>
        /// <param name="dataSourceProductName">
        /// Name of the data source product.
        /// </param>
        /// <param name="dataSourceProductVersion">
        /// The data source product version.
        /// </param>
        /// <param name="dataSourceProductVersionNormalized">
        /// The data source product version normalized.
        /// </param>
        /// <param name="groupByBehavior">
        /// The group by behavior.
        /// </param>
        /// <param name="identifierPattern">
        /// The identifier pattern.
        /// </param>
        /// <param name="identifierCase">
        /// The identifier case.
        /// </param>
        /// <param name="orderByColumnsInSelect">
        /// if set to <c>true</c> [order by columns in select].
        /// </param>
        /// <param name="parameterMarkerFormat">
        /// The parameter marker format.
        /// </param>
        /// <param name="parameterMarkerPattern">
        /// The parameter marker pattern.
        /// </param>
        /// <param name="parameterNameMaxLength">
        /// Length of the parameter name max.
        /// </param>
        /// <param name="parameterNamePattern">
        /// The parameter name pattern.
        /// </param>
        /// <param name="quotedIdentifierPattern">
        /// The quoted identifier pattern.
        /// </param>
        /// <param name="quotedIdentifierCase">
        /// The quoted identifier case.
        /// </param>
        /// <param name="statementSeparatorPattern">
        /// The statement separator pattern.
        /// </param>
        /// <param name="stringLiteralPattern">
        /// The string literal pattern.
        /// </param>
        /// <param name="supportedJoinOperators">
        /// The supported join operators.
        /// </param>
        public static void AddRow(
            DataTable table,
            string compositeIdentifierSeparatorPattern,
            string dataSourceProductName,
            string dataSourceProductVersion,
            string dataSourceProductVersionNormalized,
            GroupByBehavior groupByBehavior,
            string identifierPattern,
            IdentifierCase identifierCase,
            bool orderByColumnsInSelect,
            string parameterMarkerFormat,
            string parameterMarkerPattern,
            int parameterNameMaxLength,
            string parameterNamePattern,
            string quotedIdentifierPattern,
            IdentifierCase quotedIdentifierCase,
            string statementSeparatorPattern,
            string stringLiteralPattern,
            SupportedJoinOperators supportedJoinOperators)
        {
            DataRow row = table.NewRow();

            row[MDCN.CompositeIdentifierSeparatorPattern]
                = compositeIdentifierSeparatorPattern;
            row[MDCN.DataSourceProductName] = dataSourceProductName;
            row[MDCN.DataSourceProductVersion] = dataSourceProductVersion;
            row[MDCN.DataSourceProductVersionNormalized]
                = dataSourceProductVersionNormalized;
            row[MDCN.GroupByBehavior] = groupByBehavior;
            row[MDCN.IdentifierPattern] = identifierPattern;
            row[MDCN.IdentifierCase] = identifierCase;
            row[MDCN.OrderByColumnsInSelect] = orderByColumnsInSelect;
            row[MDCN.ParameterMarkerFormat] = parameterMarkerFormat;
            row[MDCN.ParameterMarkerPattern] = parameterMarkerPattern;
            row[MDCN.ParameterNameMaxLength] = parameterNameMaxLength;
            row[MDCN.ParameterNamePattern] = parameterNamePattern;
            row[MDCN.QuotedIdentifierPattern] = quotedIdentifierPattern;
            row[MDCN.QuotedIdentifierCase] = quotedIdentifierCase;
            row[MDCN.StatementSeparatorPattern] = statementSeparatorPattern;
            row[MDCN.StringLiteralPattern] = stringLiteralPattern;
            row[MDCN.SupportedJoinOperators] = supportedJoinOperators;

            table.Rows.Add(row);
        }
        private DataTable GetDataSourceInformationCollection(string[] restrictions, OdbcConnection connection)
        {
            ODBC32.RetCode code;
            int            num;
            short          num2;

            if (!ADP.IsEmptyArray(restrictions))
            {
                throw ADP.TooManyRestrictions(DbMetaDataCollectionNames.DataSourceInformation);
            }
            if (base.CollectionDataSet.Tables[DbMetaDataCollectionNames.DataSourceInformation] == null)
            {
                throw ADP.UnableToBuildCollection(DbMetaDataCollectionNames.DataSourceInformation);
            }
            DataTable table = base.CloneAndFilterCollection(DbMetaDataCollectionNames.DataSourceInformation, null);

            if (table.Rows.Count != 1)
            {
                throw ADP.IncorrectNumberOfDataSourceInformationRows();
            }
            DataRow row = table.Rows[0];
            string  infoStringUnhandled = connection.GetInfoStringUnhandled(ODBC32.SQL_INFO.CATALOG_NAME_SEPARATOR);

            if (!ADP.IsEmpty(infoStringUnhandled))
            {
                StringBuilder escapedString = new StringBuilder();
                ADP.EscapeSpecialCharacters(infoStringUnhandled, escapedString);
                row[DbMetaDataColumnNames.CompositeIdentifierSeparatorPattern] = escapedString.ToString();
            }
            infoStringUnhandled = connection.GetInfoStringUnhandled(ODBC32.SQL_INFO.DBMS_NAME);
            if (infoStringUnhandled != null)
            {
                row[DbMetaDataColumnNames.DataSourceProductName] = infoStringUnhandled;
            }
            row[DbMetaDataColumnNames.DataSourceProductVersion]           = base.ServerVersion;
            row[DbMetaDataColumnNames.DataSourceProductVersionNormalized] = base.ServerVersionNormalized;
            row[DbMetaDataColumnNames.ParameterMarkerFormat]  = "?";
            row[DbMetaDataColumnNames.ParameterMarkerPattern] = @"\?";
            row[DbMetaDataColumnNames.ParameterNameMaxLength] = 0;
            if (connection.IsV3Driver)
            {
                code = connection.GetInfoInt32Unhandled(ODBC32.SQL_INFO.SQL_OJ_CAPABILITIES_30, out num);
            }
            else
            {
                code = connection.GetInfoInt32Unhandled(ODBC32.SQL_INFO.SQL_OJ_CAPABILITIES_20, out num);
            }
            if ((code == ODBC32.RetCode.SUCCESS) || (code == ODBC32.RetCode.SUCCESS_WITH_INFO))
            {
                SupportedJoinOperators none = SupportedJoinOperators.None;
                if ((num & 1) != 0)
                {
                    none |= SupportedJoinOperators.LeftOuter;
                }
                if ((num & 2) != 0)
                {
                    none |= SupportedJoinOperators.RightOuter;
                }
                if ((num & 4) != 0)
                {
                    none |= SupportedJoinOperators.FullOuter;
                }
                if ((num & 0x20) != 0)
                {
                    none |= SupportedJoinOperators.Inner;
                }
                row[DbMetaDataColumnNames.SupportedJoinOperators] = none;
            }
            code = connection.GetInfoInt16Unhandled(ODBC32.SQL_INFO.GROUP_BY, out num2);
            GroupByBehavior unknown = GroupByBehavior.Unknown;

            if ((code == ODBC32.RetCode.SUCCESS) || (code == ODBC32.RetCode.SUCCESS_WITH_INFO))
            {
                switch (num2)
                {
                case 0:
                    unknown = GroupByBehavior.NotSupported;
                    break;

                case 1:
                    unknown = GroupByBehavior.ExactMatch;
                    break;

                case 2:
                    unknown = GroupByBehavior.MustContainAll;
                    break;

                case 3:
                    unknown = GroupByBehavior.Unrelated;
                    break;
                }
            }
            row[DbMetaDataColumnNames.GroupByBehavior] = unknown;
            code = connection.GetInfoInt16Unhandled(ODBC32.SQL_INFO.IDENTIFIER_CASE, out num2);
            IdentifierCase insensitive = IdentifierCase.Unknown;

            if ((code == ODBC32.RetCode.SUCCESS) || (code == ODBC32.RetCode.SUCCESS_WITH_INFO))
            {
                switch (num2)
                {
                case 1:
                case 2:
                case 4:
                    insensitive = IdentifierCase.Insensitive;
                    break;

                case 3:
                    insensitive = IdentifierCase.Sensitive;
                    break;
                }
            }
            row[DbMetaDataColumnNames.IdentifierCase] = insensitive;
            switch (connection.GetInfoStringUnhandled(ODBC32.SQL_INFO.ORDER_BY_COLUMNS_IN_SELECT))
            {
            case "Y":
                row[DbMetaDataColumnNames.OrderByColumnsInSelect] = true;
                break;

            case "N":
                row[DbMetaDataColumnNames.OrderByColumnsInSelect] = false;
                break;
            }
            infoStringUnhandled = connection.QuoteChar("GetSchema");
            if (((infoStringUnhandled != null) && (infoStringUnhandled != " ")) && (infoStringUnhandled.Length == 1))
            {
                StringBuilder builder = new StringBuilder();
                ADP.EscapeSpecialCharacters(infoStringUnhandled, builder);
                string str2 = builder.ToString();
                builder.Length = 0;
                ADP.EscapeSpecialCharacters(infoStringUnhandled, builder);
                builder.Append("(([^");
                builder.Append(str2);
                builder.Append("]|");
                builder.Append(str2);
                builder.Append(str2);
                builder.Append(")*)");
                builder.Append(str2);
                row[DbMetaDataColumnNames.QuotedIdentifierPattern] = builder.ToString();
            }
            code = connection.GetInfoInt16Unhandled(ODBC32.SQL_INFO.QUOTED_IDENTIFIER_CASE, out num2);
            IdentifierCase sensitive = IdentifierCase.Unknown;

            if ((code == ODBC32.RetCode.SUCCESS) || (code == ODBC32.RetCode.SUCCESS_WITH_INFO))
            {
                switch (num2)
                {
                case 1:
                case 2:
                case 4:
                    sensitive = IdentifierCase.Insensitive;
                    break;

                case 3:
                    sensitive = IdentifierCase.Sensitive;
                    break;
                }
            }
            row[DbMetaDataColumnNames.QuotedIdentifierCase] = sensitive;
            table.AcceptChanges();
            return(table);
        }