Cannot fetch from database using if...else


#1

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.


#2

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 :


#3

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