2020年4月9日木曜日

VB .mdf File の Version に翻弄される日々

長い間、アプリをメンテしていると遭遇する問題 ... 。
ソースやデータ構造を弄らなくても、
或る日突然、襲い掛かる .mdf File の整合性 。
はい。  そのバージョンに翻弄されるのですね。


LocalDB で生成維持される .mdf ファイルのバージョンに翻弄される日々 ... 。
はい。  実は、ノート PC を入れ替えました。
その環境整備の過程で、
既存の他の(古い)環境と合わせるべく、
LocalDB Instance も整えた訳ですが、
思わぬ 落とし穴 ... !。

こんな Message と ご対面! です。
VS2013 En 版ですので 英語 です。


The database 'C:\USERS\USERA\DOCUMENTS\XXX\YYY.MDF' cannot be opened because it is version 852. This server supports version 706 and earlier. A downgrade path is not supported.

Could not open new database ':\USERS\USERA\DOCUMENTS\XXX\YYY.MDF'. CREATE DATABASE is aborted.

An attempt to attach an auto-named database for file C:\Users\UserA\Documents\XXX\YYY.mdf failed. A database with the same name exists, or specified file cannot be opened, or it is located on UNC share.


何と!、ファイルバージョンが上がって仕舞い、
作ったアプリがエラーで落ちています。  正確には、落ちませんが、使えません。.

原因は 別環境下で編集した .mdf File と勘繰っています。
そう、.mdf は、あっちに行ったり、こっちに来たり、を繰り返す事が多いので ... 。

からくり は ... こんな経緯と推測しています。

Visual Studio では、
SQL Server LocalDB の Default Instance として、
(LocalDB)\MSSQLLocalDB が充てられています (?) 。
これは 各 VS に既定のバージョンの SQL Server が使われます (?) 。
でも、後日、新たな Instance が生成されれば、
其処では、この日付に応じた .mdf となる仕組みの様です。

参考:
   https://docs.microsoft.com/ja-jp/visualstudio/data-tools/upgrade-dot-mdf-files?view=vs-2019

  抜粋

サーバー名:

    既定のバージョンを使用する場合は (localdb)\MSSQLLocalDB。 これにより、インストールされている Visual Studio のバージョンと最初の LocalDB インスタンスが作成された日時に応じて、ProjectV12 または ProjectV13 のいずれかが指定されます。 SQL Server オブジェクトエクスプローラーの MSSQLLocalDBノードには、ポイントしているバージョンが表示されます。

    特定のバージョンを使用する場合: (localdb)\ProjectsV12 または (localdb)\ProjectsV13。 V12 は LocalDB 2014 で、V13 は LocalDB 2016 です。


つまり、各自の最新環境に Solutions/Projects を移行していれば、
問題は生じないのですが、
古い VS の場合、
扱う .mdf を別環境で再生成すれば、
そのファイルを投げ入れられたケースで、不整合が生じるのです。

今迄、
古い VS で作ったもののメンテナンスは、
古い VS で行って来ました。

Instance を VS の影響を受けない、
v11.0 や ProjectsV12 や ProjectsV13 にしていれば、
各 SQL Server で固有なのでしょうが、
MSSQLLocalDB は、導入された VS の世代に応じて、可変な訳です。
でも、多くの Projects でこの Instance が使われています。


その対応策で、一番簡便なのは、
Solutions/Projects の 引っ越し だと思います。
常に、最新環境下に置く事で、
扱う .mdf File の 世代 の影響から逃れる事が可能になります。

無論、各 SQL Server 固有の Instance を 各 Projects で指定する方法もありますが、
必ずしも、VS Install の段階で、自動生成はしてくれませんから。.

LocalDB を使う Solutions/Projects は VS 最新環境下で! が無難です。



0 件のコメント:

コメントを投稿