Publish date: 2003-01-05

Work with resulting set (VB, C++)

Function RowToStr(rs As ADODB.Recordset) As String
 Dim i As Long
 Dim str As String

 For i = 0 To rs.Fields.Count - 1
  str = str & MyCStr(rs(i)) & Chr(9)
 Next i
 RowToStr = str
End Function

Sub sample2()
 Dim cn As New ADODB.Connection
 cn.Open "file name=d:\database\employee.ibp"

 Dim i As Integer
 Dim str As String

 Dim cmd As New ADODB.Command
 Dim rs As ADODB.Recordset

 cmd.ActiveConnection = cn
 cmd.CommandText = "select * from employee order by emp_no"

 'Creation of recordset with the unidirectional access
 Set rs = cmd.Execute

 While Not rs.EOF
  Debug.Print RowToStr(rs)
  rs.MoveNext
 Wend

 Debug.Print "+++++++++++++++++++++++++++"
 rs.Close
 'Creation of recordset with the bidirectional access
 cmd.Properties("Fetch Backwards") = True
 cmd.Properties("Scroll Backwards") = True
 Set rs = cmd.Execute

 While (Not rs.EOF)
  Debug.Print RowToStr(rs)
  rs.MoveNext
 Wend

 Debug.Print "+++++++++++++++++++++++++++"

  rs.MovePrevious
 While (Not rs.BOF)
  Debug.Print RowToStr(rs)
  rs.MovePrevious
 Wend

 rs.Close

 Debug.Print "+++++++++++++++++++++++++++"
 'Creation of recordset with a direct access
 cmd.Properties("IRowsetLocate") = True
 Set rs = cmd.Execute

 'Printing of lines with the random order
 Dim cnt As Long
 ReDim flags(rs.RecordCount) As Boolean

 While (cnt <> rs.RecordCount)
  i = Int(Rnd(1) * rs.RecordCount)
  If (Not flags(i)) Then
   flags(i) = True
   cnt = cnt + 1

   rs.MoveFirst
   rs.Move i

   Debug.Print RowToStr(rs)
  End If
 Wend

End Sub

void TSampleCode2::execute()
{
 cout<<"Sample Code #2"<<endl;

 try
 {
  t_db_data_source source;
  t_db_session     session;

  //attach data source (auto commit mode)
  _THROW_OLEDB_FAILED(source,attach("file name=employee.ibp"))

  //create session
  _THROW_OLEDB_FAILED(session,create(source))

  //create rowset
  t_db_row         row;
  t_db_open_rowset rowset;

  _THROW_OLEDB_FAILED(rowset,create(session))

  cout<<"unidirectional access"<<endl; //---------------------------------

  _THROW_OLEDB_FAILED(rowset.m_props,set(t_db_prop_id::rowset_locate,false))
  _THROW_OLEDB_FAILED(rowset.m_props,set(t_db_prop_id::rowset_canfetchbackwards,false))
  _THROW_OLEDB_FAILED(rowset.m_props,set(t_db_prop_id::rowset_canscrollbackwards,false))

  //use read-only engine
  _THROW_OLEDB_FAILED(rowset.m_props,set(t_db_prop_id::rowset_change,false))

  //open table
  _THROW_OLEDB_FAILED(rowset,open_table("employee"))
  _THROW_OLEDB_FAILED(rowset,describe(row))
  _THROW_OLEDB_FAILED(rowset,bind(row))

  //retrive row
  while(rowset.fetch(row)==S_OK)
  {
   cout<<row_to_str(row)<<endl;
  }//while fetch

  //check last result of fetch
  _THROW_OLEDB_FAILED(rowset,m_last_result)

  cout<<endl<<"random access"<<endl; //----------------------

  //set "IRowsetScroll" property to true
  //provider must caching result set
  _THROW_OLEDB_FAILED(rowset.m_props,set(t_db_prop_id::rowset_scroll,true))

  //open table
  _THROW_OLEDB_FAILED(rowset,open_table("employee"))
  _THROW_OLEDB_FAILED(rowset,describe(row))
  _THROW_OLEDB_FAILED(rowset,bind(row))

  //get record count
  t_db_open_rowset::count_item_type ax_row_count;

  _THROW_OLEDB_FAILED(rowset,approximate_count(ax_row_count))

  cout<<"record count:"<<ax_row_count<<endl;

  //build random sequential move
  typedef structure::t_vector<t_db_open_rowset::count_item_type> row_num_vector;

  row_num_vector row_nums;

  row_nums.reserve(ax_row_count);

  for(t_db_open_rowset::count_item_type i=0;i<=ax_row_count;++i)
   row_nums.push_back(i);

  random_shuffle(row_nums.begin(),row_nums.end());

  rowset.cache_size=1;

  for(row_num_vector::const_iterator i_row(row_nums.begin()),_end(row_nums.end());
      i_row!=_end;++i_row)
  {
   _THROW_OLEDB_FAILED(rowset,restart())

   _THROW_OLEDB_FAILED(rowset,scroll(*i_row))

   _THROW_OLEDB_FAILED(rowset,fetch(row))

   cout<<row_to_str(row)<<endl;
  }//for i_row
 }
 catch(exception& exc)
 {
  cout<<"error: "<<exc.what()<<endl;
 }
}//execute