
こんにちは。
この資料は、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でのこれらのクラスの対応する実装は次のようになります。
データベースを操作します。 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データ型の完全な説明を以下に示します。
データベースを操作します。 1Cのサブプログラム。
複数のデータベースを持つユーザーの便宜のために、「
接続プロファイル 」が提供されます。 データベースに関連するパラメータのグループ。1つの名前の下に統合されています。 ほとんどの場合、これらはDBMSに接続するためのパラメーター(データベースサーバーアドレス、データベース名、DBMSレベルでデータベースに接続するためのユーザー名とパスワード)ですが、他のパラメーターを追加することもできます
プロファイルを操作するには、メイン処理モジュールの「
KBaseの接続プロファイル 」および「
KBaseの接続プロファイル 」、およびプロファイルを編集するためのダイアログを実装する「
接続プロファイルのフォーム設定 」
フォームのクラスがあります。 これはすべてデモで見ることができます。 この機能の範囲は、DBMS上の外部データベースにアクセスするためのプログラムです。
データベースを操作するためのメインクラスは、ConnectKBaseクラスです。 データベースへの接続と切断、およびクエリの実行が可能です。
また、便利な補助ツールはクラス「
リクエストパラメータのセット 」です。 このセットにより、SQLクエリのテキストにさまざまな値を簡単に埋め込むことができます。 クエリテンプレートを準備し、名前付きの値(パラメーター)をセットに追加してから、特定のクエリ値を挿入する場所に関する指示を含むクエリテキストテンプレートを処理します。 セットはリクエストテンプレートを処理し、特定の値をそれに代入して、リクエストの最終テキストを受け取ります。 クエリテンプレートでは、パラメータ値の置換の場所は次のように示され
ます。parameter_name (コロン、次にパラメータ名-これはDelphiで行われます)。
次に例を示します。
= _(); ...
このメカニズム(クエリテンプレート)の使用の詳細については、
PodBase_SelectGroup関数から始まる
PodBaseクラスのサブルーチンのデモを参照してください。
パラメータのセットは値のタイプを分析し(「未定義」、「数値」、「文字列」、「日付」、「ブール」を理解します)、指定されたDBMSに正しい構文でクエリの値を置き換えます。
「
RequestParameter Set 」クラスのソースコード:
それでは、最後に、データベースを操作する主なクラスである「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). (, ..) ;
— , ( ).
. , .
:
—
( , ) – «_Disconnect», «_UnregisterUser» .
« »
«
ADODB.Command », «
ADODB.Connection » ( TCP) ;
:
—
– «_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 » .
:
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
BLOB(BINARY) () — «CARDS.CDIMAGE». , «
» «
COMSafeArray ». «
COMSafeArray » «
». «
» , «», «
BASE64 » «
Base64 » «
Base64 ». ( ) : «
COMSafeArray »«
»«
»«
». «
Base64 » «
Base64 ».
, :
Base64 Base64 COMSafeArray_ _COMSafeArray
, «
Base64 » «
Base64 » , . – ( + «
» (.. , .. «
» ), «
»). , « » «
COMSafeArray »«
» «
「。ファイルに保存してファイルからダウンロードするために、インターネットからの推奨に従ってADO.Stream COMオブジェクトも使用しました。その結果、変換はほぼ瞬時に実行されます。コードは次のとおりです。 COMSafeArray_ _COMSafeArray
プログラムインターフェイスに関する注意。
データモデルの状態とその表示インターフェイスの一貫性を確保することが重要です。 つまり - , , . , , . 1 , . ( ), . , , «» . , ( ), . , ( ).
, , «
» «
» , .. . – , « », .
:
(, ) .
. ( ), , 2 (1- , 2- , , 1- – ). , , , . «». , , «» , «» . , .
FireBird.
, FireBird :
1. , , :
— «ADO.Connection» «ADO.Command» ;
— SQL- ( )
— – , ,
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 » ( ).