Используете SQLite из PowerShell в Windows 7x64? - PullRequest
4 голосов
/ 29 декабря 2010

У меня возникают трудности при попытке загрузить System.Data.SQLite.dll из PowerShell в Windows 7 x64.

# x64
[void][System.Reflection.Assembly]::LoadFrom("C:\projects\PSScripts\lib\System.Data.SQLite.x64.DLL")
# x86
#[void][System.Reflection.Assembly]::LoadFrom("C:\projects\PSScripts\lib\System.Data.SQLite.DLL")

$conn = New-Object -TypeName System.Data.SQLite.SQLiteConnection
$conn.ConnectionString = "Data Source=C:\temp\PSData.db"
$conn.Open()
$command = $conn.CreateCommand()
$command.CommandText = "select DATETIME('NOW') as now, 'Bar' as Foo"
$adapter = New-Object -TypeName System.Data.SQLite.SQLiteDataAdapter $command
$dataset = New-Object System.Data.DataSet
[void]$adapter.Fill($dataset)

Пытается открыть соединение с x64 сборка приводит к:

Исключение, вызывающее "Open" с аргументом (ами) "0": "Была сделана попытка загрузить программу с неверным форматом. (Исключение из HRESULT: 0x8007000B)"

Попытка загрузить сборку x86 приводит к:

Исключительная ситуация, вызывающая "LoadFrom" с аргументом (ами) "1": "Не удалось загрузитьфайл или сборка 'file: /// C: \ projects \ PSScripts \ lib \ System.Data.SQLite.DLL' или одна из ее зависимостей. Была предпринята попытка загрузить программу с неверным форматом. "

Есть мысли или идеи?

Ответы [ 3 ]

4 голосов
/ 30 декабря 2010

Возможно ли, что ваш бинарный файл x64 поврежден? Я могу успешно использовать add-type для только что загруженной копии system.data.sqlite.dll, используя приведенный ниже код, и я могу создать экземпляр всех связанных объектов. Я также могу открыть базу данных без ошибок и успешно выполнить запрос. Попробуйте эту технику (по сути, используя Add-Type вместо LoadFrom) с вашей БД, и дайте мне знать.

Пример кода для модуля SQLite PowerShell:

function Add-SqliteAssembly {
    # determine bitness (32 vs. 64) of current PowerShell session
    # I'm assuming bitness = system architecture here, which won't work on IA64, but who cares
    switch ( [intptr]::Size ) {
        4   { $binarch = 'x86' }
        8   { $binarch = 'x64' }
    }
    $modPath = $MyInvocation.MyCommand.Module.ModuleBase
    $SQLiteBinName = 'System.Data.SQLite.dll'
    $SQLiteBinPath = "$modPath\$binarch\$SQLiteBinName"
    Add-Type -Path $SQLiteBinPath 
}

Чтобы использовать этот модуль, сохраните его в файл с именем sqlite.psm1 и поместите его где-нибудь в путь к модулю . Затем поместите два файла System.Data.SQLite.dll, которые вы загрузили , в подпапки, каждая в соответствующую папку (x86 или x64). Затем в PowerShell введите:

Import-Module sqlite

А потом фактически загрузить сборку:

Add-SqliteAssembly

Теперь ваш исходный код (без нагрузки на вещи) должен работать.

3 голосов
/ 23 марта 2012

Вы должны убедиться, что System.Data.SQLite.dll подходит как для битовой (32 или 64), так и для .Net версии.Для Win 7 x64 по умолчанию установлен .Net 3,5.Powershell будет использовать .Net 3.5, даже если вы установили клиенты 4.0 (или выше).Вы можете использовать .NET 4.0 в Powershell, если перепрыгиваете через другие обручи (обсуждается в другом месте).

Загрузите пакет ADO SQLite из:
http://system.data.sqlite.org/index.html/doc/trunk/www/downloads.wiki

Найдите Прекомпилированные двоичные файлыдля 64-битной Windows (.NET Framework 3.5 sp1) .Выберите соответствующий zip-архив (с или без среды выполнения VC ++).Не позволяйте 2008 (или 2010) в имени файла обмануть вас.Это ссылка на версию VC ++, используемую для компиляции.Проект актуален.Версия на момент написания статьи 1.0.79.0 от 28 января 2012 года. К сожалению, файл справки не входит в этот пакет.Полезный файл SQLite.Net.chm находится в отдельном пакете source в папке docs \.

После распаковки zip (не требует установки или взлома реестра)), укажите сценарий powershell на dll, используя:

Add-Type -Path " \ System.Data.SQLite.dll"

Пример:
Добавить-Тип -Path "C: \ sql \ sqliteFx35x64 \ System.Data.SQLite.dll"

Остальная часть вашего тестового кода должна работать

0 голосов
/ 29 декабря 2010

Я бы попытался создать файл YourApp.exe.config в домашнем каталоге приложения (powershell.exe.config в каталоге powershell.exe, если это PowerShell, помните, что расположение для x86 и x64 отличается):

<?xml version="1.0"?>
<configuration>
 <runtime>
  <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
   <probing privatePath="C:\projects\PSScripts\lib"/>
  </assemblyBinding>
 </runtime>
</configuration>

Если это не поможет, то дважды проверьте правильность установки всех библиотек SQLite.См. Руководство (я не знаю много о провайдере SQLite ADO .NET).

...