Cannot fetch from database using if...else

A

Arun Kumar

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 Kumar
 
L

Luc Traonmilin

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 Kumar a écrit :
 
C

Christopher Dicely

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 =3D DBI.connect("DBI:Mysql:Sample:localhost", "arunkumar", "123456")
stats =3D con.prepare("Select * from hello where first_name =3D ?")
stats.execute('arun')
if stats.fetch =3D=3D nil
=C2=A0 =C2=A0puts "No Records"
=C2=A0 =C2=A0con.rollback
else
=C2=A0 =C2=A0puts stats.fetch
end
rescue DBI::DatabaseError =3D> e
=C2=A0 =C2=A0puts "Error: #{e.errstr}"
ensure
=C2=A0 =C2=A0con.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 =3D stats.fetch) =3D=3D 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 =3D stats.fetch)
puts "No Records"
con.rollback
else
puts result
end
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,756
Messages
2,569,533
Members
45,007
Latest member
OrderFitnessKetoCapsules

Latest Threads

Top