Publish date: 2003-01-05
Updatable recorset. Controlled mode (VB, C++)
Sub sample7_3()
Dim cn As New ADODB.Connection
cn.Provider = "LCPI.IBProvider.2"
Call cn.Open("data source=main:e:\database\employee.gdb", "gamer", "vermut")
'begin trans (commit retaining mode)
cn.Attributes = adXactCommitRetaining
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("insert_sql") = _
"insert into job " + _
"(job_code,job_grade,job_country," + _
"job_title,min_salary,max_salary,job_requirement,language_req) " + _
"values(:new.job_code,:new.job_grade,:new.job_country," + _
":new.job_title," + _
":new.min_salary,:new.max_salary," + _
":new.job_requirement,:new.language_req)"
job_rs.Properties("update_sql") = _
"update job set" + Chr(13) + _
"job_code =:new.job_code," + _
"job_grade =:new.job_grade," + _
"job_country =:new.job_country," + _
"job_title =:new.job_title," + _
"min_salary =:new.min_salary," + _
"max_salary =:new.max_salary," + _
"job_requirement =:new.job_requirement," + _
"language_req =:new.language_req" + Chr(13) + _
"where job_code =:old.job_code and " + _
"job_grade=:old.job_grade and " + _
"job_country=:old.job_country"
job_rs.Properties("delete_sql") = _
"delete from job " + _
"where job_code =:old.job_code and " + _
"job_grade =:old.job_grade and " + _
"job_country =:old.job_country"
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
'commit retaining
cn.CommitTrans
'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
'commit retaining
cn.CommitTrans
'delete record -------------------------
job_rs.Delete
'commit retaining
cn.CommitTrans
End Sub 'sample7_3
////////////////////////////////////////////////////////////////////////////////
#define _TRACE(obj,func) \
{ \
cout<<#obj<<"."<<#func<<endl; \
\
_THROW_OLEDB_FAILED(obj,func) \
}
////////////////////////////////////////////////////////////////////////////////
//class TSampleCode7_3
void TSampleCode7_3::execute()
{
cout<<"Sample #7.3"<<endl;
try
{
LPCSTR table_name = "job" ; //PK
LPCSTR col_job_code = "job_code" ; //PK
LPCSTR col_job_grade = "job_grade" ; //PK
LPCSTR col_job_country = "job_country" ;
LPCSTR col_job_title = "job_title" ;
LPCSTR col_min_salary = "min_salary" ;
LPCSTR col_max_salary = "max_salary" ;
LPCSTR col_job_requirement = "job_requirement" ;
LPCSTR col_language_req = "language_req" ;
//query templates
LPCSTR f_insert_sql=
"insert into %1 (%3,%4,%5,%6,%7,%8,%9,%10)\n"
"values(%2.%3,%2.%4,%2.%5,%2.%6,%2.%7,%2.%8,%2.%9,%2.%10)";
LPCSTR f_update_sql=
"update %1\n"
"set %4=%2.%4,%5=%2.%5,%6=%2.%6,%7=%2.%7,%8=%2.%8,%9=%2.%9,%10=%2.%10\n"
"where %4=%3.%4 and %5=%3.%5 and %6=%3.%6";
LPCSTR f_delete_sql=
"delete from %1 where %3=%2.%3 and %4=%2.%4 and %5=%2.%5";
//--------------------------------------------------------
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))
//BUILD SQL statements
str_formatter sql_builder;
//INSERT -------------------------
sql_builder(f_insert_sql)
<<table_name
<<":new"
<<col_job_code
<<col_job_grade
<<col_job_country
<<col_job_title
<<col_min_salary
<<col_max_salary
<<col_job_requirement
<<col_language_req;
cout<<"INSERT SQL:\n"<<sql_builder.str()<<endl;
_TRACE(job_rs.m_props,set("insert_sql",sql_builder.str()));
//DELETE -------------------------
sql_builder(f_delete_sql)
<<table_name
<<":old"
<<col_job_code
<<col_job_grade
<<col_job_country;
cout<<"DELETE SQL:\n"<<sql_builder.str()<<endl;
_TRACE(job_rs.m_props,set("delete_sql",sql_builder.str()));
//UPDATE -------------------------
sql_builder(f_update_sql)
<<table_name
<<":new"
<<":old"
<<col_job_code
<<col_job_grade
<<col_job_country
<<col_job_title
<<col_min_salary
<<col_max_salary
<<col_job_requirement
<<col_language_req;
cout<<"UPDATE SQL:\n"<<sql_builder.str()<<endl;
_TRACE(job_rs.m_props,set("update_sql",sql_builder.str()));
_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))
_TRACE(session,commit_retaining())
//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));
_TRACE(session,commit_retaining())
//DELETE NEW ROW -----------------------------------------
_TRACE(job_rs,delete_row());
_TRACE(session,commit())
}
catch(const exception& exc)
{
cout<<"error:"<<exc.what()<<endl;
}
cout<<endl;
}//execute
