2013-06-27 41 views
0

在Visual Studio中,我可以简单地添加对程序集的引用,例如:Interop.ADODB。Powershell脚本中的引用程序集

如何在PowerShell中执行此操作?以下是爆炸

[Reflection.Assembly]::LoadWithPartialName("Interop.ADODB") 

$conn = New-Object ADODB.Connection 

这里是在Windows 7 X64的错误消息

New-Object : Constructor not found. Cannot find an appropriate constructor for type ADODB.Connection. 
At C:\Users\michaelr\Desktop\jet-project\PS\test.ps1:3 char:19 
+ $conn = New-Object <<<< ADODB.Connection 
    + CategoryInfo   : ObjectNotFound: (:) [New-Object], PSArgumentException 
    + FullyQualifiedErrorId : CannotFindAppropriateCtor,Microsoft.PowerShell.Commands.NewObjectCommand 

我。

+0

请包括PowerShell的给你回的错误消息。另外,你使用的是什么版本的Windows(包括32/64位)和PowerShell? – Goyuix

+0

你想连接什么?根据数据源,更好的选择可能是使用本机.net提供程序而不是adodb COM。 –

+0

我从.mdb文件(JET DB)中提取'Jet OLEDB:Engine Type'属性,这不能用本机.net提供程序完成。 – Fred

回答

2

使用此行:

$conn = New-Object -comobject ADODB.Connection 

Powershell的理解COM对象本身(以及它可能的范围内的对象不总是有很多的元数据),并完成所有的互操作为您服务。你只需要告诉powershell它是一个COM对象。你不需要明确地引用互操作程序集。

话虽如此,根据您的任务,您可能会更好使用本机.net提供程序,而不是ADODB。

Cannot find an appropriate constructor for type ADODB.Connection

您需要连接字符串传递给构造函数是这样的::

+0

谢谢,这似乎已经解决了这个问题。我现在遇到了另一个问题,我在调用中使用以下内容打开:“Provider = Microsoft.Jet.OLEDB.4.0; Data Source = C:/ Users/bubba/Desktop/jet-project/Access 2000 Database.mdb“,但是它会回传一个关于提供程序未找到的错误。我有一个小的C#项目成功地完成了同样的事情。 – Fred

+0

并解释为什么我使用ADODB,这是因为我试图访问属性集合,而不是从较新的解决方案中公开。 – Fred

+0

我想出了这个问题,Microsoft.Jet.OLEDB.4.0提供程序仅在32位上下文中可用。现在我已经修复了这个问题,它的效果非常好:) – Fred

0

您正在寻找可让您将.NET代码编译到内存中的程序集或从磁盘加载程序集的cmdlet的Add-Type cmdlet。

如果您想要从GAC加载程序集,请参阅-AssemblyName参数,如果您确切知道要加载的DLL的位置,请参阅-Path参数。

+0

行:'添加类型-AssemblyName Interop.ADODB.dll'导致'无法找到'错误。 – Fred

+0

如果您从GAC加载程序集,则需要使用其强名称,而不是其文件名。例如,您可以使用“Add-Type -AssemblyName ADODB”从GAC加载该DLL。 以下是试图解释Add-Type和基于GAC的程序集如何工作的页面:http://www.sqlservercentral.com/blogs/kyle-neier/2012/06/06/powershell-add-type-wheres- that-assembly/ 这就是说,我忘了考虑是否可以通过COM访问ADODB,因为它可以,Zespri的答案可能是这个特定实例的最佳答案。 – mikekol

0

答案在你的眼前

$c = new-object ADODB.connection "server=foo;user id=bar ..."

不过,我不明白为什么要在.NET中使用1998年代的ADODB,而您可以改用System.Data。看看这个MSDN文章访问数据库使用PowerShell:

http://technet.microsoft.com/en-us/magazine/hh855069.aspx

+0

明显的猜测是我会以'新时代的工具不允许我这样做的方式与'1998年代'的数据进行交互。 – Fred

相关问题