SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Glenn Paulley氏 データベース関連ブログ 翻訳記事(PR)

SQL Anywhere 12.0.1でのNHibernate 3.2.0 GAの使用

原文:Using NHibernate 3.2.0 GA with SQL Anywhere 12.0.1

  • このエントリーをはてなブックマークに追加

SybaseSQLAnywhere11MetaData.cs

 NHibernate 3.2.0ディストリビューションのNHibernate/src/NHibernate/Dialect/SchemaにはSybaseAnywhereMetaDataクラスが含まれています。ただしこのクラスには、iAnywhere ADO.NETプロバイダと連動するために必要なGetReservedWords() API呼び出しのオーバーライドが含まれていません。次に示すSybaseSQLAnywhere11MetaData.csの中の新しいクラスであるSybaseSQLAnywhere11DataBaseMetaDataには、この呼び出しが含まれています。

using System;
using System.Data;
using System.Data.Common;
using Iesi.Collections.Generic;
 
namespace NHibernate.Dialect.Schema
{
    /// <summary>
    /// Metadata support for connections using the iAnywhere.Data.SQLAnywhere 
    /// ADO.NET provider for SQL Anywhere 11 - for the NHibernate 3.2.0 distribution
    /// 
        /// Contact: http://iablog.sybase.com/paulley
    ///
    /// This NHibernate dialect for SQL Anywhere 12 is a contribution to the NHibernate
        /// open-source project. It is intended to be included in the NHibernate 
        /// distribution and is licensed under LGPL.
    ///
    /// This library is free software; you can redistribute it and/or
    /// modify it under the terms of the GNU Lesser General Public
    /// License as published by the Free Software Foundation; either
    /// version 2.1 of the License, or (at your option) any later version.
    ///
    /// This library is distributed in the hope that it will be useful,
    /// but WITHOUT ANY WARRANTY; without even the implied warranty of
    /// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
    /// Lesser General Public License for more details.
    ///
    /// You should have received a copy of the GNU Lesser General Public
    /// License along with this library; if not, write to the Free Software
    /// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
    ///
    /// </summary>
    /// <remarks>
        /// The SQLAnywhere11DataBaseMetaData, SQLAnywhere11TableMetaData, and the like offer
        /// support for the .NET metadata APIs from within NHibernate. This file is now versioned
        /// with "SQL Anywhere 11" to accomodate API changes with later SQL Anywhere releases.
    /// </remarks>
    public class SybaseSQLAnywhere11DataBaseMetaData : AbstractDataBaseSchema
    {
        public SybaseSQLAnywhere11DataBaseMetaData(DbConnection connection) : base( connection ) 
        {
        }
 
        public override ITableMetadata GetTableMetadata(DataRow rs, bool extras)
        {
            return new SybaseSQLAnywhere11TableMetaData(rs, this, extras);
        }
 
        public override DataTable GetTables(string catalog, string schemaPattern, string tableNamePattern, string[] types)
        {
            var restrictions = new[] {schemaPattern, tableNamePattern, null};
            DataTable objTbl = Connection.GetSchema("Tables", restrictions);
            return objTbl;
        }
 
        public override DataTable GetIndexInfo(string catalog, string schemaPattern, string tableName)
        {
            var restrictions = new[] {schemaPattern, tableName, null};
            DataTable objTbl = Connection.GetSchema("Indexes", restrictions);
            return objTbl;
        }
 
        public override DataTable GetIndexColumns(string catalog, string schemaPattern, string tableName, string indexName)
        {
            var restrictions = new[] {schemaPattern, tableName, indexName, null};
            DataTable objTbl = Connection.GetSchema("IndexColumns", restrictions);
            return objTbl;
        }
 
        public override DataTable GetColumns(string catalog, string schemaPattern, string tableNamePattern,
                                             string columnNamePattern)
        {
            var restrictions = new[] {schemaPattern, tableNamePattern, null};
            DataTable objTbl = Connection.GetSchema("Columns", restrictions);
            return objTbl;
        }
 
        public override DataTable GetForeignKeys(string catalog, string schema, string table)
        {
            var restrictions = new[] {schema, table, null};
            DataTable objTbl = Connection.GetSchema("ForeignKeys", restrictions);
            return objTbl;
        }
 
        public override ISet<string> GetReservedWords()
        {
            var result = new HashedSet<string>();
            DataTable dtReservedWords = Connection.GetSchema(DbMetaDataCollectionNames.ReservedWords);
            foreach (DataRow row in dtReservedWords.Rows)
            {
                result.Add(row["reserved_word"].ToString());
            }
            return result;
        }
 
    }
 
    public class SybaseSQLAnywhere11TableMetaData : AbstractTableMetadata
    {
        public SybaseSQLAnywhere11TableMetaData(DataRow rs, IDataBaseSchema meta, bool extras) : base(rs, meta, extras) {}
 
        protected override IColumnMetadata GetColumnMetadata(DataRow rs)
        {
            return new SybaseSQLAnywhere11ColumnMetaData(rs);
        }
 
        protected override string GetColumnName(DataRow rs)
        {
            return Convert.ToString(rs["COLUMN_NAME"]);
        }
 
        protected override string GetConstraintName(DataRow rs)
        {
            // The ADO provider for SQL Anywhere 11 does not support constraint names. 
            // Hence we simply return the column name here ...
            return Convert.ToString(rs["COLUMN_NAME"]);
        }
 
        protected override IForeignKeyMetadata GetForeignKeyMetadata(DataRow rs)
        {
            return new SybaseSQLAnywhere11ForeignKeyMetaData(rs);
        }
 
        protected override IIndexMetadata GetIndexMetadata(DataRow rs)
        {
            return new SybaseSQLAnywhere11IndexMetaData(rs);
        }
 
        protected override string GetIndexName(DataRow rs)
        {
            return (string) rs["INDEX_NAME"];
        }
 
        protected override void ParseTableInfo(DataRow rs)
        {
            Catalog = null;
            Schema = Convert.ToString(rs["TABLE_SCHEMA"]);
            if (string.IsNullOrEmpty(Schema))
            {
                Schema = null;
            }
            Name = Convert.ToString(rs["TABLE_NAME"]);
        }
    }
 
    public class SybaseSQLAnywhere11ColumnMetaData : AbstractColumnMetaData
    {
        public SybaseSQLAnywhere11ColumnMetaData(DataRow rs) : base(rs)
        {
            Name = Convert.ToString(rs["COLUMN_NAME"]);
            object objValue = rs["COLUMN_SIZE"];
            if (objValue != DBNull.Value)
            {
                ColumnSize = Convert.ToInt32(objValue);
            }
            objValue = rs["PRECISION"];
            if (objValue != DBNull.Value)
            {
                NumericalPrecision = Convert.ToInt32(objValue);
            }
            Nullable = Convert.ToString(rs["IS_NULLABLE"]);
            TypeName = Convert.ToString(rs["DATA_TYPE"]);
        }
    }
 
    public class SybaseSQLAnywhere11IndexMetaData : AbstractIndexMetadata
    {
        public SybaseSQLAnywhere11IndexMetaData(DataRow rs) : base(rs)
        {
            Name = (string) rs["INDEX_NAME"];
        }
    }
 
    public class SybaseSQLAnywhere11ForeignKeyMetaData : AbstractForeignKeyMetadata
    {
        public SybaseSQLAnywhere11ForeignKeyMetaData(DataRow rs) : base(rs)
        {
            // SQL Anywhere 11 does support constraint names but the version 11 ADO.NET 
            // provider does not offer an ability to retrieve them... so we merely
            // return the column name.
 
            Name = (string) rs["COLUMN_NAME"];
        }
    }
}

次のページ
SybaseSQLAnywhere12Driver.cs

この記事は参考になりましたか?

  • このエントリーをはてなブックマークに追加
Glenn Paulley氏 データベース関連ブログ 翻訳記事連載記事一覧

もっと読む

この記事の著者

Glenn Paulley(Glenn Paulley)

カナダ オンタリオ州 ウォータールー R&DセンターにてSQL Anywhere 開発における Director of Engineering としてクエリ・オプティマイザなどの開発をリードしている。・IvanAnywhere

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/6159 2011/12/01 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング