如何导入npgsql模块?

How to import the npgsql module?

我需要从 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> <b>(gmo -l n*).Name</b>

网络适​​配器
网络连接
NetEventPacketCapture
网络资料
NetNat
网络服务质量
网络安全
NetSwitch团队
网络TCPIP
网络WNV
网络连接状态
网络负载均衡集群
网络过渡
网络文件系统
PSC:\WINDOWS\system32>_

没有模块Npgsql!

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

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

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


模式 LastWriteTime 长度 名称
---- -------------- ------ ----
-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 没有失败,但 属性 ConnectionStateOpen 调用后仍然 Closed

OleDbCommand 实例的创建崩溃并显示德语错误消息:

Failed to create command object! Error: Für "OleDbCommand" und die folgende Argumenteanzahl kann keine Überladung gefunden werden: "2".

表示不存在带两个参数的重载方法

问题:

如有疑问,请阅读 documentation. Get-Module -ListAvailable only lists modules from the directories listed in $env:PSModulePath

-ListAvailable

Gets all installed modules. Get-Module gets modules in paths listed in the PSModulePath environment variable. Without this parameter, Get-Module gets only the modules that are both listed in the PSModulePath environment variable, and that are loaded in the current session. ListAvailable does not return information about modules that are not found in the PSModulePath environment variable, even if those modules are loaded in the current session.

但是,您可以简单地在脚本中导入带有完整路径的任何模块:

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'

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

好的,解决了!解决方法在这里:

使用 Windows 8.1 和几个 .NET 版本,直到版本 4.5,我们可以使用 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. 现在你可以开始了!

这里是我连接到远程 CentOS 服务器上的 PostgreSQL 服务器 运行ning 的一些示例代码:

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文档可以作为参考。

它可能有点晚了,但这里是如何在 Windows 10

上将 Npgsql 版本 4.0.2 包含在 powershell 中
  1. 注册包源 NuGet: 注册-PackageSource -provider NuGet -name nugetRepository -location http://www.nuget.org/api/v2

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

3. 输入:

获取包 Npgsql

你会看到新安装的包 Npgsql /

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

解决方案是使用 git 集线器上的存储库构建程序集。它适用于 Win10,然后我能够在 win 2012 上使用相同的程序集。

克隆或download/unzip 回购: https://github.com/npgsql/npgsql

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

然后将 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()