Дата публикации: 05.01.2003
Обновляемый набор рядов. Запись изменений в отдельной транзакции (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
