在Windows 7x64上使用PowerShell中的SQLite?

时间:2010-12-29 08:32:26

标签: sqlite powershell windows-7-x64

我在Windows 7 x64中尝试从PowerShell加载System.Data.SQLite.dll时遇到了困难。

# 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 程序集的连接会导致:

  

用“0”调用“打开”的异常   论点:“有人试图这样做   加载程序不正确   格式。 (HRESULT的例外情况:   0x8007000B)“

尝试加载 x86 程序集导致:

  

使用“1”参数调用“LoadFrom”的异常:“无法加载文件或程序集   'file:/// C:\ projects \ PSScripts \ lib \ System.Data.SQLite.DLL'或其依赖项之一。一个   尝试加载格式不正确的程序。“

有什么想法或想法吗?

3 个答案:

答案 0 :(得分:4)

您的x64二进制文件可能已损坏吗?我可以使用下面的代码在新下载的system.data.sqlite.dll副本上成功使用add-type,并且我可以实例化所有相关对象。我也能够无错误地打开数据库,并成功执行查询。尝试使用这种技术(基本上,使用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的文件中,并将其放在module path中的某个位置。然后将您have downloaded的两个System.Data.SQLite.dll放入子文件夹中,每个文件夹位于正确的文件夹(x86或x64)中。然后,在PowerShell中,键入:

Import-Module sqlite

然后实际加载程序集:

Add-SqliteAssembly

现在,你的初始代码(减去来自东西的负载)应该有效。

答案 1 :(得分:3)

您需要确保System.Data.SQLite.dll对于位(32或64)和.Net版本都是正确的。 对于Win 7 x64,默认安装的.Net为3.5。即使您已安装4.0(或更高版本)客户端,Powershell也将使用.Net 3.5。如果你跳过其他环节(在别处讨论过),你可以在Powershell中使用.NET 4.0。

从以下位置下载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 ++版本的引用。该项目是最新的。本文撰写时的版本是2012年1月28日的1.0.79.0。不幸的是,该软件包没有附带帮助文件。有用的 SQLite.Net.chm 文件位于docs \文件夹中的单独包中。

提取zip后(无需安装或注册表黑客攻击),使用以下命令将您的powershell脚本指向dll:

添加类型-Path“< drive>< path> \ System.Data.SQLite.dll”

例:
    Add-Type -Path“C:\ sql \ sqliteFx35x64 \ System.Data.SQLite.dll”

其他测试代码应该可以正常工作

答案 2 :(得分:0)

我会尝试在应用程序主目录(YourApp.exe.config目录中powershell.exe.config创建powershell.exe文件,如果它是PowerShell,请注意x86的位置不同, 64):

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

如果没有帮助,请仔细检查是否正确安装了所有SQLite DLL。请参阅手册(我自己对SQLite ADO .NET提供程序了解不多)。