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

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

SybaseSQLAnywhere12Dialect.cs

 新しい名前に変更されたSybaseSQLAnywhere12Dialectクラスは、NHibernate 3.2.0ディストリビューションに含まれているSybaseSQLAnywhere11Dialectをベースにしています。SybaseSQLAnywhere12Dialectクラスは主として、現在SQL Anywhere 12でサポートされているISO標準SQLシーケンスに対するサポートを提供します。それ以外に小さな変更点が2つあります。1つは、TIMESTAMP WITH TIME ZONEデータ型(DATETIMEOFFSETとも呼ばれます)のサポートです。そしてもう1つは、前述のように、修正されたメタデータクラスSybaseSQLAnywhere11DataBaseMetaDataを使用することです。次に、SybaseSQLAnywhere12Dialect.csのコードを紹介します。このコードはNHibernate/src/NHibernate/Dialectディレクトリに配置します。

using System;
using System.Collections;
using System.Data;
using System.Data.Common;
using System.Text.RegularExpressions;
 
using NHibernate.Dialect.Function;
using NHibernate.Dialect.Lock;
using NHibernate.Dialect.Schema;
using NHibernate.Engine;
using NHibernate.Exceptions;
using NHibernate.Mapping;
using NHibernate.SqlCommand;
using NHibernate.Type;
using NHibernate.Util;
 
using Environment = NHibernate.Cfg.Environment;
 
namespace NHibernate.Dialect
{
    /// <summary>
    /// SQL Dialect for SQL Anywhere 12 - for the NHibernate 3.2.0 distribution
    /// Copyright (C) 2011 Glenn Paulley
        /// 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 SybaseSQLAnywhere12Dialect
        /// uses the SybaseSQLAnywhere11Dialect as its base class.
        /// SybaseSQLAnywhere12Dialect includes support for ISO SQL standard
        /// sequences, which are defined in the catalog table <tt>SYSSEQUENCE</tt>. 
    /// The dialect uses the SybaseSQLAnywhere11MetaData class for metadata API
    /// calls, which correctly supports reserved words defined by SQL Anywhere.
    /// </remarks>
    public class SybaseSQLAnywhere12Dialect : SybaseSQLAnywhere11Dialect
    {
        /// <summary></summary>
        public SybaseSQLAnywhere12Dialect()
        {
            RegisterDateTimeTypeMappings();
            RegisterKeywords();
        }
 
        new protected void RegisterKeywords() 
        {
            RegisterKeyword( "NEAR" );
            RegisterKeyword( "LIMIT" );
            RegisterKeyword( "OFFSET" );
            RegisterKeyword( "DATETIMEOFFSET" );
        }
 
        new protected void RegisterDateTimeTypeMappings() 
        {
            RegisterColumnType(DbType.DateTimeOffset, "DATETIMEOFFSET");
        }
 
 
        // DDL support ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
        /// <summary> 
        /// SQL Anywhere supports <tt>SEQUENCES</tt> using a primarily SQL Standard 
            /// syntax. Sequence values can be queried using the <tt>.CURRVAL</tt> identifier, and the next
            /// value in a sequence can be retrieved using the <tt>.NEXTVAL</tt> identifier. Sequences
            /// are retained in the SYS.SYSSEQUENCE catalog table. 
        /// </summary>
        public override bool SupportsSequences
        {
            get { return true; }
        }
 
            /// <summary>
            /// Pooled sequences does not refer to the CACHE parameter of the <tt>CREATE SEQUENCE</tt>
            /// statement, but merely if the DBMS supports sequences that can be incremented or decremented
            /// by values greater than 1. 
            /// </summary>
        public override bool SupportsPooledSequences
        {
            get { return true; }
        }
 
        /// <summary> Get the <tt>SELECT</tt> command used retrieve the names of all sequences.</summary>
        /// <returns> The <tt>SELECT</tt> command; or NULL if sequences are not supported. </returns>
        public override string QuerySequencesString
        {
            get { return "SELECT SEQUENCE_NAME FROM SYS.SYSSEQUENCE"; }
        }
 
 
        public override string GetSequenceNextValString( string sequenceName )
        {
            return "SELECT " + GetSelectSequenceNextValString(sequenceName) + " FROM SYS.DUMMY";
        }
 
        public override string GetSelectSequenceNextValString( string sequenceName )
        {
            return sequenceName + ".NEXTVAL";
        }
 
        public override string GetCreateSequenceString( string sequenceName )
        {
            return "CREATE SEQUENCE " + sequenceName; // by default, is START WITH 1 MAXVALUE 2**63-1
        }
 
        public override string GetDropSequenceString( string sequenceName )
        {
            return "DROP SEQUENCE " + sequenceName;
        }
 
            // Informational metadata ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
        public override IDataBaseSchema GetDataBaseSchema( DbConnection connection )
        {
            return new SybaseSQLAnywhere11DataBaseMetaData( connection );
        }
 
    }
}

 この方言ファイルについて最後に注意点を1つだけ補足しておきます。NHibernate 3.2.0ディストリビューションに含まれているSybaseSQLAnywhere10Dialect.csには、バイナリ型のマッピングに入力ミスが含まれています。つまり、このコードではLONG VARBINARYという型を参照していますが、これは誤りで、正しくはLONG BINARYです。これは私のミスでした。今後リリースされるNHibernateでは、(Julianを介して)この点が確実に修正されるようにします。

次のページ
SybaseSQLAnywhere11MetaData.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」など、さまざまなカンファレンスを企画・運営しています。

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

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

メールバックナンバー

アクセスランキング

アクセスランキング