これはここでの質問のフォローアップです
ctacke は、私が抱えていた/抱えている SQL Server CE 関連の「問題」について、次のように述べています。
「エラー テキストで示されている問題は、SDF ファイルが、アプリケーションが参照している SQL Compact のバージョンと一致しない SQL Compact のバージョンによって作成されたことです。報告されたバージョン番号には注目しません。 、不一致があることを認識しているという事実だけです。SDF のバージョンがわからない場合は、SDF ファイルから数バイトを読み取ることでいつでも検索できます。SQL Compact データベース ファイルは 100% 転送可能ではありません。 SDF を新しいバージョンから取得して、古いランタイム セットでロードすることは絶対にできません。データベースが 3.1 で作成されている場合は、SqlCeEngine.Upgrade() を呼び出して 3.5 にアップグレードできます。」
問題の .SDF ファイルがバージョン 2.0 であることがわかりました。
コードのどこかで「SqlCeEngine.Upgrade()」手法を使用する必要がありますか?
C++ セットアップ ユーティリティ コードに基づいて、両方のデバイス (3090 と 3190 ですが、現在 3190 のテストに取り組んでいます) に SQLCE 2 がインストールされている必要があります。
cabModule installMC3090[] = {{_T("ceremote.sa1100.CAB"),_T("Microsoft Remote Display Control"),IDR_CEREMDISP,true},
{_T("netcf.all.wce4.armv4.cab"),_T("Microsoft .NET Compact Framework"),IDR_NETCF,false},
{_T("OpenNETCF.SDF.WCE4.ARMV4.CAB"),_T("OpenNETCF SDF v1.4"),(DWORD)0,true},
{_T("sql.wce4.armv4.CAB"),_T("Microsoft SQL Client"),IDR_SQLCLIENT,false},
{_T("sqlce.dev.wce4.armv4.CAB"),_T("Microsoft SQLCE 2.0 Dev"),IDR_SQLCEDEV,false},
{_T("sqlce.wce4.armv4.CAB"),_T("Microsoft SQLCE 2.0"),IDR_SQLCE,false},
{_T("symbol.all.arm.cab"),_T("Symbol Managed Class Libraries"),IDR_SYMBOL,false},
{_T("System_SR_enu.cab"),_T("Microsoft .NET CF 1.0 ENU-String Resource"),IDR_NETRESOURCES,false},
{_T("HHS_WCE4.ARMV4.CAB"),_T("SSCS HHS"),IDR_HHS,false},
{_T("END"),_T("END"),(DWORD)0,false}
};
//MC3190 includes .NET 3.5 in the default configuration
cabModule installMC3190[] = {{_T("ceremote.sa1100.CAB"),_T("Microsoft Remote Display Control"),IDR_CEREMDISP,true},
{_T("OpenNETCF.SDF.WCE4.ARMV4.CAB"),_T("OpenNETCF SDF v1.4"),(DWORD)0,true},
{_T("sql.wce4.armv4.CAB"),_T("Microsoft SQL Client"),IDR_SQLCLIENT,false},
{_T("sqlce.dev.wce4.armv4.CAB"),_T("Microsoft SQLCE 2.0 Dev"),IDR_SQLCEDEV,false},
{_T("sqlce.wce4.armv4.CAB"),_T("Microsoft SQLCE 2.0"),IDR_SQLCE,false},
{_T("symbol.all.arm.cab"),_T("Symbol Managed Class Libraries"),IDR_SYMBOL,false},
{_T("NETCFv35.Messages.EN.cab"),_T("Microsoft .NET CF 3.5 EN-String Resource"),IDR_NETRESOURCES,true},
{_T("HHS_WCE4.ARMV4.CAB"),_T("SSCS HHS"),IDR_HHS,false},
{_T("END"),_T("END"),(DWORD)0,false}
};
....デバイスのどこにも「SQLCE」ファイルが見つかりませんが...
アップデート
SqlCeEngine をインスタンス化した後、Upgrade() への呼び出しを追加しました。
engine = new SqlCeEngine(conStr);
engine.Upgrade(conStr); // <= this is new
...そして、それは良いことだったかもしれません。なぜなら、今では err メッセージが別のものだからです:
場所:DBConnection.DBConnection
例外: ソース データベースに指定されたパスワードが正しくありません [データ ソース = \My Documents\HHSDB.SDF]
内部例外: [空白]
TypeFullName : System.Data.SqlServerCe.SqlCeException
StackTrace : ProcessResults、修復...
ここで Update 4 の状態と比較してください(現在はパスワードの問題です。以前は Sql Ce バージョンの不一致の問題のようでした)。
さて、レガシー コード (以前は機能していた) はパスワードを追加していないようです。パスワードは通常どのように「追加」されますか (この時点では、パスワードがどうあるべきかさえわかりません)。パスワードを期待しないようにする方法はありますか?
DBConnection のインスタンス化コードを次に示します。これにより、これが明らかになる場合があります。
public class DBConnection
{
public string filename = HHSUtils.GetDataPath() + "HHSDB.SDF";
SqlCeConnection objCon = null;
SqlCeEngine engine;
private DBConnection()
{
try
{
// Connection String
//string conStr = "Data Source = " + filename; <== this is the legacy, but failing for some reason (see https://stackoverflow.com/questions/23438579/in-what-format-does-sqlceconnection-expect-its-connection-string-arg/23438672)
//string conStr = string.Concat("Data Source = ", Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "HHSDB.SDF"));
filename = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Personal), "HHSDB.SDF");
string conStr = string.Concat("Data Source = ", filename);
engine = new SqlCeEngine(conStr);
engine.Upgrade(conStr);
以前使用されていた GetDataPath() は、filename への代入によって呼び出されますが、filename が上書きされるため意味がありません。単純に次のとおりです。
public static string GetDataPath()
{
return @"\My Documents\";
}
更新 2
これは私の問題を解決するのに十分ですか?単に「Persist Security Info=False;」を接続文字列に追加するだけです:
Data Source=MyData.sdf;Persist Security Info=False;
? IOW、「パスワードを忘れて、私はパスワードに依存していない」という言い方を追加していますか?
上記の例 (ここから) では、「ソース」と「=」の間、および「=」と SDF ファイルへのパスの間にスペースがないことにも気付きました。これは重要ではありませんか (私が推測しているように、IOW、どちらの方法でも機能するはずです)。
おそらくもっと重要なのは、私の接続文字列が "Data Source = \My Documents" という文字列で始まっているのに対し、この接続文字列はそうではありません。重要?
その同じサイトによると、パスワードが必要な場合は、次のようになると思います。
Data Source=MyData.sdf;Encrypt Database=True;Password=myPassword;
File Mode=shared read;Persist Security Info=False;
...また...???
更新 3
Altho ctacke は、キャブのインストールは実際には関連性がないと言っています。完全性のために/後世のために、デバイスのセットアップがどのように異なるかについていくつかのメモを追加しています。
アスタリスクでマークされた cab ファイルは、他のデバイスのインストールとは異なります
3090は、セットアップ ユーティリティを介してインストールされた 8 つのキャブを取得します。
HHS_WCE4.ARMV4.CAB
*netcf.all.wce4.armv4.cab
OpenNETCF.SDF.WCE4.ARMV4.CAB
sql.wce4.armv4.CAB
sqlce.dev.wce4.armv4.CAB
sqlce.wce4.armv4.CAB
symbol.all.arm.cab
*System_SR_enu.cab
3190は、セットアップ ユーティリティを介してインストールされた 8 つのキャビネットを取得します (セットアップ ユーティリティのコメントには、「MC3190 にはデフォルト構成に .NET 3.5 が含まれています」と書かれています)。
*ceremote.sa1100.CAB
HHS_WCE4.ARMV4.CAB
*NETCFv35.Messages.EN.cab
OpenNETCF.SDF.WCE4.ARMV4.CAB
sql.wce4.armv4.CAB
sqlce.dev.wce4.armv4.CAB
sqlce.wce4.armv4.CAB
symbol.all.arm.cab
だから:
3090 には次の特徴があります。
netcf.all.wce4.armv4.cab
System_SR_enu.cab
3190 には次の特徴があります。
ceremote.sa1100.CAB
NETCFv35.Messages.EN.cab
どちらも次のようにアップグレードされます。
HHS_WCE4.ARMV4.CAB
symbol.all.arm.cab
(これらの「アップグレード キャブ」がそれぞれのインストール リストに単純に追加されないのはなぜですか。わかりません。「アップグレード」オプションはありますか?)
更新 4
ctacke の最新のコメントに触発されて (挑発され、突っ込まれ)、自分のアプリにある SQL CE リファレンスを詳しく調べました。
System.Data is runtime 2.0.0.0 and Version the same (2.0.0.0)
System.Data is from C:\Program Files (x86)\Microsoft.NET\SDK\CompactFramework\v2.0\WindowsCE\System.Data.dll
System.Data.SqlClient is runtime version v2.0.50727 and Version 3.0.3600.0
System.Data.SqlClient is from C:\Program Files (x86)\Microsoft SQL Server Compact Edition\v3.5\Devices\Client\System.Data.SqlClient.dll
System.Data.SqlServerCe is runtime version v2.0.50727 and Version 3.5.1.0
System.Data.SqlServerCe is from C:\Program Files (x86)\Microsoft SQL Server Compact Edition\v3.5\Devices\System.Data.SqlServerCe.dll
たぶん、この魔女の醸造物は、少なくとも私の問題と関係があります.
更新 5
だから、きっとこれはフランケンシュタインとドラキュラの交配だと思いました。これらの関連ファイルはすべて同じ場所に存在する必要があります。それで、私はそれらすべてを見て、これを見つけました:
C:\Program Files (x86)\Microsoft.NET\SDK\CompactFramework\v2.0\WindowsCE
System.Data.dll == 2/14/2007
System.Data.SqlClient.dll == [not there]
System.Data.SqlServerCe.dll == [not there]
C:\Program Files (x86)\Microsoft SQL Server Compact Edition\v3.5\Devices\Client
System.Data.dll == [not there]
System.Data.SqlClient.dll == 7/3/2007
System.Data.SqlServerCe.dll == [not there]
C:\Program Files (x86)\Microsoft SQL Server Compact Edition\v3.5\Devices
System.Data.dll == [not there]
System.Data.SqlClient.dll == [not there]
System.Data.SqlServerCe.dll == 2/12/2010
そうじゃないって言って!これは本当に現状ですか? このファイルはここから、あのファイルはあそこから取得する必要がありますか?
更新 6
ctacke からのこのコメントに応えて:
"参照している SQL CE のバージョンは、デバイス上のバージョンとリビジョンまで一致する必要があります。それが何であるべきかはわかりませんが、同じでなければならず、作成されたマイナー バージョンまで一致する必要があります。データベースファイル"
デバイスに SqlServerCe.dll がまったく表示されません。次の DLL を含む "Computer\Clay's Device\\Program Files\Microsoft SQL Server Compact Edition\v3.5" という名前のフォルダーがあります。
sqlceca35.dll
sqlcecompact35.dll
sqlceer35EN.dll
sqlceme35.dll
sqlceoledb35.dll
sqlceqp35.dll
sqlcese35.dll
(すべて 2010 年 2 月 12 日作成)
デバイスには、2002 年 8 月 16 日と 2002 年 8 月 28 日のファイルを含む "Computer\Clay's Device\\Windows\SQLCE 2.0" というフォルダーもあります。
ssce20.dll
ssceca.dll
ssceerror20en.dll
ssceerror20jp.dll
最後の 2 つはエラー メッセージを表示するためのものだと思います。最後の 1 つは日本語用だと思います。日本人の顧客はいないと思います (もちろん、日本語にローカライズされたバージョンのアプリはありません)。困惑の。
したがって、ハンドヘルド デバイスには SqlServerCe.dll がまったく存在しないため、バージョン間の競合は発生しません。
更新 7
Update 5 のフォローアップとして、完全を期すために (最初の 2 つの DLL ファイルは「興味がない」可能性があります):
ハード ドライブ全体を検索して、次の 3 つのファイルを探しました。
System.Data.dllは、上記の場所に加えて、次の場所で見つかりました。
C:\Program Files (x86)\Microsoft Visual Studio .NET 2003\CompactFrameworkSDK\v1.0.5000\WindowsCE
Creation Date = 11/24/2002; Size = 403KB
C:\Program Files (x86)\Microsoft.NET\SDK\CompactFramework\v2.0\Debugger\BCL
Creation Date = 2/14/2007; Size = 696KB
C:\Program Files (x86)\Microsoft.NET\SDK\CompactFramework\v3.5\Debugger\BCL
Creation Date = 10/10/2007; Size = 710KB
C:\Program Files (x86)\Microsoft.NET\SDK\CompactFramework\v3.5\WindowsCE
Creation Date = 10/10/2007; Size = 124KB
System.Data.SqlClient.dllは、上記以外にもいくつかの場所で見つかりましたが、次の点を除いてサイズはすべて同じです。
C:\Program Files (x86)\Microsoft Visual Studio .NET 2003\CompactFrameworkSDK\v1.0.5000\WindowsCE
where it is 148KB (creation date of 9/24/2002)
System.Data.SqlServerCe.dllは、上記の場所 (C:\Program Files (x86)\Microsoft SQL Server Compact Edition\v3.5\Devices) のほかに、次の場所で見つかりました。
C:\Program Files (x86)\Microsoft Visual Studio .NET 2003\CompactFrameworkSDv1.0.50000\WindowsCE
9/24/2002; 124KB
C:\Program Files (x86)\Microsoft SQL Server Compact Edition\v3.1
12/22/2006; 236KB
また、
C:\Program Files (x86)\Microsoft SQL Server Compact Edition\v3.5\Desktop
C:\Program Files (x86)\Microsoft SQL Server Compact Edition\v3.5\Private
C:\Program Files (x86)\Microsoft SQL Server Compact Edition\v4.0\Desktop
C:\Program Files (x86)\Microsoft SQL Server Compact Edition\v4.0\Private
-および(上記と同じですが、「(x86)」のないProgram Filesフォルダーにあります):
C:\Program Files\Microsoft SQL Server Compact Edition\v3.5\Desktop
C:\Program Files\Microsoft SQL Server Compact Edition\v3.5\Private
C:\Program Files\Microsoft SQL Server Compact Edition\v4.0\Desktop
C:\Program Files\Microsoft SQL Server Compact Edition\v4.0\Private