Publish date: 2003-01-05

Updatable recorset. Writing of changes in separate transaction (VB, C++)

Sub sample7_2()
 Dim cn As New ADODB.Connection
 cn.Provider = "LCPI.IBProvider.2"
 Call cn.Open("data source=main:e:\database\employee.gdb", "gamer", "vermut")

 'begin READ trans
 cn.BeginTrans

 Dim job_rs As New ADODB.Recordset
 job_rs.ActiveConnection = cn

 'append only
 job_rs.Properties("Append-Only Rowset") = True
 job_rs.Properties("modify_trans_type") = 2

 Call job_rs.Open("job", , adOpenKeyset, adLockOptimistic, adCmdTable)

 'insert new row ------------------------
 job_rs.AddNew
 job_rs!job_code = "user"      ' PK
 job_rs!job_grade = "3"        ' PK
 job_rs!job_country = "Canada" ' PK [FK to COUNTRY]
 job_rs!job_title = "Tester of IBProvider"
 job_rs!min_salary = 1
 job_rs!max_salary = 150
 job_rs!job_requirement = "ADO, OLEDB, Builder C++, Visual C++, VB"

 'make array with requirement to languages
 Dim language_req(1 To 4) As String
 language_req(1) = "Russian"
 job_rs!language_req = language_req

 job_rs.Update 'begintrans+commit

 'update --------------------------------
 job_rs!job_requirement = (job_rs!job_requirement) & ", InterBase SQL Server"
 language_req(2) = "English"
 job_rs!language_req = language_req

 job_rs.Update 'begintrans+commit

 'delete record -------------------------
 job_rs.Delete 'begintrans+commit

 'commit READ trans
 cn.CommitTrans
End Sub 'sample7_2

////////////////////////////////////////////////////////////////////////////////
#define _TRACE(obj,func)            \
{                                   \
 cout<<#obj<<"."<<#func<<endl;      \
                                    \
 _THROW_OLEDB_FAILED(obj,func)      \
}

////////////////////////////////////////////////////////////////////////////////
//class TSampleCode7_2

void TSampleCode7_2::execute()
{
 cout<<"Sample #7.2"<<endl;

 try
 {
  t_db_data_source data_source;
  t_db_session     session;
  t_db_open_rowset job_rs;

  _TRACE(data_source,attach("file name=employee.ibp"))
  _TRACE(session,create(data_source))

  _TRACE(session,start_transaction())

  _TRACE(job_rs,create(session))

  _TRACE(job_rs.m_props,set(t_db_prop_id::rowset_append_only,true))
  _TRACE(job_rs.m_props,set("modify_trans_type",2))
  _TRACE(job_rs,open_table("job"))

  //INSERT NEW ROW -----------------------------------------
  t_db_row row;
  _TRACE(job_rs,describe(row))

  row["job_code"       ]="user";    //PK
  row["job_grade"      ]="3";       //PK
  row["job_country"    ]="Canada";  //PK [FK to COUNTRY]
  row["job_title"      ]="Tester of IBProvider";
  row["min_salary"     ]=1;
  row["max_salary"     ]=150;
  row["job_requirement"]="ADO, OLEDB, Builder C++, Visual C++, VB";

  row["language_req"   ].create_array(DBTYPE_BSTR,0,1,4);
  row["language_req"   ].set_element(1,"Russian");

  _TRACE(job_rs,insert_row(row,true))

  //UPDATE NEW ROW -----------------------------------------

  //define compact row
  t_db_row row1;
  row1.columns(0)=row.columns("job_requirement");
  row1.columns(1)=row.columns("language_req");
  row1.count=2;

  row1["job_requirement"]=row["job_requirement"].as_string+", InterBase SQL Server";
  row1["language_req"   ]=row["language_req"];
  row1["language_req"   ].set_element(2,"English");

  _TRACE(job_rs,update_row(row1));

  //DELETE NEW ROW -----------------------------------------
  _TRACE(job_rs,delete_row());
  _TRACE(session,commit())

 }
 catch(const exception& exc)
 {
  cout<<"error:"<<exc.what()<<endl;
 }

 cout<<endl;
}//execute