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は、このノードがツリーの「ルート」に含まれることを意味します。 ルート自体はデータベースに保存されません(常にプログラム内にあります-変​​更できません)。
GRNAMEVARCHAR(255)ツリーノードの名前。 これらの値(テーブル内)の一意性は、1Cリファレンスブックのように監視されません。

-テーブル「CARDS」-ディレクトリ要素のストレージ-連絡先データのあるカード。
フィールド名データ型説明
CDID整数テーブル内のレコード識別子はカード識別子です(すべての値> 0)。
グリッド整数親ツリーノードの識別子(GROUPS.GRIDへのリンク)。 したがって、カードとツリーの接続が確立されます。 値0は、このカードがツリーの「ルート」に含まれることを意味します(ただし、GROUPSテーブルにGRID = 0のエントリはありません)。
GRNAMEVARCHAR(255)カードの名前。 これらの値(テーブル内)の一意性は、1Cリファレンスブックのように監視されません。
CDDESCRIPTVARCHAR(255)説明カードのフィールド。
CDお問い合わせBLOB(TEXT-1)連絡先情報。 実際、MEMOタイプの形式のテキストフィールドは可変長の大きなテキストであり、メインテーブルとは別に保存されます。 エンコーディング(CHARやVARCHARなど)を使用した自動作業のすべてのルールが適用されます。
CdnoteBLOB(バイナリ-0)注。 実際、テキストフィールドですが、バイナリBLOBとして記述されています。 これを行うべきではありませんが、データベースの形式は私たちによって選択されないことが多いため、このオプションは非常に可能です。 この例は、データベースがテキストであることを認識していない場合にテキスト(エンコード)を処理する方法を示します。
CDIMAGEBLOB(バイナリ-0)これは、カードに添付された画像が保存される場所です。 実際、対応するグラフィックファイルと同じものが含まれています。

-テーブル「USERS」-情報システムの資格情報。
フィールド名データ型説明
UID整数テーブル内のエントリのID。
UNAMEVARCHAR(255)ユーザーアカウントの名前(ログイン)。 プログラムは、このフィールドの一意性(テーブル内)を制御します(大文字と小文字を区別しません-つまり、「admin」ユーザーがいる場合、「AdMiN」アカウントを作成できません)。
UPWDVARCHAR(255)ユーザーパスワード(クリアテキストで保存されます。これは、FireBirdの新しいバージョンではmd5関数が存在せず、1Cでのこのアルゴリズムの実装も膨大であるためです。
ライツVARCHAR(255)ユーザー権限-文字「0」および「1」の文字列。対応する位置にあり、対応するユーザー権限の不在(「0」)または存在(「1」)を示します。
このバージョンでは、次のユーザー権限が使用されます。
-position 1-データを表示する機能。
-位置2-データを編集する機能。
-position 3-ユーザーのリストを編集する機能(管理)

また、次のストアドプロシージャがデータベースに配置されます。
手続き名パラメータ名パラメータタイプ説明
SAVE_GROUPこの手順では、グループをデータベースに保存(追加または更新)します。
入力パラメーター:
グリッド整数保存されたグループの識別子(グループが以前に保存されていない場合は0)
PGRID整数親グループID
GRNAMEVARCHAR(255)グループ名
出力パラメーター:
結果整数保存された場合、保存されたグループの識別子。
0-グループが保存されなかった場合
ERRMSGVARCHAR(255)エラーが発生した場合のエラーメッセージテキスト(RESULT = 0)
DELETE_GROUPこの手順により、データベースからグループが削除されます。
入力パラメーター:
グリッド整数削除するグループID
出力パラメーター:
結果整数削除された場合、削除されたグループのID。
0-グループが削除されていない場合
ERRMSGVARCHAR(255)エラーが発生した場合のエラーメッセージテキスト(RESULT = 0)
MOVE_GROUP_TO_GROUPこの手順は、指定されたグループとその内容全体(サブグループとネストされたカード)を別の指定されたグループに転送します。
入力パラメーター:
SRC_GRID整数移行するグループID
DST_GRID整数ソースグループの転送先グループのID
出力パラメーター:
結果整数グループID(SRC_GRID)(移行された場合)。
0-グループ転送が行われなかった場合(転送されなかった場合)
ERRMSGVARCHAR(255)エラーが発生した場合のエラーメッセージテキスト(RESULT = 0)
MOVE_GROUP_CONTENTS_TO_GROUPこの手順は、指定されたグループ(サブグループとネストされたカード)の内容を別の指定されたグループに転送します。 この場合、元のグループ自体は同じ場所に残ります。
入力パラメーター:
SRC_GRID整数コンテンツを転送するグループのID
DST_GRID整数グループのコンテンツを転送するグループのID
出力パラメーター:
結果整数内容が移行された場合、グループ識別子(SRC_GRID)。
0-グループコンテンツの転送が行われなかった場合
ERRMSGVARCHAR(255)エラーが発生した場合のエラーメッセージテキスト(RESULT = 0)
MOVE_CARD_TO_GROUP手順は、指定されたグループにカードを転送します。
入力パラメーター:
SRC_CDID整数譲渡するカードのID
DST_GRID整数カードの転送先グループのID
出力パラメーター:
結果整数カードID(SRC_CDID)、転送された場合;
0-カードの転送が行われなかった場合(転送されなかった場合)
ERRMSGVARCHAR(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 » ( ).

Source: https://habr.com/ru/post/J278583/


All Articles