コードに存在しないデータベーステーブルを作成する

.net sql sqlite vb6
コードに存在しないデータベーステーブルを作成する

これまで、私の会社はデータベースに対する嫌悪感を抱いており、すべてのデータをコンマ区切りファイルに保存することにこだわっていました。 リレーショナルデータベースを使用することでメリットが得られると思われるユニークな顧客アプリケーションに遭遇しました。 アプリケーションは、製造プロセスに関する「要約」データと複数のサブプロセスでの「詳細」データの保存を要求します。 サブプロセスはプロセス概要にリンクする必要があります。

私の質問:このテーブルに書き込む前にテーブルの存在をチェックし、テーブルが存在しない場合はテーブルを作成することは正常/適切ですか? 私はこれを入力しているので、これはより大きな質問につながる可能性があります。データベースが存在しない場合、データベースと必要なテーブルを作成する必要がありますか?

  3  0


ベストアンサー

いいえ、コードでテーブルを作成するのは普通ではありません。 リレーショナルデータベースが必要な場合は、使用する前に設計する必要があります。 リレーショナルデータベースは軽視されません。

以前にこれをやったことがない場合、ここに主題の紹介があります…​ http://www.databasedev.co.uk/design_basics.html

(これらすべてを知っていればごめんなさい。私はひいきにするつもりはない。)

3


SQLiteでは、テーブルを自分で作成するのが良い方法です。 顧客のインストール手順を以前よりも複雑にする必要はありません。また、データベースがアプリケーションの内部に完全にある場合、顧客はおそらく、どの形式であるかさえ気にしません。ソフトウェアは信頼性が高く高速です。

たとえば、Firefoxは最近、内部ストレージにSQLiteを使用していますが、ユーザーがデータベースを作成することはありません。 そして、ユーザーはそれを気に入っています。 🙂

ただし、テーブルを参照する直前にデータベースを作成することについてあまり心配する必要はありません。代わりに、アプリケーションの起動時またはインストール時に適切な方に作成ロジックを配置します。 CSVファイルは現在、アプリケーションのどこに作成されていますか? それらは参照されるたびに新しく作成されますか? または、初期化またはインストールルーチンでも作成されますか?

3


通常、テーブルが存在しないということは、どこかに問題があることを意味します。 動的に作成されたテーブルは、通常、何らかの問題の兆候であり、標準テーブル(tblUsersなど)である場合は、セットアッププロセスの一部としてセットアップされて常に存在する必要があります。

存在の確認が理にかなっていると思うことができるのは、コード開発である程度の距離があり、データベースをアップグレードして余分なテーブルを追加し、コードをこの新しいデザインと古いデザインで動作させたい場合です。 この場合、使用する前にテーブルの存在を確認することは理にかなっています。

一般的には、データベースにどのテーブルが存在するかを知っておく必要があります。したがって、テーブルの存在を確認する必要はありません。 そして、なぜあなたは存在しないデータベースにアクセスしようとしているのかについて完全に失われています…​ 新しいクライアント(または同様のクライアント)をその場で追加し、そのデータベースを作成できる、ある種の遅延セットアッププロセスについて考えていますか? もしそうなら、私はそれらの新しいデータベースを作成してセットアップする単一のプロセスを持っているでしょう。

2


SubSonic SimpleRepository一般に、このタイプの状況は非常によく処理されます(外部キー関係を除く)。

通常、私はコードでデータベースやテーブルを作成および保守しない傾向があります。これはあなたの顔に爆発する傾向があるからです。

1


sqliteには、まさにこのタイプのコンテキストに対して「存在しない場合はテーブルを作成する」構文があります。 (http://www.sqlite.org/lang_createtable.htmlを確認してください)ほとんどのライブラリには、接続時に新しいsqliteデータベースファイルがまだ存在しない場合に作成するオプションもあります。

1


アプリケーションを作成する前に、データの構造を知っておく必要があります。

可能な限り、データとアプリケーションを分離してください。

また、データアクセスレイヤーを使用すると、たとえばWindowsアプリケーションが既にあり、Webフロントエンドを作成する場合、DALを簡単に再利用できます。

データアクセスがアプリケーション内に埋め込まれている場合、そのコードを再利用することははるかに困難です。

1


リレーショナルデータベースを使用すると、データを簡単に共有できます。

データを共有する必要がないときにファイルを使用できます。

データセットのシリアル化は、ファイルに情報を保存するのに適したオプションです。 リレーショナルデータベースのように構造化されたデータを維持します。

Xmlシリアル化は低速ですが、BinaryFormatterを次のように使用できます。

RemotingFormat = SerializationFormat.Binary

このオプションは、高速でコンパクトなバイナリシリアル化を行います。

Code-Projectには「Fast Serialization」記事が含まれています。 しかし、これは標準ではありません。

0


答えは、プロジェクトの性質によって異なります。

これが単一インスタンスの社内システムである場合、開発時間を節約し、ソフトウェアの更新時に新しいテーブルでデータベースを手動で更新するのが妥当です。 その場合、ソフトウェアでテーブルを追加する必要はありません。

このソフトウェアを顧客または組織内のリモートサイトに提供し、インストールとアップグレードを「現場で」行う場合、ソフトウェアの新しいバージョンごとにデータベースをアップグレードするのが妥当です。 必ずしも各SQLコマンドの前にこのチェックを行う必要はなく、ソフトウェアの実行ごとに行う必要はありません。 「データ構造のバージョン番号」をデータベースのどこかに保存し、起動時にその番号を確認し、番号が現在のリリースを下回っている場合にのみ構造の更新を適用できます。

0


多くのRDBMSはDDL SQLステートメントをサポートしています。 ADOXは一部のデータベースで使用して、新しいテーブルの作成などを行うことができます。 特に、プログラムが内部データストアとして、または出力フォーマットとして、ある種の「埋め込み」ファイルベースのデータベースを使用している場合、これは特にエキゾチックではないと思います。

インデックス、制約、リレーションなどの作成に問題はありません。 必要に応じて。 例:

Private Const WG_CONNSTRING As String = _
      "Provider=Microsoft.Jet.OLEDB.4.0;Jet OLEDB:Engine Type=5;" _
    & "Jet OLEDB:Create System Database=True;" _
    & "Data Source='$MDB$.mdw'"
Private Const DB_CONNSTRING As String = _
      "Provider=Microsoft.Jet.OLEDB.4.0;Jet OLEDB:Engine Type=5;" _
    & "Jet OLEDB:System Database='$MDB$.mdw';" _
    & "Data Source='$MDB$.mdb'"

'Exits with new MDB created, populated from initial data
'in text files, and cnDB left open.

Dim catDB As Object 'Don't early-bind ADOX objects.

Set catDB = CreateObject("ADOX.Catalog")
catDB.Create Replace$(WG_CONNSTRING, "$MDB$", MDB_NAME)
catDB.Create Replace$(DB_CONNSTRING, "$MDB$", MDB_NAME)

Set cnDB = catDB.ActiveConnection
With cnDB
    .Execute "CREATE TABLE Fruits (" _
           & "FruitID IDENTITY NOT NULL CONSTRAINT PK_FruitID PRIMARY KEY," _
           & "Fruit TEXT(50) WITH COMPRESSION NOT NULL UNIQUE" _
           & ")", _
             , adCmdText
    .Execute "CREATE TABLE Pies (" _
           & "PieID IDENTITY NOT NULL CONSTRAINT PK_PieID PRIMARY KEY," _
           & "Pie TEXT(50) WITH COMPRESSION NOT NULL," _
           & "FruitID INTEGER NOT NULL CONSTRAINT FK_FruitID " _
           & "REFERENCES Fruits (FruitID)" _
           & ")", _
             , adCmdText
    .Execute "CREATE VIEW PiesView (ID, Pie, Fruit) AS " _
           & "SELECT PieID AS ID, Pie, Fruit " _
           & "FROM Pies LEFT OUTER JOIN Fruits " _
           & "ON Pies.FruitID = Fruits.FruitID", _
             , adCmdText
    .Execute "CREATE PROC InsertPie(NewPie TEXT(50), FruitName TEXT(50)) AS " _
           & "INSERT INTO Pies (Pie, FruitId) " _
           & "SELECT NewPie, Fruits.FruitId FROM Fruits " _
           & "WHERE Fruit = FruitName", _
             , adCmdText
End With

0


タイトルとURLをコピーしました