[#46732] ヒアドキュメント内の変数展開が正常に行われない — ShingoKintaka <kamuycikap@...>

Ruby  :1.8.7 (Ubuntu9.10)

12 messages 2010/01/05
[#46733] Re: ヒアドキュメント内の変数展開が正常に行われない — rubikitch@... 2010/01/06

From: ShingoKintaka <kamuycikap@tulip.ocn.ne.jp>

[#46800] DLモジュールの使い方 — kouichi_someya@...

染谷と申します。

12 messages 2010/01/20
[#47678] プログラム実行時に「[BUG] Segmentation fault」 — 染谷 康一 <kouichi_someya@...> 2010/12/09

染谷と申します。

[ruby-list:46802] DBI::MySQLエラー

From: eiichi_maekawa@...
Date: 2010-01-21 07:35:40 UTC
List: ruby-list #46802
前川です。

RubyでMySQLを操作するために、色々試していますが、テーブル名・データベース名
以外はエラーとなります。
テーブル名・データベース名が取得できているので、
何が原因で、[BUG] Segmentation faultが生じたのか、見当がつきません。
ご教示、よろしく、お願いします。

実施したのは、
SELECT * FROM テーブル名
SHOW COLUMNS FROM テーブル名
DESCRIBE テーブル名
です。
後述していますが、とみたさんのmysqlを使用したサンプルコードでは、
データは問題なく取得できています。

エラーの内容は、以下です。

D:/Ruby/lib/ruby/site_ruby/1.8/dbd/mysql/statement.rb:130: [BUG]
Segmentation fault
ruby 1.8.7 (2010-01-10 patchlevel 249) [i386-mswin32]


This application has requested the Runtime to terminate it in an unusual
way.
Please contact the application's support team for more information.
#<DBI::DatabaseHandle:0x2cd6a34> #←dbh(DBI.connectの結果)
#<DBI::StatementHandle:0x2cd65c0> #←sth(dbh.prepare(SELECT * FROM テーブル
名)の結果
Complete(3)

'show databases'を実行した結果は正しく取れてます。

#<DBI::DatabaseHandle:0x2cd6a34>
#<DBI::StatementHandle:0x2cd65c0>
count=4 #←DB数
["information_schema"]
["ユーザDB名"]
["mysql"]
["test"]
increment count=4 #←DB数
Complete(0)


サンプルコードは、
http://www.jiubao.org/ruby-dbi/ruby-dbi.html#TOC_3 を参考に作成し、以下で
す。

#!D:/Ruby/bin/ruby.exe -Ks

require "dbi"

begin
  #dbh = DBI.connect('DBI:Mysql:fbsys:a28341', 'dbuser01', 'dbkey')
  dbh = DBI.connect("DBI:Mysql:fbsys:localhost", "root", "dbkey")
  #sth = dbh.prepare('SHOW TABLES') #←OK
  sth = dbh.prepare('SELECT * FROM aplist')
  #sth = dbh.prepare('SHOW COLUMNS FROM aplist')
  #sth = dbh.prepare('DESCRIBE aplist')
  #sth = dbh.prepare('show databases') #OK
  puts dbh
  puts sth
  sth.execute
  puts 'count='+sth.rows.to_s #テーブル数のみ有効?

  count = 0
  sth.fetch { |row|
    p row
    count = count + 1
  }
  sth.finish
  puts 'increment count='+count.to_s
#DB例外発生時の処理
rescue DBI::DatabaseError => e
  p "An error occurred"
  p "Error code: #{e.err}"
  p "Error message: #{e.errstr}"
  #切断漏れしないようにensureでdisconnectします。
ensure
  dbh.disconnect if dbh
end

バージョンは、以下です。
C:\>ruby -v
ruby 1.8.7 (2010-01-10 patchlevel 249) [i386-mswin32]

MySQL;;5.1

C:\>gem list --local

*** LOCAL GEMS ***

actionmailer (2.3.4)
actionpack (2.3.4)
activerecord (2.3.4)
activeresource (2.3.4)
activesupport (2.3.4)
deprecated (2.0.1)
linecache (0.43)
mysql (2.8.1)
rack (1.0.0)
rails (2.3.4)
rake (0.8.7)
ruby-debug-base (0.10.3)
ruby-debug-ide (0.4.5)
sinatra (0.9.4)
sqlite3-ruby (1.2.5)

別の手法(とみたさんのmysqlを使用した場合)のサンプルコード

#!D:/Ruby/bin/ruby.exe
#
#MySQLへのアクセスサンプルプログラム
# 2009/05/19 CODED BY E.MAEKAWA
#
#
################################################


require "mysql" #MySQLライブラリ
require "rubygems"

mydb = Mysql.new('サーバ名','ユーザ名','パスワード','DB名')
puts 'mydbの結果は'+ mydb.to_s
#接続確認
res = mydb.query('SELECT * from aplist')
puts 'mydb.queryの結果は'+ res.to_s
#結果確認
puts '【データダンプ】'
res.each do |row|
  #puts row[0].to_s
  puts row.to_s
  puts row.length
end
#テーブル名 取得
res = mydb.list_tables() #テーブル名を返す

puts res.length #テーブル名の数(返されたデータ数)
puts res #list_tablesの結果(テーブル名 arcd 等)
puts '【each doの出力】'
res.each do |name| #テーブル名の格納 res→nemeへ
  puts name
end
puts '【flattenの出力】'
resData = res.flatten #res を一次元の配列にする。
puts resData

puts 'テーブルの数'
puts resData.length # 一次元配列になったデータの数
puts 'テーブル名一覧'
puts res.to_s
#=begin
res.each do |row|
  #puts row[0].to_s
  puts row.to_s
  puts row.length
end

了

冗長ではありますが、ご指導のほど、よろしくお願いします。


In This Thread

Prev Next