|
CBuilder+ODBC+БД FoxPro
|
|||
---|---|---|---|
#18+
Здравствуйте. Имеется БД на FoxPro 9. Я пытаюсь с ней работать на CBuilder через ODBC. запросы select работают нормально. а вот Insert и Update выдают ошибку [Microsoft][ODBC Visual FoxPro Driver] Trigger Failed. а на Delete [Microsoft][ODBC Visual FoxPro Driver] Unsupported function in rule or trigger. Поставил себе FoxPro9 и посмотрел. в БД на Insert, Update и Delete имеются триггеры и Rule, при чем программа написаная на FoxPro работает со своей базой, а я не могу. Подскажите что-нибудь. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.10.2008, 00:06 |
|
CBuilder+ODBC+БД FoxPro
|
|||
---|---|---|---|
#18+
Приведите код, которым коннектитесь к провайдеру ODBC и базе. Скоре всего, просто указаны не те режимы открытия курсора. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.10.2008, 01:56 |
|
CBuilder+ODBC+БД FoxPro
|
|||
---|---|---|---|
#18+
И еще не плохо было бы привести код самих тригеров и правил. Скорее всего прямой insert в таблицу из фокса тоже не отработает Posted via ActualForum NNTP Server 1.4 ... |
|||
:
Нравится:
Не нравится:
|
|||
13.10.2008, 04:55 |
|
CBuilder+ODBC+БД FoxPro
|
|||
---|---|---|---|
#18+
Сразу извиняюсь, не нашел как правильно оформинь приводимый код. 1.Строка подключения в ADO-компоненте Provider=MSDASQL.1;Persist Security Info=False;Mode=ReadWrite;Extended Properties="Driver={Driver para o Microsoft Visual FoxPro};UID=;SourceDB=d:\sudos\dbf\data1.dbc;SourceType=DBC;Exclusive=No;BackgroundFetch=Yes;Collate=Machine;Null=Yes;Deleted=Yes;" Я может что-то не то делаю, а может и то (первый раз). Открыл БД по таблице щелкаю мышкой и нажимаю Modify. Переключаюсь на вкладку Table и там смотрю //----------------------------------------------------------- 2. Rule: update_rec() * Обновление записей Function update_rec() If !f_archive Replace f_archive With .T. Endif Return .T. //----------------------------------------------------------- 3. Triggers //----------------------------------------------------------- Insert triggers: ins_trg() * Добавление записей Function ins_trg() *!* IF UPPER(ALLTRIM(JUSTSTEM(DBF()))) == "PROHOD" *!* REPLACE lock WITH REPLICATE(CHR(0), FSIZE(lock)) *!* ENDIF If Type("m.public_bd_work_udp")=="L" If m.public_bd_work_udp If Type("gnFireBird")=="N" And Type("gnFireBirdDay")=="N" Local m.tbl_ m.tbl_ = Juststem(Dbf()) Local m.fl_sql m.fl_sql=0 If Type("m.dbf_public_global_u_id_edit")=="U" Public m.dbf_public_global_u_id_edit m.dbf_public_global_u_id_edit = "" Endif m.dbf_public_global_u_id_edit = u_id *!* ACTIVATE SCREEN *!* ? " I " *!* ?? Juststem(Dbf()) *!* ?? " " *!* *!* ?? tmp_array_obj[m.i] *!* *!* ?? " " *!* *!* ?? &tmp_array_obj[m.i] *!* ?? " uid - " *!* ?? u_id *!* ?? " --- " *!* ?? m.dbf_public_global_u_id_edit If gnFireBird > 0 And gnFireBirdDay> 0 m.fl_sql=SQLExec(gnFireBird,[INSERT INTO "]+Juststem(Dbf())+[" (U_ID,NUM_REC) VALUES (?u_id,?num_rec) ]) If m.fl_sql>0 m.fl_sql=SQLExec(gnFireBirdDay,[INSERT INTO "_DAY_" ("ACTION","U_ID","NUM_REC","TABLE","IP","PRIL","UP_ID") VALUES ('I',?u_id,?num_rec,?m.tbl_,?m.public_global_my_ip,?m.public_global_pril_type,?id)]) If m.fl_sql>0 Else =SQLDisconnect(gnFireBird) =SQLDisconnect(gnFireBirdDay) gnFireBird=0 gnFireBirdDay=0 =FB_day_tmp('I',u_id,num_rec,m.tbl_,m.public_global_my_ip,m.public_global_pril_type,"",Id) Endif Else =SQLDisconnect(gnFireBird) =SQLDisconnect(gnFireBirdDay) gnFireBird=0 gnFireBirdDay=0 =FB_day_tmp('I',u_id,num_rec,m.tbl_,m.public_global_my_ip,m.public_global_pril_type,"",Id) Endif Else =FB_day_tmp('I',u_id,num_rec,m.tbl_,m.public_global_my_ip,m.public_global_pril_type,"",Id) Endif Endif Endif Endif If Type("m.global_public_flag_not_day")=="L" If m.global_public_flag_not_day Return Endif Endif =AddToLogDBF("добавлена") =AddTrans(Juststem(Dbf()), Recno(), "I", Dbf()) Local m.tmp_obj Scatter Memo Name m.tmp_obj Amembers(tmp_array_obj, m.tmp_obj ) Local m.i For m.i = 1 To Alen(tmp_array_obj) If Type("&tmp_array_obj[m.i]") == "N" =AddTrans_u(Juststem(Dbf()), Recno(), "U", Dbf(), tmp_array_obj[m.i],&tmp_array_obj[m.i],"",.F.,"",Date(),Datetime(),u_id,id,"N") Endif If Type("&tmp_array_obj[m.i]") == "C" =AddTrans_u(Juststem(Dbf()), Recno(), "U", Dbf(), tmp_array_obj[m.i],0,&tmp_array_obj[m.i],.F.,"",Date(),Datetime(),u_id,id,"C") Endif If Type("&tmp_array_obj[m.i]") == "L" =AddTrans_u(Juststem(Dbf()), Recno(), "U", Dbf(), tmp_array_obj[m.i],0,"",&tmp_array_obj[m.i],"",Date(),Datetime(),u_id,id,"L") Endif If Type("&tmp_array_obj[m.i]") == "M" =AddTrans_u(Juststem(Dbf()), Recno(), "U", Dbf(), tmp_array_obj[m.i],0,"",.F.,&tmp_array_obj[m.i],Date(),Datetime(),u_id,id,"M") Endif If Type("&tmp_array_obj[m.i]") == "D" =AddTrans_u(Juststem(Dbf()), Recno(), "U", Dbf(), tmp_array_obj[m.i],0,"",.F.,"",&tmp_array_obj[m.i],Datetime(),u_id,id,"D") Endif If Type("&tmp_array_obj[m.i]") == "T" =AddTrans_u(Juststem(Dbf()), Recno(), "U", Dbf(), tmp_array_obj[m.i],0,"",.F.,"",Date(),&tmp_array_obj[m.i],u_id,id,"T") Endif Endfor Return .T. //----------------------------------------------------------- Update trigger: upd_trg() * Обновление записей Function upd_trg() If Type("m.public_bd_work_udp")=="L" If m.public_bd_work_udp Local m.tmp_obj Scatter Memo Name m.tmp_obj Amembers(tmp_array_obj, m.tmp_obj ) Local m.i For m.i = 1 To Alen(tmp_array_obj) If Type("m.public_global_bd_list_not_send")=="C" If ";"+Alltrim(Juststem(Dbf()))+"."+Alltrim(tmp_array_obj[m.i])+";"$";"+m.public_global_bd_list_not_send+";" Loop Endif Endif If !&tmp_array_obj[m.i]==Oldval(tmp_array_obj[m.i]) *!* ACTIVATE SCREEN *!* ? Type("gnFireBird") *!* ?? Type("gnFireBirdDay") *!* ? gnFireBird *!* ?? gnFireBirdDay *!* ACTIVATE SCREEN *!* ? " U " *!* ?? Juststem(Dbf()) *!* ?? " " *!* ?? tmp_array_obj[m.i] *!* ?? " " *!* ?? &tmp_array_obj[m.i] *!* ?? " " *!* ?? u_id If Type("gnFireBird")=="N" And Type("gnFireBirdDay")=="N" Local m.tbl_ m.tbl_ = Juststem(Dbf()) Local m.fl_sql m.fl_sql=0 If gnFireBird > 0 And gnFireBirdDay> 0 Local m.u_id , m.tmp_var m.u_id = u_id If Empty(m.u_id) If Type("m.dbf_public_global_u_id_edit")=="U" Public m.dbf_public_global_u_id_edit m.dbf_public_global_u_id_edit = "" Else m.u_id = m.dbf_public_global_u_id_edit Endif Endif m.tmp_var = &tmp_array_obj[m.i] If Type("&tmp_array_obj[m.i]") == "L" If m.tmp_var m.fl_sql=SQLExec(gnFireBird,[update "]+Juststem(Dbf())+[" set "]+tmp_array_obj[m.i]+[" = 1 where (U_ID = ?m.u_id) ]) Else m.fl_sql=SQLExec(gnFireBird,[update "]+Juststem(Dbf())+[" set "]+tmp_array_obj[m.i]+[" = 0 where (U_ID = ?m.u_id) ]) Endif Else m.fl_sql=SQLExec(gnFireBird,[update "]+Juststem(Dbf())+[" set "]+tmp_array_obj[m.i]+[" = ?m.tmp_var where (U_ID = ?m.u_id) ]) Endif If m.fl_sql>0 m.fl_sql=SQLExec(gnFireBirdDay,[INSERT INTO "_DAY_" ("ACTION","U_ID","NUM_REC","TABLE","IP","PRIL","POLE","UP_ID") VALUES ('U',?m.u_id,?num_rec,?m.tbl_,?m.public_global_my_ip,?m.public_global_pril_type,']+tmp_array_obj[m.i]+[',?id)]) If m.fl_sql>0 Else =SQLDisconnect(gnFireBird) =SQLDisconnect(gnFireBirdDay) gnFireBird=0 gnFireBirdDay=0 =FB_day_tmp('U',m.u_id,num_rec,m.tbl_,m.public_global_my_ip,m.public_global_pril_type,tmp_array_obj[m.i],Id) Endif Else =SQLDisconnect(gnFireBird) =SQLDisconnect(gnFireBirdDay) gnFireBird=0 gnFireBirdDay=0 =FB_day_tmp('U',m.u_id,num_rec,m.tbl_,m.public_global_my_ip,m.public_global_pril_type,tmp_array_obj[m.i],Id) Endif Else =FB_day_tmp('U',u_id,num_rec,m.tbl_,m.public_global_my_ip,m.public_global_pril_type,tmp_array_obj[m.i],Id) Endif Endif Endif Endfor Endif Endif If Type("m.global_public_flag_not_day")=="L" If m.global_public_flag_not_day Return Endif Endif =AddToLogDBF("изменена") *=AddTrans(JUSTSTEM(DBF()), RECNO(), "U", DBF()) Local m.tmp_obj Scatter Memo Name m.tmp_obj Amembers(tmp_array_obj, m.tmp_obj ) Local m.i For m.i = 1 To Alen(tmp_array_obj) *!* ? Oldval(tmp_array_obj[m.i]) *!* ? &tmp_array_obj[m.i] If !&tmp_array_obj[m.i]==Oldval(tmp_array_obj[m.i]) *!* Activate Screen *!* ? "Новое значение " *!* ?? &tmp_array_obj[m.i] *!* ?? " в " *!* ?? tmp_array_obj[m.i] *!* ?? " " *!* ?? Recno() *!* ?? num_rec If Type("&tmp_array_obj[m.i]") == "N" =AddTrans_u(Juststem(Dbf()), Recno(), "U", Dbf(), tmp_array_obj[m.i],&tmp_array_obj[m.i],"",.F.,"",Date(),Datetime(),u_id,id,"N") Endif If Type("&tmp_array_obj[m.i]") == "C" =AddTrans_u(Juststem(Dbf()), Recno(), "U", Dbf(), tmp_array_obj[m.i],0,&tmp_array_obj[m.i],.F.,"",Date(),Datetime(),u_id,id,"C") Endif If Type("&tmp_array_obj[m.i]") == "L" =AddTrans_u(Juststem(Dbf()), Recno(), "U", Dbf(), tmp_array_obj[m.i],0,"",&tmp_array_obj[m.i],"",Date(),Datetime(),u_id,id,"L") Endif If Type("&tmp_array_obj[m.i]") == "M" =AddTrans_u(Juststem(Dbf()), Recno(), "U", Dbf(), tmp_array_obj[m.i],0,"",.F.,&tmp_array_obj[m.i],Date(),Datetime(),u_id,id,"M") Endif If Type("&tmp_array_obj[m.i]") == "D" =AddTrans_u(Juststem(Dbf()), Recno(), "U", Dbf(), tmp_array_obj[m.i],0,"",.F.,"",&tmp_array_obj[m.i],Datetime(),u_id,id,"D") Endif If Type("&tmp_array_obj[m.i]") == "T" =AddTrans_u(Juststem(Dbf()), Recno(), "U", Dbf(), tmp_array_obj[m.i],0,"",.F.,"",Date(),&tmp_array_obj[m.i],u_id,id,"T") Endif Endif Endfor Return .T. //----------------------------------------------------------- Delete trigger: del_trg() * Удаление записей Function Del_trg() If Type("m.public_bd_work_udp")=="L" If m.public_bd_work_udp If Type("gnFireBird")=="N" And Type("gnFireBirdDay")=="N" Local m.tbl_ m.tbl_ = Juststem(Dbf()) Local m.fl_sql m.fl_sql=0 If gnFireBird > 0 And gnFireBirdDay> 0 Local m.u_id , m.tmp_var m.u_id = u_id m.tmp_var = &tmp_array_obj[m.i] m.fl_sql=SQLExec(gnFireBird,[update "]+Juststem(Dbf())+[" set "IS_DELETED" = 1 where (U_ID = ?m.u_id) ]) If m.fl_sql>0 m.fl_sql=SQLExec(gnFireBirdDay,[INSERT INTO "_DAY_" ("ACTION","U_ID","NUM_REC","TABLE","IP","PRIL","UP_ID") VALUES ('D',?u_id,?num_rec,?m.tbl_,?m.public_global_my_ip,?m.public_global_pril_type,?id)]) If m.fl_sql>0 Else =SQLDisconnect(gnFireBird) =SQLDisconnect(gnFireBirdDay) gnFireBird=0 gnFireBirdDay=0 =FB_day_tmp('D',u_id,num_rec,m.tbl_,m.public_global_my_ip,m.public_global_pril_type,"",Id) Endif Else =SQLDisconnect(gnFireBird) =SQLDisconnect(gnFireBirdDay) gnFireBird=0 gnFireBirdDay=0 =FB_day_tmp('D',u_id,num_rec,m.tbl_,m.public_global_my_ip,m.public_global_pril_type,"",Id) Endif Else =FB_day_tmp('D',u_id,num_rec,m.tbl_,m.public_global_my_ip,m.public_global_pril_type,"",Id) Endif Endif Endif Endif If Type("m.global_public_flag_not_day")=="L" If m.global_public_flag_not_day Return Endif Endif =AddToLogDBF("удалена") =AddTrans(Juststem(Dbf()), Recno(), "D", Dbf(),u_id,id) Return .T. //----------------------------------------------------------- ... |
|||
:
Нравится:
Не нравится:
|
|||
13.10.2008, 09:06 |
|
CBuilder+ODBC+БД FoxPro
|
|||
---|---|---|---|
#18+
Ну, с Delete() ясно - даже при отсутствующей переменной public_bd_work_udp, что пропустит почти весь триггер, нет функции AddToLogDBF() С Insert() и Update() что-то неясно - по идее, должны бы рубиться тоже на AddToLogDBF(), впрочем, там еще присутствует макроподстановка &tmp_array_obj[m.i] ... Вобщем, триггеры написаны исключительно замечательно :-) Спец писАл... ... |
|||
:
Нравится:
Не нравится:
|
|||
13.10.2008, 09:34 |
|
CBuilder+ODBC+БД FoxPro
|
|||
---|---|---|---|
#18+
исключительно это ИсКлЮчИтЕлЬнО?! А мне что делать?! Можно объяснить что не так и есть ли выход из данной ситуации?! //--------------------------------------------------------------------------- Функция (просили?!) Function AddToLogDBF Lparameters m.Action Local m.i, m.fl If (Type("m.register_database_log") == "C") And (m.register_database_log == "Y") *!* m.fl=.F. *!* ADIR(dir_arr,ForcePath("*.", JustPath(DBF())), "D") *!* FOR m.i=1 to alen(dir_arr,1) *!* IF alltrim(upper(dir_arr[m.i,1]))=="LOGS" *!* m.fl=.T. *!* EXIT *!* ENDIF *!* ENDFOR *!* IF !m.fl *!* MKDIR ForcePath("logs", JustPath(DBF())) *!* ENDIF Set Textmerge On To Forcepath("DataBase.log", Justpath(Dbf()) + "\LOGS") Additive Noshow \<<DATETIME()>> <<JUSTSTEM(DBF())>> <<RECNO()>> <<DBF()>> <<m.action>> <<ret_prg()>> Set Textmerge To Endif ... |
|||
:
Нравится:
Не нравится:
|
|||
13.10.2008, 10:03 |
|
CBuilder+ODBC+БД FoxPro
|
|||
---|---|---|---|
#18+
"Что делать?" - извечный русский вопрос :-) Вы собираетесь менять данные в таблицах? А как будете обеспечивать целостность? Вы изучили все связи, триггеры, правила? Будете работать неэксклюзивно (т.е. одновременно с самой программой на Фоксе)? Или вы надеетесь на то, что Фокс - это SQLServer ? :-) Или у вас прога на Фоксе работает как сервер? Ответ на вопрос: переписать триггеры и правила так, чтобы не было обращений к объектам, определенным в программном коде (вне совокупности included tables + stores procedures + global variables), причем на ХП, вызываемые из триггеров/правил, накладываются те же ограничения. Это как минимум. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.10.2008, 10:25 |
|
CBuilder+ODBC+БД FoxPro
|
|||
---|---|---|---|
#18+
AndreTM спасибо за разъяснения. менять конечно же ничего нельзя самому, да и программеры видимо не станут переписывать. хотя они меня уверяли что триггеры автономные и им ничего не надо. Тема закрыта ... |
|||
:
Нравится:
Не нравится:
|
|||
13.10.2008, 10:35 |
|
|
start [/forum/topic.php?fid=41&msg=35590532&tid=1587186]: |
0ms |
get settings: |
10ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
61ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
55ms |
get tp. blocked users: |
2ms |
others: | 14ms |
total: | 175ms |
0 / 0 |