I also get this error when trying to sort other array of arrays that represent combined SQL result sets: comparison of Array with Array failed (ArgumentError) When I create test arrays that are similar I don't run into this error. My result sets combine results from calculations and other fields that can't be combined into T-SQL statements. That's why I can't just create a magic result set using straight SQL. I need to manipulate the result set using Ruby. But there seems to be some problems I am running into. I will try to work with smaller result sets to see if I can further isolate why the sort! method is failing... But when I create gregarican wrote: > When I try resultSet.class in irb I get back an Array. And the > resultSet object is indeed an array of arrays. It starts out like > [[100,"Joe Schmoe", "1313 Anywhere St.", "Anywhere", "OH", > "43000-0000", "614-555-1212"], ... and so on. The only way I can use > the assoc method on this record set is by copying it into a new array, > iterating over the contents row by row. > > Another oddity I found. I have another record set that I want to sort > by the seventh element. This record set is similarly an array of > arrays. It is similar in structure to the resultSet object, except > there is an extra element tacked on at the end. Purchase amounts, which > is the element I want to sort by. This result set starts out like > [[100,"Joe Schmoe", "1313 Anywhere St.", "Anywhere", "OH", > "43000-0000", "614-555-1212", 1200.50], ... and so on. When I tried a > test in irb by creating an array of arrays with just a few rows I > passed in the following sort! method: > > purchaseHistory.sort! { |a,b| b[7] <=> a[7] } > > This worked, in that my array of arrays was then sorted in descending > order of purchase amounts, the element residing in slot 7 in each > array. But when I tried this same operation on my production result set > I got back an error stating 'undefined method `>' for false:FalseClass > (NoMethodError).' There must be a row in the result set that's throwing > the comparison off. Have to dig deeper into it. I am thinking of a way > to capture just where the sort! block is bombing out... > > Robert Klemme wrote: > > On 14.11.2006 21:27, gregarican wrote: > > > Here it is: > > > > > > --------------------------------------------------- > > > require 'dbi' > > > > > > dsn=DBI.connect('DBI:ADO:Provider=SQLOLEDB;Connect Timeout=5;Data > > > Source=my_server;Initial Catalog=my_db;Persist Security > > > Info=True;Trusted_Connection=Yes;') > > > queryString = "SELECT C.CustNo, C.FullName, C.Street, C.City, C.State, > > > C.zip, C.Phone " > > > queryString << "from TblCustInfo C, TblCustMailOuts M " > > > queryString << "where C.CustNo = M.CustNo " > > > sqlStmt=dsn.prepare(queryString) > > > sqlStmt.execute > > > resultSet=sqlStmt.fetch_all > > > match=resultSet.assoc(integerValue) > > > --------------------------------------------------- > > > > > > My resultSet is an array and I can inspect its contents. The first > > > element of each row of the array is an integer. When I try to do the > > > resultSet.assoc() method to pull one of these out I always get nil. No > > > matter what I do. > > > > > > Here's what I did that worked, however: > > > > > > --------------------------------------------------- > > > require 'dbi' > > > > > > dsn=DBI.connect('DBI:ADO:Provider=SQLOLEDB;Connect Timeout=5;Data > > > Source=my_server;Initial Catalog=my_db;Persist Security > > > Info=True;Trusted_Connection=Yes;') > > > queryString = "SELECT C.CustNo, C.FullName, C.Street, C.City, C.State, > > > C.zip, C.Phone " > > > queryString << "from TblCustInfo C, TblCustMailOuts M " > > > queryString << "where C.CustNo = M.CustNo " > > > sqlStmt=dsn.prepare(queryString) > > > sqlStmt.execute > > > resultSet=sqlStmt.fetch_all > > > resultCustSet=[] > > > resultSet.each { | row | resultCustSet << [row[0], row[1], row[2], > > > row[3], row[4], row[5], row[6]] } > > > match=resultCustSet.assoc(integerValue) > > > --------------------------------------------------- > > > > > > The only difference that I see is that I build a new array out of the > > > elements of the SQL recordset array. The contents are identical... > > > > Actually I believe this to be wrong: please read the docs of #assoc again: > > http://www.ruby-doc.org/core/classes/Array.html#M002259 > > > > You need an Array of Arrays. But resultSet is the return value of > > #fetch_all which might look line an Array of Arrays but actually > > is likely something different. (An easy test would be to print out the > > class of resultSet and of the first member of resultSet.) > > > > Two additional remarks: If you want to do these kinds of lookups and you > > are copying the result set anyway then the proper data structure would > > be a Hash which is far more efficient for these kinds of lookups. But: > > > > If you just need an individual record it is much more efficient to let > > the DB select exactly that value. > > > > Kind regards > > > > robert