Должен ли я вызывать «SqlCeEngine.Upgrade ()», когда файл SDF и устройство, по-видимому, имеют одинаковую версию (2)?

Это продолжение вопросаВот

ctacke сказал там о «проблемах», связанных с SQL Server CE, которые у меня были / есть:

"Проблема, как указано в тексте ошибки, заключается в том, что файл SDF был создан в версии SQL Compact, которая не соответствует версии SQL Compact, на которую ссылается приложение. Я бы не стал акцентировать внимание на сообщаемых номерах версий, просто на том факте, что он знает, что существует несоответствие Если вы не знаете версию SDF, вы всегда можете найти ее, прочитав несколько байтов из файла SDF. Файлы базы данных SQL Compact не переносимы на 100%. Вы определенно не можете взять SDF из более новой версии и загрузить его со старым набором сред выполнения. Если база данных была создана с 3.1, вы можете обновить ее до 3.5, вызвав SqlCeEngine.Upgrade ()."

теперь я знаю что рассматриваемый файл .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" на устройстве ...

ОБНОВИТЬ

Я добавил вызов Upgrade () после создания экземпляра SqlCeEngine:

engine = new SqlCeEngine(conStr);
engine.Upgrade(conStr); // <= this is new

... и это, возможно, было бы хорошо, потому что теперь сообщение об ошибке ...

место нахождения: DBConnection.DBConnection

исключение: Неверный пароль для исходной базы данных [Источник данных = \ Мои документы \ HHSDB.SDF]

Внутреннее исключение: [пусто]

TypeFullName: System.Data.SqlServerCe.SqlCeException

Трассировки стека: ProcessResults, Ремонт ...

Сравните это с тем, что было в обновлении 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 (), который вызывается присваиванием имени файла, но теперь является спорным, потому что имя файла перезаписано, просто:

public static string GetDataPath()
{
    return @"\My Documents\";
}
ОБНОВЛЕНИЕ 2

Этого достаточно, чтобы решить мою проблему, просто добавитьPersist Security Info = False;«к строке подключения, а-ля:

Data Source=MyData.sdf;Persist Security Info=False;

? IOW, добавляет ли это способ сказать: «забудьте о паролях, я не полагаюсь на них»?

Я также заметил, что в примере выше (изВот) не имеет пробелов между "Source" и "=" и между "=" и путем к файлу SDF. Это неважно (как я подозреваю - IOW, так или иначе должен работать)?

Возможно, еще важнее то, что моя строка подключения начинается со сбоя («Источник данных = \ Мои документы»), а эта - нет. Значительное?

Согласно тому же сайту, если яделать нужен пароль, я считаю, что это было бы так:

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 на устройстве вообще; есть папка с именем «Компьютер \ Clay's Device \\ Program Files \ Microsoft SQL Server Compact Edition \ v3.5», в которой находятся следующие библиотеки DLL:

sqlceca35.dll
sqlcecompact35.dll
sqlceer35EN.dll
sqlceme35.dll
sqlceoledb35.dll
sqlceqp35.dll
sqlcese35.dll

(все создано 12.02.2010)

На устройстве также есть папка «Computer \ Clay's Device \\ Windows \ SQLCE 2.0», в которой находятся файлы от 16.08.2002 и 28.08.2002:

ssce20.dll
ssceca.dll
ssceerror20en.dll
ssceerror20jp.dll

Я предполагаю, что последние два предназначены для отображения сообщений об ошибках, и я предполагаю, что последнее предназначено для японцев, и я не думаю, что у нас есть какие-либо японские клиенты (и, конечно, нет локализованной версии приложения на японском языке), так что это своего рода сбить с толку.

Таким образом, на портативном устройстве вообще нет SqlServerCe.dll, поэтому конфликт между версиями невозможен - разве SqlServerCe.dll существует где-то, но невидим?

ОБНОВЛЕНИЕ 7

В качестве дополнения к обновлению 5 и для полноты картины (первые два DLL-файла могут быть «неинтересными»):

Я искал весь мой жесткий диск для трех файлов:

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

-и в (то же, что и выше, но в папке Program Files без "(x86)"):

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

Ответы на вопрос(0)

Ваш ответ на вопрос