【问题标题】:global variable where variable has members变量有成员的全局变量
【发布时间】:2016-06-30 17:15:28
【问题描述】:

我想在 PowerShell 函数中打开 Microsoft Access DB。我会将连接变量存储在主代码中。

这是代码:

Function open_database($dbname) {
  # Open the database
  try
  {
    $global:conn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=$dbname;Persist Security Info=False"
    $global:conn.Open()
  }
  catch
  {
    write-host "Error connecting to the database " + $dbname
    return $false
  }
  return $true
}

# M A I N
$conn = New-Object System.Data.OleDb.OleDbConnection
if (-Not (open_database("C:\temp\mydb.mdb"))) {exit}

我收到此错误消息:

连接数据库时出错 + C:\temp\mydb.mdb
在此对象上找不到属性“ConnectionString”。验证该属性是否存在并且可以设置。

我该如何解决这个问题?

我认为 PowerShell 将 globalconn 关联,而不是全局与 conn.ConnectionString 关联。

【问题讨论】:

  • 但是你问题中的代码没有给出那个错误?我手边没有访问数据库,但它不会出错,它运行时没有任何抱怨。如果我可以将测试代码放在评论中,它应该 - function test { $global:c.x=4 }; $c=@{x=2}; $c; test; $c 访问全局属性确实有效。
  • 出于调试目的,我会尝试省略所有 Try_Catch 结构。使用Try 块的裸inner,然后使用return $false 来查看可能的错误的完整说明$global:conn 是否按预期定义? $conn = … #mainscript 范围内定义。 OLEDB 提供商是否已注册? …

标签: powershell global-variables


【解决方案1】:

我目前没有可用的 Access,但在嵌套上下文中修改全局变量无论如何都是一个有缺陷的概念。最好在函数中创建连接并让它返回连接对象或抛出异常:

function open_database($dbname) {
  $cn = New-Object System.Data.OleDb.OleDbConnection
  $cn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;" +
                         "Data Source=$dbname;" +
                         "Persist Security Info=False"
  $cn.Open() | Out-Null
  return $cn
}

try {
  $conn = open_database 'C:\temp\mydb.mdb'
} catch {
  Write-Host "Error connecting to the database $dbname"
  exit 1
}

这样你就不会混合上下文,而且你只做一次错误处理。

【讨论】:

    猜你喜欢
    • 2015-10-21
    • 2023-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-22
    • 2017-01-23
    • 2014-11-17
    • 2021-10-22
    相关资源
    最近更新 更多