如何导入npgsql模块?

时间:2016-01-08 10:28:48

标签: postgresql powershell npgsql

我需要从PowerShell脚本中连接到PostgreSQL数据库。但是如何在没有VisualStudio的情况下安装npgsql?没有nuget!

所以我尝试使用最新的MSI文件(Npgsql-3.0.5.msi)在GAC中安装驱动程序。

使用gacutil.exe显示已安装:

  

Npgsql,Version = 3.0.5.0,Culture = neutral,PublicKeyToken = 5d8b90d52f46fda7,processorArchitecture = MSIL

但PowerShell对此一无所知! Get-Module -ListAvailable应该显示它,但是:

PS C:\WINDOWS\system32> (gmo -l n*).Name

NetAdapter  
NetConnection  
NetEventPacketCapture  
NetLbfo  
NetNat  
NetQos  
NetSecurity  
NetSwitchTeam  
NetTCPIP  
NetWNV  
NetworkConnectivityStatus  
NetworkLoadBalancingClusters  
NetworkTransition  
NFS  
PS C:\WINDOWS\system32> _

没有模块Npgsql

我正在搜索Npgsql.dll,它就在那里:

PS  C:\Windows\Microsoft.NET\assembly\GAC_MSIL\Npgsql\v4.0_3.0.5.0__5d8b90d52f46fda7> dir

Verzeichnis: C:\Windows\Microsoft.NET\assembly\GAC_MSIL\Npgsql\v4.0_3.0.5.0__5d8b90d52f46fda7


Mode                LastWriteTime     Length Name
----                -------------     ------ ----
-a---        08.01.2016     08:10     446464 Npgsql.dll


PS C:\Windows\Microsoft.NET\assembly\GAC_MSIL\Npgsql\v4.0_3.0.5.0__5d8b90d52f46fda7> _

由于未识别的模块npgsql,我的PowerShell代码无效:

function getDBConnection ($MyDBServer, $MyDBPort, $MyDatabase, $MyUid, $MyPwd) {
  $DBConnectionString = "Provider=PostgreSQL OLE DB Provider;Data Source=$MyDBServer;location=$MyDatabase;User ID=$MyUid;password=$MyPwd;timeout=1000;"
  $DBConn = New-Object System.Data.OleDb.OleDbConnection;
  $DBConn.ConnectionString = $DBConnectionString
  try {
    $DBConn.Open
  } catch {
    "Failed to connect! Error: "+ $_.Exception.Message
  }

  return $DBConn
}

function closeDBConnection ($DBConn) {
  $DBConn.Close
}

$query = "select * from test_table1"
$MyDBConnection = getDBConnection "dbserver" 5432 "databasename" "user" "pass"

try {
  $cmd = New-Object System.Data.OleDb.OleDbCommand($query, $MyDBConnection)
} catch {
  "Failed to create command object! Error: " + $_.Exception.Message
}
...

$DBConn.Open并未失败,但ConnectionState电话后Closed属性仍为Open

使用德语错误消息创建OleDbCommand实例崩溃:

  

创建命令对象失败!错误:Für“OleDbCommand”und die folgende Argumenteanzahl kannkeineÜberladunggefundenwerden:“2”。

这意味着没有带有两个参数的重载方法。

问题:

  • 我需要安装/配置什么才能在PowerShell中看到Npgsql
  • 如何在PowerShell脚本或模块中加载/导入Npgsql模块?

4 个答案:

答案 0 :(得分:3)

好的,解决了!这是解决方案:

将Windows 8.1与几个最高版本为4.5的.NET版本一起使用,我们可以使用Npgsql 3.0.5。

  1. 从npgsql网站下载Npgsql-3.0.5.msi并运行安装程序
  2. 搜索名为“Npgsql.ll”
  3. 的DLL
  4. 将此dll复制到您的本地项目目录(您有powershell脚本)
  5. 在脚本中使用Add-Type -Path“。\ Npgsql.dll”
  6. 加载DLL
  7. 现在你准备好了!
  8. 这里有一些示例代码,我连接到运行在远程CentOS服务器上的PostgreSQL服务器:

    Add-Type -Path ".\Npgsql.dll"
    
    function getDBConnection ($MyDBServer, $MyDBPort, $MyDatabase, $MyUid, $MyPwd) {
    $DBConnectionString = "server=$MyDBServer;port=$MyDBPort;user id=$MyUid;password=$MyPwd;database=$MyDatabase;pooling=false"
    $DBConn = New-Object Npgsql.NpgsqlConnection;
    $DBConn.ConnectionString = $DBConnectionString
    $DBConn.Open()
    
    return $DBConn
    }
    
    function closeDBConnection ($DBConn)
    {
        $DBConn.Close
    }
    
    $MyDBConnection = getDBConnection "db.mydomain.com" 5432 "databasename" "username" "password"
    $query = "SELECT * FROM test_table1;"
    $DBCmd = $MyDBConnection.CreateCommand()
    $DBCmd.CommandText = $query
    $adapter = New-Object -TypeName Npgsql.NpgsqlDataAdapter $DBCmd
    $dataset = New-Object -TypeName System.Data.DataSet
    $adapter.Fill($dataset)
    $dataset.Tables[0]
    closeDBConnection($MyDBConnection)
    .....
    

    npgsql似乎与System.Data.OleDb兼容。因此,technet.microsoft.com上的OleDb文档可以作为参考。

答案 1 :(得分:0)

如有疑问,请阅读documentationGet-Module -ListAvailable仅列出$env:PSModulePath中列出的目录中的模块。

  

<强> -ListAvailable

     

获取所有已安装的模块。 Get-Module 获取 PSModulePath 环境变量中列出的路径中的模块。如果没有此参数, Get-Module 将仅获取 PSModulePath 环境变量中列出的模块以及在当前会话中加载的模块。 ListAvailable 不会返回有关 PSModulePath 环境变量中找不到的模块的信息,即使这些模块已在当前会话中加载。

但是,您只需在脚本中导入任何带有完整路径的模块:

Import-Module 'C:\Windows\Microsoft.NET\assembly\GAC_MSIL\Npgsql\v4.0_3.0.5.0__5d8b90d52f46fda7\Npgsql.dll'

允许在路径中使用通配符:

Import-Module 'C:\Windows\Microsoft.NET\assembly\GAC_MSIL\Npgsql\*\Npgsql.dll'

如果您希望能够通过名称加载模块,请在Npgsql中列出的某个目录中创建子文件夹$env:PSModulePath,并将DLL放入该子文件夹中。

答案 2 :(得分:0)

可能有点晚了,但这是如何在Windows 10上的Powershell中包含Npgsql版本4.0.2的方法

  1. 使用以下命令注册软件包源NuGet: register-PackageSource-提供程序NuGet-名称nugetRepository-位置http://www.nuget.org/api/v2

  2. 在具有管理员权限的Powershell控制台中,输入以下命令: 查找包Npgsql |安装包 积极回答安全问题

  3.输入:

   获取软件包Npgsql

   您将看到新安装的软件包Npgsql /

答案 3 :(得分:0)

我不想安装MSI,并且很难从nuget软件包中添加Npgsql.dll。它具有来自其他程序集的依赖关系,我试图单独收集它们,但是在添加它们时遇到了不同类型的错误。

解决方案是在git hub上使用其回购来构建程序集。它适用于Win10,然后我就可以在Win 2012上使用相同的程序集。

克隆或下载/解压缩存储库: https://github.com/npgsql/npgsql

使用Visual Studio打开Npgsql.sln,然后构建/构建解决方案(可能会看到一些错误,请忽略)

然后将dll从repofolder \ npgsql \ src \ Npgsql \ bin \ Debug \ net452复制到您的PS项目中

然后使用下面的代码片段添加所有这些程序集:

$bin = "C:\folder\with\DLLs"

Add-Type -Path "$bin\Npgsql.dll" -ReferencedAssemblies "$bin\System.*.dll"

$str =  "Server=yourserver;Port=1521;Username=user;Password=pass;Database=somedb"

$conn = New-Object Npgsql.NpgsqlConnection $str 

$conn.Open()