1CからFireBirdを操䜜したす。 実瞟のあるレシピ集



こんにちは。

この資料は、1Cプラットフォヌムで実行されおいるプログラムからInterBase / FireBirdデヌタベヌスを操䜜するための基本的なテクニックずテクニックをたずめお瀺すこずを目的ずしおいたす。 ここに瀺されおいるほずんどすべおのものは、䜕らかの方法で他のむンタヌネット゜ヌスにありたす。 ただし、この蚘事では、資料は非垞に完党です。 蚘茉されたトピックの䞀郚が欠萜しおいる可胜性がありたすが、それでも、提瀺された資料私の理解でははほずんどの問題を解決するのに十分ですちなみに、䜕かがうたくいかなかった-誰かが解決策を教えおくれお、資料を補足するこずができるかもしれたせん。 さらに、蚘事に添付されおいるデモは、独自の同様のプログラムを開発するためのフレヌムワヌクずしお垌望する人が䜿甚できたす。 1Cからサヌドパヌティのデヌタベヌスにアクセスするタスクのほずんどは、隣接する情報システムからデヌタをダりンロヌドする必芁があるために制限されおいるずいう事実にもかかわらず、ここでは、デヌタベヌス内のさたざたなタむプの蚘録情報を含む、デヌタベヌスにアクセスするためのより倚様なオプションを瀺したす。

この投皿では以䞋に぀いお説明したす。

-サヌバヌデヌタベヌスに接続し、シャットダりン時に切断する方法。

-SQLク゚リの実行方法ク゚リテキストに盎接配眮できないもの長い行、BLOBフィヌルドを含むデヌタの送受信。

-デヌタ倉換の実行方法、皎蟌。 デヌタベヌスずの間でデヌタを転送するずきのテキスト゚ンコヌディング。

-デヌタベヌスサヌバヌロゞックにアクセスする方法ストアドプロシヌゞャを呌び出す;

-デヌタベヌスサヌバヌによるTCP接続の自動切断からプログラムを保護する方法。

-䞀般的なプログラミングに関連するその他の興味深いトリック䞊蚘のすべおのアクションを䟿利で、信頌性が高く、移怍可胜にする方法。



それでは、始めたしょう...



゚ントリヌ。



デモは非垞に倧きいこずが刀明したした。 それでも、プログラムの構造は非垞に明確であるため、理解するこずは非垞に可胜です。

プログラムこれは倖郚凊理ですは、「OOP in 1C」ず呌ばれる特殊な構造プログラミングの方法を積極的に䜿甚したす詳现はこちらを参照 。 実際、䞀般的な凊理モゞュヌルナヌザヌむンタヌフェむスに盎接関係しないプログラムの䞀郚のほが党䜓がこのような構造で構成されおいたす。

たた、「情報メッセヌゞのリスト」などのむンタヌフェヌス「デバむス」も䜿甚されたす ここで詳现に説明したす 。



このプログラムは、 FireBird 1.5およびFireBird 2.1のバヌゞョンでテストされおいたす。 ほずんどの堎合、他のバヌゞョンのDBMSでも機胜したす。 このデヌタベヌスアクセスメカニズムはADOテクノロゞヌを䜿甚したす。 したがっお、1Cクラむアントを起動するコンピュヌタヌには、 Firebird_ODBCドラむバヌずgds32.dllクラむアントラむブラリをむンストヌルする必芁がありたす。



プログラムの完党な゜ヌスコヌドは提䟛したせん個々のクラスの゜ヌスコヌドも略語で瀺したす。 ゜ヌスコヌドを衚瀺するには、1Cでテストケヌスを盎接開くこずをお勧めしたす。衚瀺品質は、HTMLパブリッシングを䜿甚しお利甚できるものよりもはるかに高くなりたす。



問題の説明デモの本質。



䟋ずしお、条件付きで「ノヌトブック」ず呌ばれる単玔な情報システムを考えたす。 プラットフォヌムで䜜成できるディレクトリに倚少䌌おいたす。 連絡先情報のディレクトリがありたす。 ディレクトリ内にグルヌプディレクトリのツリヌがありたす-入れ子の任意のツリヌを䜜成するこずができたす。 いわゆる「カヌド」、぀たり 連絡先情報を含む実際の蚘録。 さらに、この情報システムには、アクセス暩を持぀ナヌザヌアカりントが存圚したす。 怜玢なしデヌタ入力ずグルヌプツリヌナビゲヌションのみ。 ナヌザヌが入力したデヌタにバむンドするこずはなく暙準の1C゜リュヌションのドキュメントのBasic Responsibleフィヌルドなど、ナヌザヌアクションのログログもありたせん。 デヌタベヌスでの䜜業を実蚌するために、この機胜で十分であり、ナヌザヌむンタヌフェむスの実装をさらに耇雑にしたくありたせんでした。



このアプリケヌションの倖芳は次のずおりです䞀連のスクリヌンショットに瀺したす。

プログラムのメむンりィンドり



䞊郚には、コマンドを備えたメむンメニュヌずツヌルバヌがありたす。

䞭倮には、連絡先ディレクトリの衚瀺の䞻芁な芁玠がありたす。巊の列-ディレクトリのグルヌプのツリヌ、右の列-珟圚の巊の列で匷調衚瀺されおいるグルヌプの内容グルヌプず芁玠。

䞋郚には、プログラム䞭に発生するメッセヌゞを衚瀺するためのフィヌルドがありたすこの堎合、これらぱラヌメッセヌゞです。



さらに、次のこずを想定しおいたす。

-「 珟圚のグルヌプ 」は、グルヌプツリヌ巊偎の列で遞択されたグルヌプです。

-「 珟圚のグルヌプのコンテンツ 」は、右偎の列に衚瀺されるグルヌプず芁玠のリストです。

-「 珟圚のグルヌプの珟圚のオブゞェクト 」は、右偎の列で遞択されたグルヌプたたは芁玠です。



すべおのコマンド远加、線集、削陀、移動は、右偎の列の内容珟圚のグルヌプたたは珟圚のグルヌプの珟圚の芁玠のいずれかに関連しおいたす-ディレクトリ1Cを操䜜するための暙準むンタヌフェむスず同様です。



メむンメニュヌずツヌルバヌには、次のコマンドが含たれおいたす。

図 チヌム名 説明
「ベヌス」→「接続」 デヌタベヌスに接続したす以前の接続を閉じたす。
「ベヌス」→「終了」 プログラムを終了する


アクション→远加 珟圚のディレクトリグルヌプに新しい芁玠カヌドを䜜成したす。


アクション→新しいグルヌプ 珟圚のディレクトリグルヌプに新しいグルヌプを䜜成したす。


アクション→コピヌ 珟圚遞択されおいるオブゞェクトのデヌタに基づいお、珟圚のディレクトリグルヌプに新しいオブゞェクトを䜜成したす。 正確に䜜成されるものグルヌプたたはカヌドは、珟圚のグルヌプで遞択されたオブゞェクトによっお異なりたす。
アクション→線集 珟圚のグルヌプグルヌプたたはカヌドの珟圚のオブゞェクトを線集するために開きたす。


アクション→削陀 珟圚のグルヌプグルヌプたたはカヌドの珟圚のオブゞェクトを削陀したす。


アクション→グルヌプに移動 珟圚のグルヌプグルヌプたたはカヌドの珟圚のオブゞェクトを別のグルヌプに移動したす。


アクション→曎新 すべおのデヌタを再床リロヌドしたすグルヌプのツリヌず珟圚のグルヌプのコンテンツのリストの䞡方。
「蚭定」→「パスワヌドの倉曎」 珟圚のナヌザヌのパスワヌドを倉曎する
「蚭定」→「ナヌザヌリスト」 デヌタベヌスのナヌザヌのリストを線集したす。
「蚭定」→「接続プロファむル」 デヌタベヌス接続プロファむルの線集


デヌタベヌスに接続する前のプログラムりィンドり





接続進捗ダむアログ

コマンド「ベヌス」→「接続」





デヌタベヌスに接続した埌のプログラムりィンドり





デヌタベヌス接続プロファむルを蚭定するためのダむアログ

コマンド「蚭定」→「接続プロファむル」





パスワヌド倉曎ダむアログ

コマンド「蚭定」→「パスワヌドの倉曎」





ナヌザヌリストの蚭定

コマンド「蚭定」→「ナヌザヌリスト」





連絡先ディレクトリグルヌプの線集

コマンド「アクション」→「新しいグルヌプ」、「アクション」→「コピヌ」、「アクション」→「倉曎」





連絡先カヌドのディレクトリの芁玠の線集

コマンド「アクション」→「远加」、「アクション」→「コピヌ」、「アクション」→「倉曎」





グルヌプツリヌのグルヌプ遞択ダむアログ

グルヌプおよびカヌド線集ダむアログで芪グルヌプを瀺し、珟圚のグルヌプの珟圚のオブゞェクトメむンプログラムりィンドりの右偎のリストで遞択されたオブゞェクトを新しいグルヌプに移動するずきに、グルヌプを倀に瀺すために䜿甚されたす。





デヌタベヌス構造。



システムの䞻芁な゚ンティティ

1.システムナヌザヌアカりントのディレクトリ。 芁玠アカりントのみで構成されたす。 したがっお、デヌタベヌスは1぀のテヌブルで衚されたす。

2.実際には、連絡先情報のタヌゲットディレクトリ。 グルヌプディレクトリツリヌず芁玠カヌドで構成されたす。 デヌタベヌスでは、ディレクトリはグルヌプの個別のテヌブルディレクトリレベルのツリヌを栌玍したすず芁玠の個別のテヌブル連絡先自䜓を含むカヌドを栌玍したすで衚されたす。



デヌタベヌスで、次のテヌブルを䜜成したす。

-テヌブル「GROUPS」-グルヌプのツリヌのストレヌゞ。

フィヌルド名 デヌタ型 説明
グリッド æ•Žæ•° テヌブル内のレコヌド識別子は、ツリヌノヌドの識別子ですすべおの倀> 0。
PGRID æ•Žæ•° 芪ノヌドのID。 したがっお、単䞀ツリヌのノヌド間に接続が確立されたす。 倀0は、このノヌドがツリヌの「ルヌト」に含たれるこずを意味したす。 ルヌト自䜓はデヌタベヌスに保存されたせん垞にプログラム内にありたす-倉​​曎できたせん。
GRNAME VARCHAR255 ツリヌノヌドの名前。 これらの倀テヌブル内の䞀意性は、1Cリファレンスブックのように監芖されたせん。


-テヌブル「CARDS」-ディレクトリ芁玠のストレヌゞ-連絡先デヌタのあるカヌド。

フィヌルド名 デヌタ型 説明
CDID æ•Žæ•° テヌブル内のレコヌド識別子はカヌド識別子ですすべおの倀> 0。
グリッド æ•Žæ•° 芪ツリヌノヌドの識別子GROUPS.GRIDぞのリンク。 したがっお、カヌドずツリヌの接続が確立されたす。 倀0は、このカヌドがツリヌの「ルヌト」に含たれるこずを意味したすただし、GROUPSテヌブルにGRID = 0の゚ントリはありたせん。
GRNAME VARCHAR255 カヌドの名前。 これらの倀テヌブル内の䞀意性は、1Cリファレンスブックのように監芖されたせん。
CDDESCRIPT VARCHAR255 説明カヌドのフィヌルド。
CDお問い合わせ BLOBTEXT-1 連絡先情報。 実際、MEMOタむプの圢匏のテキストフィヌルドは可倉長の倧きなテキストであり、メむンテヌブルずは別に保存されたす。 ゚ンコヌディングCHARやVARCHARなどを䜿甚した自動䜜業のすべおのルヌルが適甚されたす。
Cdnote BLOBバむナリ-0 泚。 実際、テキストフィヌルドですが、バむナリBLOBずしお蚘述されおいたす。 これを行うべきではありたせんが、デヌタベヌスの圢匏は私たちによっお遞択されないこずが倚いため、このオプションは非垞に可胜です。 この䟋は、デヌタベヌスがテキストであるこずを認識しおいない堎合にテキスト゚ンコヌドを凊理する方法を瀺したす。
CDIMAGE BLOBバむナリ-0 これは、カヌドに添付された画像が保存される堎所です。 実際、察応するグラフィックファむルず同じものが含たれおいたす。


-テヌブル「USERS」-情報システムの資栌情報。

フィヌルド名 デヌタ型 説明
UID æ•Žæ•° テヌブル内の゚ントリのID。
UNAME VARCHAR255 ナヌザヌアカりントの名前ログむン。 プログラムは、このフィヌルドの䞀意性テヌブル内を制埡したす倧文字ず小文字を区別したせん-぀たり、「admin」ナヌザヌがいる堎合、「AdMiN」アカりントを䜜成できたせん。
UPWD VARCHAR255 ナヌザヌパスワヌドクリアテキストで保存されたす。これは、FireBirdの新しいバヌゞョンではmd5関数が存圚せず、1Cでのこのアルゎリズムの実装も膚倧であるためです。
ラむツ VARCHAR255 ナヌザヌ暩限-文字「0」および「1」の文字列。察応する䜍眮にあり、察応するナヌザヌ暩限の䞍圚「0」たたは存圚「1」を瀺したす。

このバヌゞョンでは、次のナヌザヌ暩限が䜿甚されたす。

-position 1-デヌタを衚瀺する機胜。

-䜍眮2-デヌタを線集する機胜。

-position 3-ナヌザヌのリストを線集する機胜管理



たた、次のストアドプロシヌゞャがデヌタベヌスに配眮されたす。

手続き名 パラメヌタ名 パラメヌタタむプ 説明
SAVE_GROUP この手順では、グルヌプをデヌタベヌスに保存远加たたは曎新したす。
入力パラメヌタヌ
グリッド æ•Žæ•° 保存されたグルヌプの識別子グルヌプが以前に保存されおいない堎合は0
PGRID æ•Žæ•° 芪グルヌプID
GRNAME VARCHAR255 グルヌプ名
出力パラメヌタヌ
結果 æ•Žæ•° 保存された堎合、保存されたグルヌプの識別子。

0-グルヌプが保存されなかった堎合

ERRMSG VARCHAR255 ゚ラヌが発生した堎合の゚ラヌメッセヌゞテキストRESULT = 0
DELETE_GROUP この手順により、デヌタベヌスからグルヌプが削陀されたす。
入力パラメヌタヌ
グリッド æ•Žæ•° 削陀するグルヌプID
出力パラメヌタヌ
結果 æ•Žæ•° 削陀された堎合、削陀されたグルヌプのID。

0-グルヌプが削陀されおいない堎合

ERRMSG VARCHAR255 ゚ラヌが発生した堎合の゚ラヌメッセヌゞテキストRESULT = 0
MOVE_GROUP_TO_GROUP この手順は、指定されたグルヌプずその内容党䜓サブグルヌプずネストされたカヌドを別の指定されたグルヌプに転送したす。
入力パラメヌタヌ
SRC_GRID æ•Žæ•° 移行するグルヌプID
DST_GRID æ•Žæ•° ゜ヌスグルヌプの転送先グルヌプのID
出力パラメヌタヌ
結果 æ•Žæ•° グルヌプIDSRC_GRID移行された堎合。

0-グルヌプ転送が行われなかった堎合転送されなかった堎合

ERRMSG VARCHAR255 ゚ラヌが発生した堎合の゚ラヌメッセヌゞテキストRESULT = 0
MOVE_GROUP_CONTENTS_TO_GROUP この手順は、指定されたグルヌプサブグルヌプずネストされたカヌドの内容を別の指定されたグルヌプに転送したす。 この堎合、元のグルヌプ自䜓は同じ堎所に残りたす。
入力パラメヌタヌ
SRC_GRID æ•Žæ•° コンテンツを転送するグルヌプのID
DST_GRID æ•Žæ•° グルヌプのコンテンツを転送するグルヌプのID
出力パラメヌタヌ
結果 æ•Žæ•° 内容が移行された堎合、グルヌプ識別子SRC_GRID。

0-グルヌプコンテンツの転送が行われなかった堎合

ERRMSG VARCHAR255 ゚ラヌが発生した堎合の゚ラヌメッセヌゞテキストRESULT = 0
MOVE_CARD_TO_GROUP 手順は、指定されたグルヌプにカヌドを転送したす。
入力パラメヌタヌ
SRC_CDID æ•Žæ•° 譲枡するカヌドのID
DST_GRID æ•Žæ•° カヌドの転送先グルヌプのID
出力パラメヌタヌ
結果 æ•Žæ•° カヌドIDSRC_CDID、転送された堎合;

0-カヌドの転送が行われなかった堎合転送されなかった堎合

ERRMSG VARCHAR255 ゚ラヌが発生した堎合の゚ラヌメッセヌゞテキストRESULT = 0
TEST_GROUP_PARENT_HIERARCHY このプロシヌゞャは、PGRIDグルヌプが階局おそらく耇数の䞭間ノヌドを介しおGRIDグルヌプの芪であるかどうかをチェックしたす。 このプロシヌゞャはプログラムから呌び出されたせんが、他のプロシヌゞャで䜿甚されたす。
入力パラメヌタヌ
グリッド æ•Žæ•° PGRIDグルヌプの゚ントリを確認する必芁があるグルヌプの識別子
PGRID æ•Žæ•° グリッドグルヌプをチェックする必芁があるグルヌプ識別子
出力パラメヌタヌ
結果 小型 テスト結果

1-PGRIDグルヌプがGRIDグルヌプの階局的な芪である堎合;

0-PGRIDグルヌプがGRIDグルヌプの芪ではない堎合



カヌドSAVE_CARD、DELETE_CARDおよびナヌザヌSAVE_USER、DELETE_USERを操䜜する手順はありたせん。 これらの機胜を1Cに盎接実装し、1Cからの呌び出しをストアドプロシヌゞャだけでなく、さたざたなク゚リも衚瀺したす。



プログラム内の情報システムの゚ンティティの衚珟。



システムには、次の情報゚ンティティがありたす。

-連絡先のディレクトリのグルヌプ グルヌプのツリヌサブツリヌを圢成するグルヌプのセット-GROUPSテヌブルのデヌタの完党たたは郚分的な衚珟

-連絡先ディレクトリの芁玠カヌドカヌドのセット-CARDSテヌブル内のデヌタの完党たたは郚分的な衚瀺;

-システムアカりント  アカりントのセット-USERSテヌブルデヌタの完党たたは郚分的な衚瀺



モデルは、次のクラスの1Cコヌドで提瀺されたす。

-BaseObjBase Essence -クラス-このグルヌプの他のすべおのクラスの抜象芪。 共通のフィヌルドずメ゜ッドが含たれおいたす。

-ObjGroupEntityGroup-BaseObjの子孫は、゚ンティティ「 contact directory group 」の実装を衚したす。

-ObjCard゚ンティティカヌド -BaseObjの子孫であり、゚ンティティ「 contact directory element 」の実装を衚したす。

-ObjUserEntityUser-BaseObjの子孫であり、゚ンティティ「 user of the system 」の実装を衚したす。

-ObjSetオブゞェクトのセットもBaseObjの子孫ですが、゚ンティティではなく、゚ンティティのナニバヌサルコレクションであり、任意のタむプObjGroup、ObjCard、ObjUserのオブゞェクトのコレクションずしお衚すこずができたす。 圓然、1぀のセットに異なるタむプの゚ンティティを混圚させるこずはできたせん。



1Cでのこれらのクラスの察応する実装は次のようになりたす。

クラスコヌド
/////////////////////////////////////////////////////////////////////////////////////////////////// // //                                    // /////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //    (BaseObj) //      . // // : // . // : //    //  BaseObj_()  BaseObj =  ; //    BaseObj.("ClassID", 0); //    (INT) BaseObj.("ChangeInfo", );//       BaseObj.("ErrMsg", ""); //     (STR) BaseObj.ClassID = .ClassIDs.CLN_UNKNOWN; //     BaseObj;  //   . // // : // ClassID -  ,  .   ,   //   -   // : // () -     //  BaseObj_(ClassID=0)  BaseObj = ;  ClassID = .ClassIDs.CLN_GROUP  //  ObjGroup BaseObj = ObjGroup_()  ClassID = .ClassIDs.CLN_CARD  //  ObjCard BaseObj = ObjCard_()  ClassID = .ClassIDs.CLN_USER  //  ObjUser BaseObj = ObjUser_() ;  BaseObj =   //     BaseObj = BaseObj_(); ;  BaseObj;  //    -  . // // : // BaseObj -   ,     //  BaseObj_(BaseObj)   BaseObj.ClassID = .ClassIDs.CLN_GROUP  //  ObjGroup ObjGroup_(BaseObj)  BaseObj.ClassID = .ClassIDs.CLN_CARD  //  ObjCard ObjCard_(BaseObj)  BaseObj.ClassID = .ClassIDs.CLN_USER  //  ObjUser ObjUser_(BaseObj)   //      . // // : // BaseObj -    //  BaseObj_SetDefAttr(BaseObj)  BaseObj.ErrMsg = "";  BaseObj.ClassID = .ClassIDs.CLN_GROUP  //  ObjGroup ObjGroup_SetDefAttr(BaseObj)  BaseObj.ClassID = .ClassIDs.CLN_CARD  //  ObjCard ObjCard_SetDefAttr(BaseObj)  BaseObj.ClassID = .ClassIDs.CLN_USER  //  ObjUser ObjUser_SetDefAttr(BaseObj)   //     BaseObj2   BaseObj1. //     BaseObj1  . // // : // BaseObj1 -    // BaseObj2 -      //  BaseObj_Assign(BaseObj1, BaseObj2)   (BaseObj1 <> )  (BaseObj2 <> )  (BaseObj1.ClassID = BaseObj2.ClassID)  (BaseObj_IsEqual(BaseObj1, BaseObj2) = )   BaseObj1.ClassID = .ClassIDs.CLN_GROUP  //  ObjGroup ObjGroup_Assign(BaseObj1, BaseObj2)  BaseObj1.ClassID = .ClassIDs.CLN_CARD  //  ObjCard ObjCard_Assign(BaseObj1, BaseObj2)  BaseObj1.ClassID = .ClassIDs.CLN_USER  //  ObjUser ObjUser_Assign(BaseObj1, BaseObj2)    //     . // // : // BaseObj1 -    // BaseObj2 -      //  // ,   BaseObj2   ,   //  BaseObj1   -    //  BaseObj_IsEqual(BaseObj1, BaseObj2)   = ;  (BaseObj1 <> )  (BaseObj2 <> )  (BaseObj1.ClassID = BaseObj2.ClassID)   BaseObj1.ClassID = .ClassIDs.CLN_GROUP  //  ObjGroup  = ObjGroup_IsEqual(BaseObj1, BaseObj2)  BaseObj1.ClassID = .ClassIDs.CLN_CARD  //  ObjCard  = ObjCard_IsEqual(BaseObj1, BaseObj2)  BaseObj1.ClassID = .ClassIDs.CLN_USER  //  ObjUser  = ObjUser_IsEqual(BaseObj1, BaseObj2)  ;    //       . // // : // BaseObj1 -    // BaseObj2 -      //  // ,   BaseObj2     ,   //  BaseObj1   -    //  BaseObj_IsEqualKeys(BaseObj1, BaseObj2)   = ;  (BaseObj1 <> )  (BaseObj2 <> )  (BaseObj1.ClassID = BaseObj2.ClassID)   BaseObj1.ClassID = .ClassIDs.CLN_GROUP  //  ObjGroup  = ObjGroup_IsEqualKeys(BaseObj1, BaseObj2)  BaseObj1.ClassID = .ClassIDs.CLN_CARD  //  ObjCard  = ObjCard_IsEqualKeys(BaseObj1, BaseObj2)  BaseObj1.ClassID = .ClassIDs.CLN_USER  //  ObjUser  = ObjUser_IsEqualKeys(BaseObj1, BaseObj2)  ;    // ,        (), // ..     ,      . // // : // BaseObj -    //  // ,   BaseObj       -    //  BaseObj_IsKeyEmpty(BaseObj)   = ;  BaseObj <>    BaseObj.ClassID = .ClassIDs.CLN_GROUP  //  ObjGroup  = ObjGroup_IsKeyEmpty(BaseObj)  BaseObj.ClassID = .ClassIDs.CLN_CARD  //  ObjCard  = ObjCard_IsKeyEmpty(BaseObj)  BaseObj.ClassID = .ClassIDs.CLN_USER  //  ObjUser  = ObjUser_IsKeyEmpty(BaseObj)  ;    //      . // // : // BaseObj -    //  BaseObj_GetErrorMsg(BaseObj)   BaseObj.ErrMsg  //     . // // : // BaseObj -    //  //     //  BaseObj_GetChangeInfo(BaseObj)   BaseObj.ChangeInfo  //      //  . // // : // BaseObj -    // ChangeInfo -     //  BaseObj_SetChangeInfo(BaseObj, ChangeInfo)   BaseObj <>    BaseObj.ClassID = .ClassIDs.CLN_GROUP  //  ObjGroup ObjGroup_SetChangeInfo(BaseObj, ChangeInfo)  BaseObj.ClassID = .ClassIDs.CLN_CARD  //  ObjCard ObjCard_SetChangeInfo(BaseObj, ChangeInfo)  BaseObj.ClassID = .ClassIDs.CLN_USER  //  ObjUser ObjUser_SetChangeInfo(BaseObj, ChangeInfo)    //         DS. // // : // BaseObj -    // DS -    ADORecordSet // : // ,      ,    //  BaseObj_LoadFromDataSet(BaseObj, DS)   = ; //     BaseObj.ErrMsg = ""; //   ,        BaseObj.ClassID = .ClassIDs.CLN_GROUP  //  ObjGroup  = ObjGroup_LoadFromDataSet(BaseObj, DS)  BaseObj.ClassID = .ClassIDs.CLN_CARD  //  ObjCard  = ObjCard_LoadFromDataSet(BaseObj, DS)  BaseObj.ClassID = .ClassIDs.CLN_USER  //  ObjUser  = ObjUser_LoadFromDataSet(BaseObj, DS) ;    //////////////////////////////////////////////////////////////////////////////// //    (ObjSet) -    BaseObj // (  -  ClassID     , //     ) //      . // // : // . // : //    //  ObjSet_()  ObjSet = BaseObj_(); //    ObjSet.("ItemsList",  ); //      ObjSet;  //   . // // : // ClassID -  ,     . // : // () -     //  ObjSet_(ClassID=0)  ObjSet = ObjSet_(); ObjSet.ClassID = ClassID; //    ObjSet_SetDefAttr(ObjSet);  ObjSet;  //    -  . // // : // ObjSet -    //  ObjSet_(ObjSet)  ObjSet_Clear(ObjSet)  //      . // // : // ObjSet -    //  ObjSet_SetDefAttr(ObjSet)  ObjSet.ErrMsg = ""  //   Obj       ObjSet. // // : // ObjSet -     // Obj -   ,      // : // ,   Obj     ObjSet   -    //  ObjSet_TestItemForAdd(ObjSet, Obj)   = ; //    ObjSet.ErrMsg = "";  Obj <>    ObjSet.ClassID = Obj.ClassID  //             = ;     ObjSet.ItemsList   BaseObj_IsEqualKeys(, Obj)   = ;   ;      =   ObjSet.ErrMsg = "     "   ObjSet.ErrMsg = "     "   ObjSet.ErrMsg = "   " ;    //  -   . // // : // ObjSet -    // : //     //  ObjSet_GetCount(ObjSet)   ObjSet.ItemsList.()  //       Index (  0). // // : // ObjSet -    // Index -    // : //     (  Index)  ,  //    //  ObjSet_GetItemByIndex(ObjSet, Index)   = ; ObjSet.ErrMsg = "";  (Index >= 0)  (Index < ObjSet.ItemsList.())   = ObjSet.ItemsList[Index]  ObjSet.ErrMsg = "  "; ;    //       Index (  0), //     . // // : // ObjSet -     // Index -    // Obj -        // : // ,       ,  //     //  ObjSet_SetItemToIndex(ObjSet, Index, Obj)   = ; ObjSet.ErrMsg = "";  Obj <>    ObjSet.ClassID = Obj.ClassID   (Index >= 0)  (Index < ObjSet.ItemsList.())  // ,        //   BaseObj_IsKeyEmpty(Obj)  //    (  ) -       =    BaseObj_IsEqualKeys(ObjSet.ItemsList[Index], Obj)  //   ,      -    =   //     = ;     ObjSet.ItemsList   BaseObj_IsEqualKeys(, Obj)   = ;   ;      =   ObjSet.ErrMsg = "      "   ; //        //    -    BaseObj_Assign(ObjSet.ItemsList[Index], Obj)   ObjSet.ErrMsg = "      "   ObjSet.ErrMsg = "     "   ObjSet.ErrMsg = "   " ;    //    Obj  . // // : // ObjSet -     // Obj -     // : // ,       -    //  ObjSet_Add(ObjSet, Obj)   = ; ObjSet.ErrMsg = "";  Obj <>   //      ObjSet_TestItemForAdd(ObjSet, Obj)  //   ObjSet.ItemsList.(Obj); ObjSet.ChangeInfo = ;  =  //      ObjSet.ErrMsg = "   " ;    //       . // // : // ObjSet -    // Index -    (  0) // : // ,        -    //  ObjSet_Delete(ObjSet, Index)   = ; ObjSet.ErrMsg = "";  (Index >= 0)  (Index < ObjSet.ItemsList.())  BaseObj_(ObjSet.ItemsList[Index]); ObjSet.ItemsList.(Index);  =   ObjSet.ErrMsg = "  "; ;    //     . // // : // ObjSet -    // : //  ObjSet_Clear(ObjSet)   ObjSet.ItemsList.() > 0    Item  ObjSet.ItemsList  BaseObj_(Item); ; ObjSet.ItemsList.(); ObjSet.ChangeInfo =    //      //       // // : // ObjSet -    // : //     //  ObjSet_GetChangeInfo(ObjSet)    ObjSet.ChangeInfo  // ,      Item  ObjSet.ItemsList   BaseObj_GetChangeInfo(Item)  ObjSet.ChangeInfo = ;    ;  ObjSet.ChangeInfo  //      //        ChangeInfo // // : // ObjSet -    // ChangeInfo -     //  ObjSet_SetChangeInfo(ObjSet, ChangeInfo)  ObjSet.ChangeInfo = ChangeInfo;   ChangeInfo    Item  ObjSet.ItemsList  BaseObj_SetChangeInfo(Item, ChangeInfo)    //        //       // // : // ObjSet -    // : //      //  ObjSet_GetErrorMsg(ObjSet)   ObjSet.ErrMsg = ""  // ,       Item  ObjSet.ItemsList   Item.ErrMsg <> ""  ObjSet.ErrMsg = Item.ErrMsg;    ;  ObjSet.ErrMsg  //       . // // : // ObjSet -    // : // ,        -    //  ObjSet_TestSet(ObjSet)   = ; //    ObjSet.ErrMsg = ""; //      (ObjSet.ClassID = .ClassIDs.CLN_GROUP)  (ObjSet.ClassID = .ClassIDs.CLN_CARD)  (ObjSet.ClassID = .ClassIDs.CLN_USER)  //     1=0  ObjSet.ItemsList.()-1  1 = ObjSet.ItemsList[1];  ObjSet.ClassID = 1.ClassID   = ;  2=1+1  ObjSet.ItemsList.()-1  2 = ObjSet.ItemsList[2];  BaseObj_IsEqualKeys(1, 2)   = ;   ;    ObjSet.ErrMsg = "    ";    //        ObjSet.ErrMsg = "        "    //     ObjSet.ErrMsg = "   " ; //      ObjSet.ErrMsg = ""   =  ;    //      DS.    . //          // (      )    //  . // : // ObjSet -    // DS -    ADORecordSet // RowCount -  ,        // ( RowCount=-1,         // ) // : //       //  ObjSet_LoadFromDataSet(ObjSet, DS, RowCount=-1)   = 0; ObjSet.ErrMsg = ""; ObjSet_Clear(ObjSet);  ObjSet.ErrMsg = ""   = ObjSet_AddFromDataSet(ObjSet, DS, RowCount) ;    //      DS,       . //          // (      )    //  . // : // ObjSet -    // DS -    ADORecordSet // RowCount -  ,        // ( RowCount=-1,         // ) // : //       //  ObjSet_AddFromDataSet(ObjSet, DS, RowCount=-1)   = 0; ObjSet.ErrMsg = "";  RowCount <> 0   (DS.EOF = 0)  ((RowCount < 0)  ( < RowCount))  //   Obj = BaseObj_(ObjSet.ClassID);  Obj <>   //       BaseObj_LoadFromDataSet(Obj, DS)  //     -      ObjSet_Add(ObjSet, Obj)  //       =  + 1  //        //     -   ObjSet.ErrMsg = Obj.ErrMsg; BaseObj_(Obj);    //     ObjSet.ErrMsg = "      " ; //     DS.MoveNext();  ;    //////////////////////////////////////////////////////////////////////////////// //    (ObjGroup) //      . // // : // . // : //    //  ObjGroup_()  ObjGroup = BaseObj_(); ObjGroup.ClassID = .ClassIDs.CLN_GROUP; //  ObjGroup //    ObjGroup.("GRID", ); //   (INT) ObjGroup.("PGRID", ); //    (INT) ObjGroup.("GRName", ); //   (STR)  ObjGroup;  //   . // // : // . // : // () -     //  ObjGroup_()  ObjGroup = ObjGroup_(); //    ObjGroup_SetDefAttr(ObjGroup);  ObjGroup;  //    -  . // // : // ObjGroup -    //  ObjGroup_(ObjGroup)   //      . // // : // ObjGroup -    //  ObjGroup_SetDefAttr(ObjGroup)  ObjGroup.GRID = 0; ObjGroup.PGRID = 0; ObjGroup.GRName = "";  //     ObjGroup2   ObjGroup1. //     ObjGroup1  . // // : // ObjGroup1 -    // ObjGroup2 -      //  ObjGroup_Assign(ObjGroup1, ObjGroup2)   (ObjGroup1 <> )  (ObjGroup2 <> )  (ObjGroup_IsEqual(ObjGroup1, ObjGroup2) = )  ObjGroup1.GRID = ObjGroup2.GRID; ObjGroup1.PGRID = ObjGroup2.PGRID; ObjGroup1.GRName = ObjGroup2.GRName; ObjGroup1.ChangeInfo =    //  ,   ObjGroup2   ,   //  ObjGroup1   -    // // : // ObjGroup1 -    // ObjGroup2 -       // : // ,      -    //  ObjGroup_IsEqual(ObjGroup1, ObjGroup2)  IsEqual = ;  (ObjGroup1 <> )  (ObjGroup2 <> )   (ObjGroup2.GRID = ObjGroup1.GRID)  (ObjGroup2.PGRID = ObjGroup1.PGRID)  (ObjGroup2.GRName = ObjGroup1.GRName)  IsEqual =  //      ;  IsEqual  //       . // // : // ObjGroup1 -    // ObjGroup2 -      //  // ,   ObjGroup2     ,   //  ObjGroup1   -    //  ObjGroup_IsEqualKeys(ObjGroup1, ObjGroup2)  IsEqual = ;  (ObjGroup1 <> )  (ObjGroup2 <> )   ((ObjGroup2.GRID = ObjGroup1.GRID)  (ObjGroup1.GRID > 0))  IsEqual =  //      ;  IsEqual  // ,        (), // ..     ,      . // // : // ObjGroup -    //  // ,   ObjGroup       -    //  ObjGroup_IsKeyEmpty(ObjGroup)   = ; IsEmpty = ;  ObjGroup <>    ObjGroup.GRID <= 0  IsEmpty =   ;  IsEmpty  //        . // // : // ObjGroup -    // GRID -   // PGRID -    // GRName -   //  ObjGroup_SetAttr(ObjGroup, GRID, PGRID, GRName)  //     ,  , //       TmpObjGroup = ObjGroup_(); TmpObjGroup.GRID = GRID; TmpObjGroup.PGRID = PGRID; TmpObjGroup.GRName = GRName; ObjGroup_Assign(ObjGroup, TmpObjGroup); ObjGroup_(TmpObjGroup);  //      //  . // // : // ObjGroup -    // ChangeInfo -     //  ObjGroup_SetChangeInfo(ObjGroup, ChangeInfo)  ObjGroup.ChangeInfo = ChangeInfo  //         DS. // // : // ObjGroup -    // DS -    ADORecordSet // : // ,      ,    //  ObjGroup_LoadFromDataSet(ObjGroup, DS)   = ; //     ObjGroup.ErrMsg = "";  ObjGroup.GRID = DS.Fields("GRID").Value; ObjGroup.PGRID = DS.Fields("PGRID").Value; ObjGroup.GRName = DS.Fields("GRNAME").Value; ObjGroup_SetChangeInfo(ObjGroup, ); //   , .. //       = ; //     //      ObjGroup.ErrMsg = ().; ;    //////////////////////////////////////////////////////////////////////////////// //    (ObjCard) //      . // // : // . // : //    //  ObjCard_()  ObjCard = BaseObj_(); ObjCard.ClassID = .ClassIDs.CLN_CARD; //  ObjCard //    ObjCard.("CDID", ); //   (INT) ObjCard.("GRID", ); //   (INT) ObjCard.("CDName", ); //   (STR) ObjCard.("CDDescript", ); //  (STR) ObjCard.("CDContacts", ); //   (STR) ObjCard.("CDNote", ); //  (STR) ObjCard.("CDImage", );//  () //  ,       BLOB- ObjCard.("ChangeCDContacts", );//     CDContacts ObjCard.("ChangeCDNote", ); //     CDNote ObjCard.("ChangeCDImage", ); //     CDImage  ObjCard;  //   . // // : // . // : // () -     //  ObjCard_()  ObjCard = ObjCard_(); //    ObjCard_SetDefAttr(ObjCard);  ObjCard;  //    -  . // // : // ObjCard -    //  ObjCard_(ObjCard)   //      . // // : // ObjCard -    //  ObjCard_SetDefAttr(ObjCard)  ObjCard.CDID = 0; ObjCard.GRID = 0; ObjCard.CDName = ""; ObjCard.CDDescript = ; ObjCard.CDContacts = ; ObjCard.CDNote = ; ObjCard.CDImage = ; ObjCard.ChangeCDContacts = ; ObjCard.ChangeCDNote = ; ObjCard.ChangeCDImage = ;  //     ObjCard2   ObjCard1. //     ObjCard1  . // // : // ObjCard1 -    // ObjCard2 -      //  ObjCard_Assign(ObjCard1, ObjCard2)   (ObjCard1 <> )  (ObjCard2 <> )  (ObjCard_IsEqual(ObjCard1, ObjCard2) = )  ObjCard1.CDID = ObjCard2.CDID; ObjCard1.GRID = ObjCard2.GRID; ObjCard1.CDName = ObjCard2.CDName; ObjCard1.CDDescript = ObjCard2.CDDescript;  ObjCard1.CDContacts <> ObjCard2.CDContacts  ObjCard1.CDContacts = ObjCard2.CDContacts; ObjCard1.ChangeCDContacts =  ;  ObjCard1.CDNote <> ObjCard2.CDNote  ObjCard1.CDNote = ObjCard2.CDNote; ObjCard1.ChangeCDNote =  ;   (ObjCard1.CDImage, ObjCard2.CDImage)  ObjCard1.CDImage= ObjCard2.CDImage; ObjCard1.ChangeCDImage =  ; ObjCard1.ChangeInfo =    //  ,   ObjCard2   ,   //  ObjCard1   -    // // : // ObjCard1 -    // ObjCard2 -       // : // ,      -    //  ObjCard_IsEqual(ObjCard1, ObjCard2)  IsEqual = ;  (ObjCard1 <> )  (ObjCard2 <> )   (ObjCard2.CDID = ObjCard1.CDID)  (ObjCard2.GRID = ObjCard1.GRID)  (ObjCard2.CDName = ObjCard1.CDName)  (ObjCard2.CDDescript = ObjCard1.CDDescript)  (ObjCard2.CDContacts = ObjCard1.CDContacts)  (ObjCard2.CDNote = ObjCard1.CDNote)  (ObjCard2.CDImage, ObjCard1.CDImage)  IsEqual =  //      ;  IsEqual  //       . // // : // ObjCard1 -    // ObjCard2 -      //  // ,   ObjCard2     ,   //  ObjCard1   -    //  ObjCard_IsEqualKeys(ObjCard1, ObjCard2)  IsEqual = ;  (ObjCard1 <> )  (ObjCard2 <> )   ((ObjCard2.CDID = ObjCard1.CDID)  (ObjCard1.CDID > 0))  IsEqual =  //      ;  IsEqual  // ,        (), // ..     ,      . // // : // ObjCard -    //  // ,   ObjCard       -    //  ObjCard_IsKeyEmpty(ObjCard)   = ; IsEmpty = ;  ObjCard <>    ObjCard.CDID <= 0  IsEmpty =   ;  IsEmpty  //        . // // : // ObjCard -    // CDID -   // GRID -   // GRName -   // CDDescript -  // CDContacts -   // CDNote -  // CDImage -  //  ObjCard_SetAttr(ObjCard, CDID, GRID, CDName, CDDescript = , CDContacts = , CDNote = , CDImage = )  //     ,  , //       TmpObjCard = ObjCard_(); TmpObjCard.CDID = CDID; TmpObjCard.GRID = GRID; TmpObjCard.CDName = CDName;  CDDescript <>   TmpObjCard.CDDescript = CDDescript; ;  CDContacts <>   TmpObjCard.CDContacts = CDContacts; ;  CDNote <>   TmpObjCard.CDNote = CDNote ;  CDImage <>   TmpObjCard.CDImage = CDImage; ; ObjCard_Assign(ObjCard, TmpObjCard); ObjCard_(TmpObjCard);  //      //  . // // : // ObjCard -    // ChangeInfo -     //  ObjCard_SetChangeInfo(ObjCard, ChangeInfo)  ObjCard.ChangeInfo = ChangeInfo;  ChangeInfo =   ObjCard.ChangeCDContacts = ; ObjCard.ChangeCDNote = ; ObjCard.ChangeCDImage =    //         DS. // // : // ObjCard -    // DS -    ADORecordSet // : // ,      ,    //  ObjCard_LoadFromDataSet(ObjCard, DS)   = ; //     ObjCard.ErrMsg = "";   ObjCard.CDID = DS.Fields("CDID").Value;  ;  ObjCard.GRID = DS.Fields("GRID").Value;  ;  ObjCard.CDName = DS.Fields("CDNAME").Value;  ;  ObjCard.CDDescript = DS.Fields("CDDESCRIPT").Value;  ;  ObjCard.CDContacts = DS.Fields("CDCONTACTS").Value;  ;  CDNoteArray = DS.Fields("CDNOTE").Value; ObjCard.CDNote = COMSafeArrayWIN1251_UTF8(CDNoteArray);  ;  CDImageArray = DS.Fields("CDIMAGE").Value; ObjCard.CDImage = COMSafeArray_(CDImageArray)  ; ObjCard_SetChangeInfo(ObjCard, ); //   , .. //       = ; //     //      ObjCard.ErrMsg = ().; ;    //////////////////////////////////////////////////////////////////////////////// //    (ObjUser) //      . // // : // . // : //    //  ObjUser_()  ObjUser = BaseObj_(); ObjUser.ClassID = .ClassIDs.CLN_USER; //  ObjUser //    ObjUser.("UID", ); //   (INT) ObjUser.("UName", ); //  (STR) ObjUser.("UPwd", ); //  (STR) ObjUser.("URights", ); //   (STR)  ObjUser;  //   . // // : // . // : // () -     //  ObjUser_()  ObjUser = ObjUser_(); //    ObjUser_SetDefAttr(ObjUser);  ObjUser;  //    -  . // // : // ObjUser -    //  ObjUser_(ObjUser)   //      . // // : // ObjUser -    //  ObjUser_SetDefAttr(ObjUser)  ObjUser.UID = 0; ObjUser.UName = ""; ObjUser.UPwd = ; ObjUser.URights = "";  //     ObjUser2   ObjUser1. //     ObjUser1  . // // : // ObjUser1 -    // ObjUser2 -      //  ObjUser_Assign(ObjUser1, ObjUser2)   (ObjUser1 <> )  (ObjUser2 <> )  (ObjUser_IsEqual(ObjUser1, ObjUser2) = )  ObjUser1.UID = ObjUser2.UID; ObjUser1.UName = ObjUser2.UName; ObjUser1.UPwd = ObjUser2.UPwd; ObjUser1.URights = ObjUser2.URights; ObjUser1.ChangeInfo =    //  ,   ObjUser2   ,   //  ObjUser1   -    // // : // ObjUser1 -    // ObjUser2 -       // : // ,      -    //  ObjUser_IsEqual(ObjUser1, ObjUser2)  IsEqual = ;  (ObjUser1 <> )  (ObjUser2 <> )   (ObjUser2.UID = ObjUser1.UID)  (ObjUser2.UName = ObjUser1.UName)  (ObjUser2.UPwd = ObjUser1.UPwd)  IsEqualUserRights(ObjUser2.URights, ObjUser1.URights)  IsEqual =  //      ;  IsEqual  //       . // // : // ObjUser1 -    // ObjUser2 -      //  // ,   ObjUser2     ,   //  ObjUser1   -    //  ObjUser_IsEqualKeys(ObjUser1, ObjUser2)  IsEqual = ;  (ObjUser1 <> )  (ObjUser2 <> )   ((ObjUser2.UID = ObjUser1.UID)  (ObjUser1.UID > 0))  ((ObjUser2.UName) = (ObjUser1.UName))  IsEqual =  //      ;  IsEqual  // ,        (), // ..     ,      . // // : // ObjUser -    //  // ,   ObjUser       -    //  ObjUser_IsKeyEmpty(ObjUser)   = ; IsEmpty = ;  ObjUser <>    (ObjUser.UID <= 0)  ((ObjUser) = "")  IsEmpty =   ;  IsEmpty  //        . // // : // ObjUser -    // UID -   // UName -   // UPwd -   // URights -   //  ObjUser_SetAttr(ObjUser, UID, UName, UPwd, URights)  //     ,  , //       TmpObjUser = ObjUser_(); TmpObjUser.UID = UID; TmpObjUser.UName = UName; TmpObjUser.UPwd = UPwd; TmpObjUser.URights = URights; ObjUser_Assign(ObjUser, TmpObjUser); ObjUser_(TmpObjUser);  //      //  . // // : // ObjUser -    // ChangeInfo -     //  ObjUser_SetChangeInfo(ObjUser, ChangeInfo)  ObjUser.ChangeInfo = ChangeInfo  //         DS. // // : // ObjUser -    // DS -    ADORecordSet // : // ,      ,    //  ObjUser_LoadFromDataSet(ObjUser, DS)   = ; //     ObjUser.ErrMsg = "";  ObjUser.UID = DS.Fields("UID").Value; ObjUser.UName = DS.Fields("UNAME").Value; //ObjUser.UPwd = DS.Fields("UPWD").Value; //     ObjUser.UPwd = ; ObjUser.URights = DS.Fields("URIGHTS").Value; ObjUser_SetChangeInfo(ObjUser, ); //   , .. //       = ; //     //      ObjUser.ErrMsg = ().; ;   
      
      









デヌタベヌスを操䜜したす。 ADOテクノロゞヌ。



デヌタベヌスにアクセスするために、1Cに関しおむンタヌネット䞊で最もよく説明されおいるテクノロゞヌ「 Microsoft ADO 」を䜿甚したす。 そしお、これはもちろん合理的です、なぜなら このテクノロゞヌは、Windowsを搭茉したコンピュヌタヌで最も安定しお利甚できたす。 これは1Cだけでなく、 Visual Studioなどの他の開発ツヌルにも関係したす。 これは、さたざたなデヌタベヌステクノロゞに慣れおいるDelphiプログラマです。 他の開発者にずっお、ツヌルの遞択はより制限されおいたす。 過去10〜15幎にわたっお倚くの優れた蚘事がむンタヌネット䞊に蓄積されおいるため、ADOに぀いおは説明したせん。 この蚘事で説明する実装に必芁なむンタヌフェむスずデヌタ型を怜蚎したす詳现に぀いおは、MSDNのドキュメントを参照しおください。

むンタヌフェヌス名 説明 䜿甚されるプロパティずメ゜ッド
接続 デヌタベヌスぞの接続を提䟛したす。 状態 プロパティ-接続の珟圚の状態むンストヌルされおいるかどうかを瀺したす。



Open メ゜ッド-デヌタベヌスぞの接続を確立できたす。

閉じる メ゜ッド-デヌタベヌスから切断したす

コマンド 指定された接続Connection内でコマンドの実行を提䟛したすSQLク゚リにのみ関心がありたす。 ActiveConnection プロパティ-コマンド実行オブゞェクトが関連付けられおいる接続を瀺したす。

CommandType プロパティ-コマンドのタむプを瀺したすタむプに興味がありたす-「SQLク゚リ」;

CommandText プロパティ-コマンドテキストこの堎合、リク゚ストテキスト;

パラメヌタ プロパティ-デヌタベヌスにデヌタを送信するためのコマンドリク゚ストパラメヌタのコレクション。



実行 メ゜ッド-コマンド芁求を実行したす。 結果のデヌタセットを返したす。

CreateParameter メ゜ッド-コマンドリク゚ストの新しいパラメヌタヌを䜜成できたす

レコヌドセット ク゚リの結果ずしお取埗されたデヌタセットテヌブル。 デヌタベヌスからクラむアントアプリケヌションぞのデヌタ転送を提䟛したす。 状態 プロパティ-デヌタセットの状態利甚可胜かどうかを瀺したす。

EOF プロパティ-デヌタセットの終わりのサむン内郚ポむンタがセットの最埌の行にあるかどうかを瀺したす;

フィヌルド プロパティ-フィヌルドのコレクション-セットの珟圚の行の列ぞのアクセス。



MoveNext メ゜ッド-セットの内郚ポむンタヌをセットの終わりの方向に1行移動したす。

Close メ゜ッド-デヌタセットを閉じたす

フィヌルド デヌタセット内の珟圚の行のフィヌルドぞのアクセスを提䟛するフィヌルドのコレクション。 FieldsFieldInd 、 FieldsFieldName -特定のフィヌルドFieldぞのアクセスむンデックスシリアル番号たたは名前フィヌルド名の文字列倀
野原 デヌタセットの珟圚の行の列ぞのアクセスを提䟛するフィヌルド。 倀 プロパティ-フィヌルド倀リンクされたレコヌドセットの珟圚の行の察応する列の倀にアクセスできたす
パラメヌタ ク゚リパラメヌタを衚す倀のコレクション-クラむアントアプリケヌションからデヌタベヌスにデヌタを転送したす。 カりント プロパティ-コレクション内のパラメヌタヌの数を瀺したす。



远加メ゜ッド-コレクションの最埌にパラメヌタヌを远加したす。

削陀 メ゜ッド-指定したパラメヌタヌをコレクションから削陀したす



このプログラムで䜿甚されるADOデヌタ型の完党な説明を以䞋に瀺したす。

列挙型の実装
 //   ,    COM- ADO // // : // . // // : //    -      ADO //  ADO()  ADO =  ; //         Connection, Record  Stream ConnectModeEnum =  ; ConnectModeEnum.("adModeRead", 1); //   "  " ConnectModeEnum.("adModeReadWrite", 3); //   "  " ConnectModeEnum.("adModeRecursive", 4194304); // ConnectModeEnum.("adModeShareDenyNone", 16); //   "       " ConnectModeEnum.("adModeShareDenyRead", 4); //   "     " ConnectModeEnum.("adModeShareDenyWrite", 8); //   "     " ConnectModeEnum.("adModeShareExclusive", 12); //   "  -   " ConnectModeEnum.("adModeUnknown", 0); // ConnectModeEnum.("adModeWrite", 2 ); //   "  " ADO.("ConnectModeEnum", ConnectModeEnum); //     Command (,     ) CommandTypeEnum =  ; CommandTypeEnum.("adCmdUnspecified", -1); //     CommandTypeEnum.("adCmdText", 1); //   CommandText  //   SQL-, //   CommandTypeEnum.("adCmdTable", 2); //   CommandText  //  ,   //     SQL- CommandTypeEnum.("adCmdStoredProc", 4); //   CommandText  //   , //   CommandTypeEnum.("adCmdUnknown", 8); //      //  (adCmdText, adCmdTable, adCmdStoredProc) //     CommandText CommandTypeEnum.("adCmdFile", 256); //   CommandText  //  ,   //     Recordset CommandTypeEnum.("adCmdTableDirect", 512);//   CommandText  //  ,   //    ,  SQL- ADO.("CommandTypeEnum", CommandTypeEnum); //      , : Field, Parameter  Property DataTypeEnum =  ; DataTypeEnum.("AdArray", 8192); //    , ,    ( "" ) DataTypeEnum.("adBigInt", 20); // 64-    DataTypeEnum.("adBinary", 128); //   DataTypeEnum.("adBoolean", 11); //  DataTypeEnum.("adBSTR", 8); //  ,    Null (  Unicode) DataTypeEnum.("adChapter", 136); // DataTypeEnum.("adChar", 129); //   DataTypeEnum.("adCurrency", 6); //  . 8-   ,  10000 DataTypeEnum.("adDate", 7); // .  ,  - ,   12/30/1899 DataTypeEnum.("adDBDate", 133); //      DataTypeEnum.("adDBTime", 134); //      DataTypeEnum.("adDBTimeStamp", 135); //            DataTypeEnum.("adDecimal", 14); //         DataTypeEnum.("adDouble", 5); //       DataTypeEnum.("adEmpty", 0); //   (  ) DataTypeEnum.("adError", 10); // 32-    DataTypeEnum.("adFileTime", 64); // 64-  ,  -   100,   01/01/1601 DataTypeEnum.("adGUID", 72); //    GUID DataTypeEnum.("adIDispatch", 9); //    COM- IDispatch.    -  . DataTypeEnum.("adInteger", 3); // 32-    DataTypeEnum.("adIUnknown", 13); //    COM- IUnknown.    -  . DataTypeEnum.("adLongVarBinary", 205); //    (   Parameter) DataTypeEnum.("adLongVarChar", 201); //    (   Parameter) DataTypeEnum.("adLongVarWChar", 203); //   ,   Null -  Unicode (   Parameter) DataTypeEnum.("adNumeric", 131); //     DataTypeEnum.("adPropVariant", 138); // DataTypeEnum.("adSingle", 4); //       DataTypeEnum.("adSmallInt", 2); // 16-    DataTypeEnum.("adTinyInt", 16); // 8-    DataTypeEnum.("adUnsignedBigInt", 21); // 64-    DataTypeEnum.("adUnsignedInt", 19); // 32-    DataTypeEnum.("adUnsignedSmallInt", 18); // 16-    DataTypeEnum.("adUnsignedTinyInt", 17); // 8-    DataTypeEnum.("adUserDefined", 132); //    DataTypeEnum.("adVarBinary", 204); //   (   Parameter) DataTypeEnum.("adVarChar", 200); //   (   Parameter) DataTypeEnum.("adVariant", 12); //  .    -  . DataTypeEnum.("adVarNumeric", 139); //     (   Parameter) DataTypeEnum.("adVarWChar", 202); //   Unicode,   Null (   Parameter) DataTypeEnum.("adWChar", 130); //   Unicode,   Null ADO.("DataTypeEnum", DataTypeEnum); //       ParameterDirectionEnum =  ; ParameterDirectionEnum.("adParamInput", 1); //   ParameterDirectionEnum.("adParamInputOutput", 3);//     ParameterDirectionEnum.("adParamOutput", 2); //   ParameterDirectionEnum.("adParamReturnValue", 4);// -  ParameterDirectionEnum.("adParamUnknown", 0); //    ADO.("ParameterDirectionEnum", ParameterDirectionEnum); //    (   )     //  ,      ObjectStateEnum =  ; ObjectStateEnum.("adStateClosed", 0); // ,    ObjectStateEnum.("adStateOpen", 1); // ,    ObjectStateEnum.("adStateConnecting", 2); // ,    ObjectStateEnum.("adStateExecuting", 4); // ,     ObjectStateEnum.("adStateFetching", 8); // ,     ADO.("ObjectStateEnum", ObjectStateEnum); //       Stream StreamTypeEnum =  ; StreamTypeEnum.("adTypeBinary", 1); //   StreamTypeEnum.("adTypeText", 2); //  ,  //  ,   Stream.Charset ADO.("StreamTypeEnum", StreamTypeEnum); //         Stream SaveOptionsEnum =  ; SaveOptionsEnum.("adSaveCreateNotExist", 1); //  ,       SaveOptionsEnum.("adSaveCreateOverWrite",2); //     ,     // (  ,  ) ADO.("SaveOptionsEnum", SaveOptionsEnum);  ADO 
      
      







デヌタベヌスを操䜜したす。 1Cのサブプログラム。



耇数のデヌタベヌスを持぀ナヌザヌの䟿宜のために、「 接続プロファむル 」が提䟛されたす。 デヌタベヌスに関連するパラメヌタのグルヌプ。1぀の名前の䞋に統合されおいたす。 ほずんどの堎合、これらはDBMSに接続するためのパラメヌタヌデヌタベヌスサヌバヌアドレス、デヌタベヌス名、DBMSレベルでデヌタベヌスに接続するためのナヌザヌ名ずパスワヌドですが、他のパラメヌタヌを远加するこずもできたす

プロファむルを操䜜するには、メむン凊理モゞュヌルの「 KBaseの接続プロファむル 」および「 KBaseの接続プロファむル 」、およびプロファむルを線集するためのダむアログを実装する「 接続プロファむルのフォヌム蚭定 」 フォヌムのクラスがありたす。 これはすべおデモで芋るこずができたす。 この機胜の範囲は、DBMS䞊の倖郚デヌタベヌスにアクセスするためのプログラムです。



デヌタベヌスを操䜜するためのメむンクラスは、ConnectKBaseクラスです。 デヌタベヌスぞの接続ず切断、およびク゚リの実行が可胜です。



たた、䟿利な補助ツヌルはクラス「 リク゚ストパラメヌタのセット 」です。 このセットにより、SQLク゚リのテキストにさたざたな倀を簡単に埋め蟌むこずができたす。 ク゚リテンプレヌトを準備し、名前付きの倀パラメヌタヌをセットに远加しおから、特定のク゚リ倀を挿入する堎所に関する指瀺を含むク゚リテキストテンプレヌトを凊理したす。 セットはリク゚ストテンプレヌトを凊理し、特定の倀をそれに代入しお、リク゚ストの最終テキストを受け取りたす。 ク゚リテンプレヌトでは、パラメヌタ倀の眮換の堎所は次のように瀺されたす。parameter_name コロン、次にパラメヌタ名-これはDelphiで行われたす。

次に䟋を瀺したす。

  = _(); ... //   //   QSelectGroupTmpl = "SELECT grid, pgid, grname FROM groups WHERE grid = :grid;"; //      _(.); //       grid   10 _(, "grid", 10); //    –     //      grid  20.   - 1  _(, "grid", 20); //    –    –  //    – //  : "SELECT grid, pgid, grname FROM groups WHERE grid = 20;"  = _(, QSelectGroupTmpl);
      
      





このメカニズムク゚リテンプレヌトの䜿甚の詳现に぀いおは、 PodBase_SelectGroup関数から始たるPodBaseクラスのサブルヌチンのデモを参照しおください。



パラメヌタのセットは倀のタむプを分析し「未定矩」、「数倀」、「文字列」、「日付」、「ブヌル」を理解したす、指定されたDBMSに正しい構文でク゚リの倀を眮き換えたす。



「 RequestParameter Set 」クラスの゜ヌスコヌド

゜ヌステキスト
 //////////////////////////////////////////////////////////////////////////////// //    () //      . // // : // . // : //    //  _()   =  ; .("",  ); //    ;  //   . // // : // . // : // () -     //  _()   = _();  ;  //    -  . // // : //  -    //  _()  _()  //    .    ,    // // : //  -    //  -   (  ) //  -    //  _(,  ,  )   ( <> )  (() = (""))  (() <> "")   = (); //         .   (.) = ()  //   -   . = ;   ; //     =  ; .("", ); .("", ); ..()   //      // // : //  -    // : //     //  _()   ..()  //    -      // // : //  -    //  _()  ..()  //       // (? -   , * -  -  ) //   SQL- Like (  _  %) // // : //  -      : ?  * // : //      : _  % //  _Like( )   = "";  ( <> )  (() = (""))  ( <> "")   = ;  = (, "_", "");  = (, "%", "");  = (, "?", "_");  = (, "*", "%"); ;    //     ,     // SQL- FireBird // -           // -     0  1 // -      dd.mm.yyyy hh:mm:ss,    // -          // -    Null   NULL // // : //  -  // : //   ,       //  _( )   = "";  ( = )  ( = Null)   = "NULL"   () = ("")  //    = (, "=0; ='.'; =''")   () = ("")  //  -   = "'" + (, "='dd.MM.yyyy HH:mm:ss'") + "'"   () = ("")  //    = (, "=0; =1")   () = ("")  //    = (, "'", "''"); //   = "'" +  + "'"     ;    //     ,     . // // : //  -    //  -  ,       ":_" // : //   ,     //  _(,  )   = "";  ( <> )  (() = (""))  ( <> "")   = ;     .   = (, ":" + ., _(.))  ;   
      
      







それでは、最埌に、デヌタベヌスを操䜜する䞻なクラスである「KBaseに接続」クラスに぀いお考えおみたしょう。

このクラスには、次のルヌチンが含たれおいたす。

サブルヌチン名 説明 ご泚意
汎甚ルヌチンのグルヌプ。 オブゞェクトのコンストラクタ、デヌタベヌスに接続しおデヌタベヌスから切断するためのルヌチン、およびオブゞェクトの䞀般的なプロパティの珟圚の倀を返すルヌチンを次に瀺したす。
関数SubBase_CreateObject オブゞェクト構造の䜜成
関数SubBase_Constructor オブゞェクトコンストラクタヌ
SubBase_DestructorプロシヌゞャSubBase オブゞェクトデストラクタ
関数SubBase_GetDBAddrSubBase デヌタベヌスのアドレスを返したす
関数SubBase_GetDBUserNameSubBase 接続したデヌタベヌスサヌバヌのナヌザヌ名を返したす
GetConnect_Base関数 デヌタベヌスぞの接続を確立する兆候を返したす
関数SubBaseConnectToDBSubBase、FBDBAddr、FBUserName、FBUserPass デヌタベヌスサヌバヌに接続したす
SubBaseの切断手順 ベヌスから切断したす
関数SubBase_GetUserRegisterSubBase ナヌザヌ登録のサむンを返したす
_RegisterUser (, UserName, UserPass)
_UnregisterUser()
_GetRegLogin() ,
_GetUserID()
_GetUserName()
_GetUserRights()
_TestUserRight(, RightIndex) ,
_GetErrorMsg() .
, ADO – - . ( ).
_ClearCommandParameters() ADODB.Command
_ExecSQL(, ) SQL-,



_GetRecordSet(, ) SQL-,



_CheckRestConnect(, =) .
, . .
_CheckRights(, RightsMask="") .
_SelectDataSet(, , DstDataSet, RightsMask="")
_SelectSingleVal(, , OutVal, OutValName, RightsMask="")
_SelectPair(, , OutVal1, OutVal2, OutValName1, OutValName2, RightsMask="")
_SelectList(, , List, RightsMask="")
_SelectListPair(, , List, RightsMask="")
_SelectObject(, , Obj, RightsMask="")
_SelectObjects(, , ClassID, ObjectsSet, RightsMask="")
_WriteQuery(, , RightsMask="")
, .
_SelectGroup(, GRID, ObjGroup)
_SelectGroups(, PGRID, ObjSetGroups) ,
_SelectCard(, CDID, ObjCard)
_SelectCardsNames(, GRID, ObjSetCards) , (BLOB- )
_SelectUser(, UID, ObjUser)
_SelectUsers(, ObjSetUsers) —
_SaveGroup(, ObjGroup) — INSERT UPDATE
_DeleteGroup(, GRID) ( )
_SaveCard(, ObjCard) — INSERT UPDATE .
_DeleteCard(, CDID)
_MoveGroupToGroup(, SrcGRID, DstGRID) . .
_MoveGroupContentsToGroup(, SrcGRID, DstGRID) . .
_MoveCardToGroup(, SrcCDID, DstGRID) .
_UpdatePassword(, OldPassword, NewPassword) ( ) .
_SaveUsers(, ObjSetUsers, DelUsersIDs) — INSERT UPDATE

. — DELETE.



, ADO:

— ( , ) – «_ConnectToDB», «_RegisterUser» .

( , ):

— « ADODB.Connection »;

— « ADODB.Command » . – SQL- (CommandType = CommandTypeEnum.adCmdText). (, ..) ;

— , ( ).

. , .

:

 //      // // : //  -    // FBDBAddr -    (   ) // FBUserName -    // FBUserPass -    // : // ,      -    //  _ConnectToDB(, FBDBAddr, FBUserName, FBUserPass)  //       QGetTab = "SELECT RDB$RELATION_NAME AS tabname FROM RDB$RELATIONS " + "WHERE ((RDB$SYSTEM_FLAG = 0)AND(RDB$VIEW_SOURCE IS NULL)) " + "ORDER BY RDB$RELATION_NAME;";  = ; .FBDBAddr = FBDBAddr; //  .FBUserName = FBUserName; //  .FBUserPass = FBUserPass; //    .FBSrvConn = ; //     .FBCommand = ; //       .IsDBConnect = ; //    .LastTestTime = 0; //     _UnregisterUser(); //    .ErrMsg = ""; //    //      FireBird _Driver = "driver={" + "Firebird/InterBase(r) driver" + "}"; _UID = "uid=" + FBUserName; _PWD = "pwd=" + FBUserPass; _DataBase = "database=" + FBDBAddr;  = _Driver + ";" + _UID + ";" + _PWD + ";" + _DataBase;  //   .FBSrvConn =  COM("ADODB.Connection"); //   .FBSrvConn.open(); .IsDBConnect = ; //      .FBCommand =  COMObject("ADODB.Command"); .FBCommand.ActiveConnection = .FBSrvConn; .FBCommand.NamedParameters = True; .FBCommand.CommandType = ADO.CommandTypeEnum.adCmdText; //      // ,      = QGetTab;  .FBCommand.CommandText = ;  = .FBCommand.Execute();   =  ;   <>    .State = ADO.ObjectStateEnum.adStateOpen    =  ; //     .EOF = 0  .((.Fields("TABNAME").Value)); //     .MoveNext(); ; //       TabName  .QTabsLst   .(TabName) =   //       .ErrMsg = "   " + TabName + "  ";   ;  //       .ErrMsg = "     "   //       .ErrMsg = "     "; ; //    .Close();  =   //       .ErrMsg = "     " ;  //   .ErrMsg = "     FireBird: " + () ;  .ErrMsg = ""  //    -    =   //     -  _Disconnect() ;  ;  //    -   //    UserName   UserPass    //  . // // : //  -    // UserName -   // UserPass -   // : // ,     // (     )   -    //  _RegisterUser(, UserName, UserPass)  //        QGetUsr = "SELECT * FROM USERS WHERE " + "((UPPER(UNAME COLLATE PXW_CYRL) = :upname)OR(UNAME = :name)) AND (UPWD = :pass);";  = ; .ErrMsg = ""; //     .IsDBConnect  //   -     _UnregisterUser(); //     //     //     _(.); _(., "upname", (UserName)); _(., "name", UserName); _(., "pass", UserPass);  = _(., QGetUsr);  .FBCommand.CommandText = ;  = .FBCommand.Execute();   =  ;   <>    (.State = ADO.ObjectStateEnum.adStateOpen)  (.EOF = 0)   .UID = .Fields("UID").Value; .UName = .Fields("UNAME").Value; .Rights = .Fields("URIGHTS").Value;  ; .IsRegister =  ; //    .Close();  =  ;  .IsRegister  //    .RegLogin = UserName; .RegPass = UserPass;  =   //    .UID = 0; .UName = ""; .Rights = "";  .ErrMsg = ""  .ErrMsg = "  "    //    .ErrMsg = "  " ;   
      
      







— ( , ) – «_Disconnect», «_UnregisterUser» .

« »

« ADODB.Command », « ADODB.Connection » ( TCP) ;

:

 //     // // : //  -    //  _Disconnect()  //    _UnregisterUser(); //     .IsDBConnect = ; .LastTestTime = 0; .FBCommand = ;  .FBSrvConn <>    .FBSrvConn.State = ADO.ObjectStateEnum.adStateOpen  .FBSrvConn.Close() ; .FBSrvConn = ;   //     // // : //  -    //  _UnregisterUser()  .IsRegister = ; .RegLogin = ""; .RegPass = ""; .UID = 0; .UName = ""; .Rights = ""; 
      
      







— – «_ExecSQL», «_GetRecordSet», «_CheckRestConnect» .

« ADODB.Command », – « Execute ». « ADODB.Recordset » .

. : (15-20 .), ( TCP-) . , – ( ), , . . , .

. «», – . , () , . , ( localhost, .. , , ).

- ( NOP-) TCP-, (, , ). , FireBird .. DUMMY- ( , ), - . , «» , , Windows «». Microsoft, ( DUMMY-???), , Windows-2000, KB-. , DUMMY- FireBird ( ).

, FireBird , ( ) TCP- ( ASK- TCP), SO_KEEPALIVE. , -, «KEEP ALIVE» ( Windows ) 2- ( 15-20., ). -, , , , .. ASK- . , .

, . , , , ( ) ( ) . , ( ) « _CheckRestConnect ». « » , ( ) « », ( ). « CheckRestConnect » , , «ADODB.Command»? – , InterBase/FireBird, «SELECT 1 FROM RDB$DATABASE». , . « CheckRestConnect » . « CheckRestConnect » , , 2 ( + 1 ) . « CheckRestConnect », – 5. , , . , « _ExecSQL » « _GetRecordSet », « CheckRestConnect » 2- ( 1- , 2- ). , ( 5.) - , « CheckRestConnect » , . , « CheckRestConnect » .

:

゜ヌステキスト
 //  SQL-       //    ( ,   ). //  ,      -    // // : //  -    //  -     // : // ,      -    //  _ExecSQL(, )  .ErrMsg = ""; //      = ;  _CheckRestConnect()   .FBCommand.CommandText = ; .FBCommand.Execute(); //     = ;  //    .ErrMsg = "  : " + (); // ,   -     _CheckRestConnect(, )   .FBCommand.CommandText = ; .FBCommand.Execute(); //     = ;  //    .ErrMsg = "  : " + ();    ;    //  SQL-      //     ( ,    //  ). // // : //  -    //  -     // : //    ,      //  _GetRecordSet(, )  .ErrMsg = ""; //      = ;  _CheckRestConnect()   .FBCommand.CommandText = ;  = .FBCommand.Execute();  //    .ErrMsg = "  : " + (); // ,   -     _CheckRestConnect(, )   .FBCommand.CommandText = ;  = .FBCommand.Execute();  //    .ErrMsg = "  : " + ();    ;    //       FireBird // (   ).    ,    . //  ,      -    // // : //  -    //  -  (),     , //          // (5 .) // : // ,        -    //  _CheckRestConnect(, =) //     QTestConnect = "SELECT 1 FROM RDB$DATABASE;"; .ErrMsg = ""; //      = ;  (.FBSrvConn <> )  .IsDBConnect  //      = 300000; //   ( ),   = ();    (.LastTestTime = )  (.LastTestTime = 0)  ( - .LastTestTime >= )  //       .FBCommand.CommandText = QTestConnect; .FBCommand.Execute(); //    .LastTestTime = ;  =   //    -   //    FBDBAddr = .FBDBAddr; //  FBUserName = .FBUserName; //  FBUserPass = .FBUserPass; //    IsRegister = .IsRegister; //  UserName = .RegLogin; //   UserPass = .RegPass; //    _Disconnect(); //     _ConnectToDB(, FBDBAddr, FBUserName, FBUserPass)  //   -      IsRegister   _RegisterUser(, UserName, UserPass)  //    -   .LastTestTime = ;  =   //    -    _Disconnect();   //     -   .LastTestTime = ;  =      //        =    //      .ErrMsg = "   "; ;   
      
      







BLOBパラメヌタヌを操䜜するためのヘルパヌルヌチン。



InterBase / FireBirdには、TEXTずBINARYの2皮類のBLOBフィヌルドがありたす。

TEXTは、他のDBMSのMEMOず本質的に同じです。これは䞍定次元のテキストであり、メむンテヌブルずは別に保存されたす。テキスト文字列ず同様に、ADOずCHAR / VARCHARを䜿甚しお䜜業できたすすべおのトランスコヌドは自動的に実行されたす。SQLレベルでは、他のテキスト文字列ず比范できたす比范挔算子ずLIKE。デヌタベヌスには、そのようなフィヌルドが1぀ありたす-「CARDS.CDCONTACTS」です。

バむナリ – BLOB, . , . 1 («ADO.Recordset», «ADO.Parameters») COMSafeArray ( ).

, . – «CARDS.CDNOTE». , – . WIN-1251, 1 «» – UTF-8. :

 WIN1251_UTF8 UTF8_WIN1251 COMSafeArrayWIN1251_UTF8 UTF8_COMSafeArrayWIN1251
      
      





 //     (  Windows-1251) //    1C ( UTF-8) // // : // WIN1251 -      Windows-1251 // : //    "",      //  WIN1251_UTF8(WIN1251)   = "";  (WIN1251) = ("")      WIN1251   () = ("")  //    Windows-1251  UTF-8  ( >= 192)  ( <= 223)  //  -   =  + 848  ( >= 224)  ( <= 239)  //  -   =  + 848  ( >= 240)  ( <= 255)  //  -   =  + 848  ( = 184)  //   = 1105  ( = 168)  //   = 1025  ( = 185)  // №  = 8470 ; //      =  + ()   ;    //    1 ( UTF-8)  //    (  Windows-1251) // // : // UTF8 -     UTF-8 // : //      Windows-1251 //  UTF8_WIN1251(UTF8)   =  ;  (UTF8) = ("")   =1  (UTF8)   = ((UTF8, , 1)); //    UTF-8  Windows-1251   < 192   =   ( >= 192+848)  ( <= 223+848)  //  -   =  - 848  ( >= 224+848)  ( <= 239+848)  //  -   =  - 848  ( >= 240+848)  ( <= 255+848)  //  -   =  - 848  ( = 1105)  //   = 184  ( = 1025)  //   = 168  ( = 8470)  // №  = 185  //     = -1 ; //        >= 0  .()   ;    //      COMSafeArray (   Windows-1251) //    1C ( UTF-8) // // : // COMSafeArray -      COMSafeArray // (    1) //   -      //   Windows-1251 // : //    "",      //  COMSafeArrayWIN1251_UTF8(COMSafeArray)   = "";  (COMSafeArray) = ("COMSafeArray")  (COMSafeArray.GetDimensions() = 1)  (COMSafeArray.GetLength(0) > 0)   = COMSafeArray.();  = WIN1251_UTF8() ;    //    1C ( UTF-8)  //    ( Windows-1251)    COMSafeArray // // : // UTF8 -     UTF-8 // : //      COMSafeArray       Windows-1251 //  ,     //  UTF8_COMSafeArrayWIN1251(UTF8)   = ;  (UTF8) = ("")   = UTF8_WIN1251(UTF8);  =  COMSafeArray(, "VT_UI1", .()) ;   
      
      







BLOB(BINARY) () — «CARDS.CDIMAGE». , « » « COMSafeArray ». « COMSafeArray » « ». « » , «», « BASE64 » « Base64 » « Base64 ». ( ) : « COMSafeArray »« »« »« ». « Base64 » « Base64 ».

, :

 Base64 Base64 COMSafeArray_ _COMSafeArray
      
      





 //       BASE64. // // : //  -     (  0..255),  //  ; //  -   BASE64,      //     (   ). //   -    72 .   0, //      (   ); // Base64 -     -  BASE64; //  -    ,    //     (  0),   //   ( -1,      //  ) //  -    ,     //    . // : // ,     ,    (  //        ) //  Base64(, =72, Base64, , )  Base64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";  = ;  = -1;  = "";  () = ("")   (() = (""))  ( >= 0)   = .(); Base64 = "";  = 0; //  Base64     //  ,   .     = 0; //  (0..2)        = 0;// ,    3-    =0    //      = [];  ( >= 0)  ( <= 255)  //     = 256* + ;  =  + 1;  ( > 2)  ( = )  //       //  (  ) -  //     BASE64 //    ,    //   =  2   = 256* ; //    BASE64  = ""; //      BASE64 //    (   ), //     "="  =+1  3   =  % 64;  = "=" + ;  = ( - ) / 64 ; //   BASE64    =0     =  % 64;  = (Base64, +1, 1) + ;  = ( - ) / 64 ; //        = 0  //      Base64 = Base64 +   //       //      >=   Base64 = Base64 + (13) + (10);  = 0 ; //      = (); //    4    +  <=   Base64 = Base64 + ;  =  + ;   =1      >=   Base64 = Base64 + (13) + (10);  = 0 ; Base64 = Base64 + (, , 1);  =  + 1   ;  = 0;  = 0   // :      0.255  = ;  = "       (0..255)";     // :      = "     "   // :      = "   " ; //  ,       = ""   =  ;    //    BASE64   . // // : // Base64 -     BASE64,   ; //  -     (  0..255),   //    (  Base64) //  -    ,    //     Base64 (  1),   //   ( 0,      //  ) //  -    ,     //    . // : // ,     ,    (  //        ) //  Base64(Base64, , , )  Base64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";  = ;  = 0;  = "";  (Base64) = ("")  Base64 = (Base64);  =  ;  = 0; // ,    3-    4-    = 0; //  (1..4)       // (   "=")  = 0; // -      (   "=")  =1  Base64   = (Base64, , 1);  ( = " ")  ( = .)  ( = .)  ( = .)  //  -    = "="  //   -      2-      (=Base64-1)  (=Base64)  //   "=" //        = 64* + 0;  =  + 1;  // :       = ;  = "    ";    // ,      BASE64 Base64 = (Base64, )-1;  (Base64 >= 0)  (Base64 <= 63)  //      //        = 64* + Base64;  =  + 1;  =  + 1  // :       = ;  = "    ";   ; //        -     >= 4  //    ,  ,   //    =  % 256; 2 = ;  = ( - ) / 256;  =  % 256; 1 = ;  = ( - ) / 256;  =  % 256; 0 = ;   >= 2  .(0);   >= 3  .(1);   >= 4  .(2)   ; //       = 0;  = 0;  = 0;   ; // ,       > 0    = ""  // :       = "    "    // :      = "   " ; //  ,       = ""   =  ;    //      COMSafeArray (BLOB-   //  )     // // : // COMSafeArray -      COMSafeArray // (    1) //   -       //     // : //       ,      //  COMSafeArray_(COMSafeArray)   = ;  (COMSafeArray) = ("COMSafeArray")  (COMSafeArray.GetDimensions() = 1)  (COMSafeArray.GetLength(0) > 0)    = COMSafeArray.(); Base64 = "";  = 0;  = "";  Base64(, 0, Base64, , )   = Base64(Base64);  =  ();  =     ;    //      //        COMSafeArray // // : //  -      // : //      COMSafeArray      //  ,     //  _COMSafeArray()   = ;  (() = (""))  (. <> .)    = .(); Base64 = Base64();  =  ;  = 0;  = "";  Base64(Base64, , , )   =  COMSafeArray(, "VT_UI1", .())    ;   
      
      







, « Base64 » « Base64 » , . – ( + « » (.. , .. « » ), « »). , « » « COMSafeArray »« » « 「。ファむルに保存しおファむルからダりンロヌドするために、むンタヌネットからの掚奚に埓っおADO.Stream COMオブゞェクトも䜿甚したした。その結果、倉換はほが瞬時に実行されたす。コヌドは次のずおりです。

 COMSafeArray_ _COMSafeArray
      
      





゜ヌステキスト
 //      COMSafeArray (BLOB-   //  )     // // : // COMSafeArray -      COMSafeArray // (    1) //   -       //     // : //       ,      //  COMSafeArray_(COMSafeArray)   = ;  (COMSafeArray) = ("COMSafeArray")  (COMSafeArray.GetDimensions() = 1)  (COMSafeArray.GetLength(0) > 0)    = (); //  BLOB    StreamOut =  COM("ADODB.Stream"); StreamOut.Type = ADO.StreamTypeEnum.adTypeBinary; //     StreamOut.Mode = ADO.ConnectModeEnum.adModeReadWrite; //    -     StreamOut.Open(); StreamOut.Write(COMSafeArray); StreamOut.SaveToFile(, ADO.SaveOptionsEnum.adSaveCreateOverWrite); StreamOut.Close(); //       =  ();  = ; //    ()   ;    //      //        COMSafeArray // // : //  -      // : //      COMSafeArray      //  ,     //  _COMSafeArray()   = ;  (() = (""))  (. <> .)    = (); //      .(); //  BLOB    StreamIn =  COM("ADODB.Stream"); StreamIn.Type = ADO.StreamTypeEnum.adTypeBinary; //     StreamIn.Mode = ADO.ConnectModeEnum.adModeReadWrite; //    -     StreamIn.Open(); StreamIn.LoadFromFile();  = StreamIn.Read(); StreamIn.Close(); //    ()   ;   
      
      







プログラムむンタヌフェむスに関する泚意。



デヌタモデルの状態ずその衚瀺むンタヌフェむスの䞀貫性を確保するこずが重芁です。 ぀たり - , , . , , . 1 , . ( ), . , , «» . , ( ), . , ( ).

, , « » « » , .. . – , « », .

:

 /////////////////////////////////////////////////////////////////////////////////////////////////// // //                                            // /////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //       () //     (  ). //   . // // : //  - ,   ; //  _()    <>   //    ,     =  (10, 0);  =  ();  =  ; .(); .((""));  =  (); //  "" .(); .((""));  =  (, , ,); //  "" .(); .((""));  =  (); //  "" .(); .((""));  =  (, , ); //  "" //   ..(); ..("", ); ..("", ); ..("", ); ..("", )   //         . // // : //  -   ,     //  -  ,     ; // : //   ,     ,    //  //  _(, )   = ;   <>    (. <> )  (..GRID = )   =       .   (. <> )  (..GRID = )   = ;    = _(, );   <>        ;    //        . // // : //  - ,   ; //  -  ,     ; //  -   ,      //    ,     (   ,   //     ); // : //   ,     ,    //  //  _(, , =)   = ;   <>   //        = _(, ) ;   =   //          .   (. <> )  (..GRID = )   =    = _(, ) ;   <>      ;    //       ,  . // // : //  - ,   ; //  -   ObjGroup; //  -   ,      //    ,     (   ,   //     ); // : //   ,     ,    //  //  _(, , =)   = ;   <>   _(, .GRID, ) ;    //   ,      //  ( ,     //  )  .     . // // : //  - ,   ; //  -     ; //  -     ; // : // ,          , //         //  _(, , )   = ;  ( > 0)  ( >= 0)  ( <> )    = 0  //        =   //     = _(, );   <>   //    ,      //        = .;   <>    ..GRID =   // ,          = ;  ;  = .    ;    //         . //    ,      .   // ,    .       ( // ),       . // // : //  - ,   ; //  -   ObjGroup,     ; //  -   ,     //    ,     (   ,   //     ); // : //   ,          // ,       //  _(, , =)   = ; //  ,          ( <> )  ( <> )   = _(, .GRID, );   =   //      -      = _(, .PGRID, );   <>    = ..(); . = ; . = 0; . = ; . = .GRName;  =    //       = .;  (( = )  (.PGRID < 0))  (( <> )  (..GRID = .PGRID))  //       . = ; . = .GRName;  =   //         <>   ..() ;  = _(, .PGRID);   <>    = ..(); . = ; . = 0; . = ; . = .GRName;  =     ;    //    ,    // (    ). // // : //  - ,   ; //  -   ObjGroup,      ; //  -   ,      //    ,     (   ,   //     ); // : //   ,        //      ,      //  _(, , =)   = ;  ( <> )  ( <> )   = _(, .GRID, );   <>    = .;   <>    = ..(); ..();  = ..();   > 0    <    = .[]   = .[-1]    =     ;    //         . // // : //  -    ; //  -          ; //  - ,   ; //  -   ,     ; //  -    ,    //          - //        (  ,  //        ); //  -  -  ,   , //     ( =0,      - //   ). //  _(, , , , =, =0)   ( <> )  ( >= 0)  ( >= 0)  //   ,        = ;  ( <> )  (..GRID = )   =  ;   =    = _(, , ) ;   <>   //       . = ; ..(); //        = ObjSet_(.ClassIDs.CLN_GROUP);  _SelectGroups(, , )  //        //        , //        =0  ObjSet_GetCount()-1   = ObjSet_GetItemByIndex(, );  = ..(); . = ; . = 0; . = ; . = .GRName; ; . = ; //     <> 1      .  //      = 0  _(, , , ..GRID, , )   > 1  _(, , , ..GRID, , -1)     //        _(, ._1, "   ", ._, _GetErrorMsg()) ; ObjSet_()    //       ,    . //      . // // : //  -    ; //  -          ; //  - ,   ; //  -  -  ,   , //     ( =0,      - //   ). // : //      ,       // //  _(, , , =0)   = ;  ( <> )  ( >= 0)  //     ..(); //     = ObjGroup_(); ObjGroup_SetAttr(, 0, -1, "");  = ..(); . = ; . = 0; . = ; . = .GRName; //  ,     (  2-  ) _(, , , .GRID, , );  =  ;    //////////////////////////////////////////////////////////////////////////////// //        () //      -     // (   ).   . // // : //  - ,    ; //  _()    <>   //    ,     =  (10, 0);  =  ();  =  ; .(); .((""));  =  (); //  "" .(); .((""));  =  (, , ,); //  "" .(); .((""));  =  (); //  "" .(); .((""));  =  (, , ); //  "" //   ..(); ..("", ); ..("", ); ..("", ); ..("", )   //          . // // : //  -   ObjGroup  ObjCard,   ; //  -  ,     ; // : // ,          -   //  //  _(, )   = ;  ( <> )  ( >= 0)   = ((.ClassID = .ClassIDs.CLN_GROUP)  (.PGRID = ))  ((.ClassID = .ClassIDs.CLN_CARD)  (.GRID = )) ;    // ,          . // // : //  -   ObjGroup  ObjCard,   ; //  -  ,   ; // : // ,         -   //  //  _(, )   = ;  ( <> )  ( <> )   = ((.ClassID = .ClassIDs.CLN_GROUP)  (. = )  (.GRID = ..GRID))  ((.ClassID = .ClassIDs.CLN_CARD)  (. = )  (.CDID = ..CDID)) ;    //    ,    . // // : //  - ,    ; //  -   ObjGroup  ObjCard,    ; //  -  ,     //       (  ,    //    ); // : //  ,       ,   //    //  _(, , )   = ;  ( <> )  ( <> )   ( <> )  _(, )  // ,  -     =   //             _(, )   = ;     ;    //       (  ) //    . // // : //  -    ; //  -          ; //  - ,    ; //  -   ,     ; //  _(, , , )    <>   //     .();   >= 0  //      = ObjSet_(.ClassIDs.CLN_GROUP);  _SelectGroups(, , )  //       =0  ObjSet_GetCount()-1   = ObjSet_GetItemByIndex(, );  = .(); . = ; . = 0; . = ; . = .GRName;   //        _(, ._1, "    ", ._, _GetErrorMsg()) ; ObjSet_(); //      = ObjSet_(.ClassIDs.CLN_CARD);  _SelectCardsNames(, , )  //       =0  ObjSet_GetCount()-1   = ObjSet_GetItemByIndex(, );  = .(); . = ; . = 1; . = ; . = .CDName;   //        _(, ._1, "    ", ._, _GetErrorMsg()) ; ObjSet_()    //        . //    ,      .   // ,    .       ( // ),        . // // : //  - ,    ; //  -  ,     ; //  -   ObjGroup,     ; //  -  ,      //   ,     (  ,    //    ); // : //  ,       (  ) // ,       //  _(, , , =)   = ;  ( <> )  ( >= 0)  ( <> )   = _(, , );   =   //      -      _(, )  //     -      .ClassID = .ClassIDs.CLN_GROUP  //     1-  //     = 0;   < .()   = [];   .     =  + 1  ; //    = .(); . = ; . = 0; . = ; . = .GRName;  =   .ClassID = .ClassIDs.CLN_CARD  //        = .(); . = ; . = 1; . = ; . = .CDName;  =     //       _(, )  //       -     . = ;  .  . = .GRName  . = .CDName   //      (    )  = _(, , )   ;    //    ,   . // // : //  - ,    ; //  -   ObjGroup  ObjCard,    ; //  -  ,      //   ,     (  ,    //    ); // : //  ,        //      ,      //  _(, , =)   = ;  ( <> )  ( <> )   = _(, , );   <>    = .(); .();  = .();   > 0    <    = []   = [-1]    ;   
      
      







(, ) .



. ( ), , 2 (1- , 2- , , 1- – ). , , , . «». , , «» , «» . , .



FireBird.



, FireBird :

1. , , :

— «ADO.Connection» «ADO.Command» ;

— SQL- ( )

 //      FireBird _Driver = "driver={" + "Firebird/InterBase(r) driver" + "}"; _UID = "uid=" + FBUserName; _PWD = "pwd=" + FBUserPass; _DataBase = "database=" + FBDBAddr;  = _Driver + ";" + _UID + ";" + _PWD + ";" + _DataBase; //   .FBSrvConn =  COM("ADODB.Connection"); //   .FBSrvConn.open(); .IsDBConnect = ; //      .FBCommand =  COMObject("ADODB.Command"); .FBCommand.ActiveConnection = .FBSrvConn; .FBCommand.CommandType = ADO.CommandTypeEnum.adCmdText;
      
      





— – , ,

 //     .IsDBConnect = ; .LastTestTime = 0; .FBCommand = ;  .FBSrvConn <>    .FBSrvConn.State = ADO.ObjectStateEnum.adStateOpen  .FBSrvConn.Close() ; .FBSrvConn = ; 
      
      





2. .

. SQL-, . , , . , ( – ), , ( ) . , – 5. «_CheckRestConnect», .

3. :

— , , «ADO.Recordset», ;

— – (, /, ) (, 65535 ), BLOB- «ADO.Parameter»;

— «SELECT» «EXECUTE PROCEDURE» ( SQL-);

4. :

— , (CHAR, VARCHAR, BLOB(TEXT)) — ;

— , (BLOB(BINARY)) – ( 1 UTF-8). – , . , .

5. ( BLOB):

— ( BLOB(BINARY)-) ( ) COMSafeArray (, BLOB(TEXT) ). «» «COMSafeArray» ( ), . «» . «COMSafeArray», COM- «ADO.Stream».

6. BLOB- :

— , , « Parameters » « ADO.Command ». , , « :prm_name » ( ). ADO FireBird ( 
). – , . – ADO FireBird . , « ? » ( ). , , « Parameters ». ( ) — « ».



以䞊です。 皆さん、頑匵っおください。 じゃあね



PS

( 1 8.2 + ) .

FireBird 1.5 2.1. : FireBird, « script.sql » ( ).



All Articles