0

Sequel を MS SQL データベースに接続する際に問題が発生しています。私は以下をインストールしました:

  • UnixODBC
  • 無料TDS

両方のソフトウェア パッケージを構成しました。次のコマンドを使用すると、問題なくデータベースに接続できます。

  • isql
  • tsql
  • osql

ただし、Sequel.odbc コマンドを使用して Ruby コードから実行しようとすると、次のエラーが表示されます。

ODBC::エラー: IM003 (0) [iODBC][ドライバー マネージャー]指定されたドライバーを読み込めませんでした。

これは私が得ることができる限りです。以前は最初に別のエラーが発生していましたが、構成部分をやり直すことで解決できました。私はそこで何かを逃したと思います。

編集

これは私のベース トーカー クラスのコードです。Rails と同様に基本的に YAML ファイルをロードし、データベース設定を保持してデータベースへの接続を確立します。これは機能しているようです。手動で試してみると、続編からDBオブジェクトが返されます:

module Talkers
  require 'yaml'
  require 'sequel'

  class BaseTalker
    # This function will load the desired settings as a hash from the database.yml file
    # in the config folder. The data will be returned as a hash following the standard
    # YAML structure.
    def self.load_config(name)
      cfg = YAML::load(File.open(File.join(ENV['API_ROOT'], 'config', 'database.yml')))
      cfg.key?(name) ? cfg[name] : nil
    end

    # This function will establish a connection with the Florensia User database and return
    # the Sequel database object, so that queries can be executed against the database.
    def self.connect_to_user_db
      settings = self.load_config("florensia_user_#{ENV['RACK_ENV']}")
      Sequel.odbc settings['dsn'], :db_type => settings['adapter'], :user => settings['user'], :password => settings['password']
    end
  end
end

以下のクラスは、トーカーから継承し、ユーザーに対して特定のアクションを実行します。ゲーム固有の DB ロジックが含まれています。このロジックを呼び出すと、次のエラーが表示されます。

module Talkers
  require 'yaml'
  require 'sequel'

  class LoginDbTalker < BaseTalker
    #
    # Bans the specified User from the game. The function requires the following information
    # to be supplied in order for the ban to be properly set:
    # - id : The identifier of the account.
    # - gm_name : The name of the GM setting the ban.
    # - punish_code : The punishment code being applied on the account.
    # - days : The duration of the ban in days, starting from today.
    #
    # The function will return true if the ban has been properly set; otherwise the function
    # will return false.
    def self.ban_user(options = {})
      return false if options.empty?
      db = self.connect_to_user_db
      ds = db[:tbl_User].filter(:id => options[:id])
      ps = ds.prepare(:update, :apply_ban)
      ps.call(
          :punishcode => options[:punish_code],
          :punishstory => "Banned by #{options[:gm_name]}",
          :punishdate => Date.today,
          :punishfreedate => (options[:days].to_i == -1) ? (Date.today + (30 * 265)) : (Date.today + options[:days].to_i))
      true
    rescue Exception => e
      puts "Exception caught in ban_user: #{e.to_s}"
      puts "Provided variables: id=#{options[:id]}, gm_name=#{options[:gm_name]}, punish_code=#{options[:punish_code]}, days=#{options[:days]}"
      false
    end
    #
    # Unbans the specified User from the game. The function requires the following information
    # to be supplied in order for the ban to be properly lifted:
    # - id : The identifier of the account.
    # - gm_name : The name of the GM removing the ban.
    #
    # The function will return true if the ban has been properly lifted; otherwise the function
    # will return false.
    def self.unban_user(options = {})
      db = self.connect_to_user_db
      ds = db[:tbl_User].filter(:id => options[:id])
      ps = ds.prepare(:update, :lift_ban)
      ps.call(
          :punishcode => '0',
          :punishstory => "Ban removed by #{options[:gm_name]}",
          :punishdate => Date.today,
          :punishfreedate => Date.today
      )
      true
    rescue Exception => e
      puts "Exception caught in unban_user: #{e.to_s}"
      puts "Provided variables: id=#{options[:id]}, gm_name=#{options[:gm_name]}"
      false
    end
    #
    # Kicks the specified User from the game, regardless on the server or character he currently is on.
    # This requires a direct connection to the game servers so a specialized command can be sent that
    # instruct the server to close the connection with the offending player.
    # The function returns true if the kick succeeded; otherwise false.
    def self.kick_player(id)
      false
    end
  end
end

ban/unban 関数を呼び出すと、エラー メッセージが表示されます。

EDIT2

/Library/ODBC フォルダーを追加し、iODBC のすべての構成ファイルをそこにリンクしました。これにより、以前に発生したエラーが削除され、次のエラーが表示されます。

ODBC::エラー: 01000 (20002) [FreeTDS][SQL Server]Adaptive Server 接続に失敗しました

それで、私はまたいくらか進歩したようです

4

1 に答える 1

0

OS X から Microsoft SQL Server に接続している場合は、odbc アダプターの代わりに tinytds アダプターを使用することをお勧めします。Windows 以外のボックスで Sequel/ODBC を実行している人がいることは知っていますが、Sequel/ODBC の経験しかありません。 Windows 上の ODBC。

于 2012-04-19T15:59:12.610 に答える