我需要从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”。
这意味着没有带有两个参数的重载方法。
问题:
Npgsql
?Npgsql
模块?答案 0 :(得分:3)
好的,解决了!这是解决方案:
将Windows 8.1与几个最高版本为4.5的.NET版本一起使用,我们可以使用Npgsql 3.0.5。
这里有一些示例代码,我连接到运行在远程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)
如有疑问,请阅读documentation。 Get-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的方法
使用以下命令注册软件包源NuGet: register-PackageSource-提供程序NuGet-名称nugetRepository-位置http://www.nuget.org/api/v2
在具有管理员权限的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()