Forum: Ruby Cannot fetch from database using if...else

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
Arun K. (Guest)
on 2009-03-14 15:31
Hi,
I'm new to ruby and right now i'm trying out some examples involving
database access using the dbi module. This is my code...

#!/usr/local/bin/ruby -w

require 'dbi'

begin
con = DBI.connect("DBI:Mysql:Sample:localhost", "arunkumar", "123456")
stats = con.prepare("Select * from hello where first_name = ?")
stats.execute('arun')
if stats.fetch == nil
    puts "No Records"
    con.rollback
else
    puts stats.fetch
end
rescue DBI::DatabaseError => e
    puts "Error: #{e.errstr}"
ensure
    con.disconnect if con
end

If I use 'puts stats.fetch' before if the fetched data is displayed
properly. But if i use 'puts stats.fetch' inside if or else 'nil' will
be displayed even if there are matching records in the database. I dont
know why. Can anybody help me?????

Regards
Arun K.
Luc T. (Guest)
on 2009-03-14 15:49
(Received via mailing list)
From the API doc:
fetch():
Fetch the next row in the result set. DBD Required.

So someone will correct me if I'm wrong but I think you cannot evaluate
fetch in a condition and call it in the condition itself because it will
refer to the next row in the result set, probably nil in your case
because there is only one row.

Luc

Arun K. a écrit :
Christopher D. (Guest)
on 2009-03-14 19:26
(Received via mailing list)
On Sat, Mar 14, 2009 at 6:29 AM, Arun K.
<removed_email_address@domain.invalid> wrote:
> stats = con.prepare("Select * from hello where first_name = ?")
>    con.disconnect if con
> end
>
> If I use 'puts stats.fetch' before if the fetched data is displayed
> properly. But if i use 'puts stats.fetch' inside if or else 'nil' will
> be displayed even if there are matching records in the database. I dont
> know why. Can anybody help me?????


Since stats.fetch is a method call, and you want to output the same
result you are testing, not call the method again and output whatever
it would return the second time if it is not nil the first time, you
probably want to replace the if...else...end structure with something
like this:

if (result = stats.fetch) == nil
  puts "No Records"
  con.rollback
else
  puts result
end

Since "nil" is the only result that is false in a boolean context that
fetch will return, you don't really need a comparison to nil:

if (result = stats.fetch)
  puts "No Records"
  con.rollback
else
  puts result
end
This topic is locked and can not be replied to.