【发布时间】:2021-11-05 12:37:05
【问题描述】:
我需要一些帮助,结果字符串应该只是“这是一个测试”,但是当我执行写入输出时它也会返回一些其他服务器信息:
$conStringCor = "Server=SERVER; Initial Catalog=master;"
$corCred = New-Object System.Data.SqlClient.SqlCredential("user","pwd")
function GetScalarSQL($con_str, $cred, $cmd_text)
{
$result = [string]::Empty
$conn = New-Object System.Data.SqlClient.SqlConnection($con_str, $cred)
try
{
$conn.Open()
$tran = $conn.BeginTransaction()
$cmd = $conn.CreateCommand()
$cmd.Transaction = $tran
$cmd.CommandTimeout = 300
$cmd.CommandType = [System.Data.CommandType]::Text
$cmd.CommandText = $cmd_text
$dr = $cmd.ExecuteReader()
if ($dr.Read())
{
$result = ($dr.GetValue(0))
}
$dr.Close()
$dr.Dispose()
$cmd.Dispose()
$tran.Commit();
}
catch [Exception]
{
if($tran -ne $null){
$tran.Rollback();
}
throw $_.Exception
}
finally
{
$conn.Clone()
$conn.Dispose()
}
return $result
}
try
{
$updatesForDB = [string]::Empty
$updatesForDB = GetScalarSQL $connString $corCred "select 'this is a test' as [test]"
Write-Output $updatesForDB
}
catch [Exception]
{
#Do something with the exception
Write-Output $_.Exception.ToString()
#Write-Error "Job Failure" -EA Stop
Write-Error $_.Exception.ToString() -EA Stop
}
Write-Output $updatesForDB 的输出是:
StatisticsEnabled : 假 访问令牌: 连接字符串:服务器=XXXXX;初始目录=主; 连接超时:15 数据库:主 数据源:XXXXXX 数据包大小:8000 ClientConnectionId:00000000-0000-0000-0000-000000000000 服务器版本: 状态 : 关闭 工作站编号:XXXXXXX 凭证: FireInfoMessageEventOnUserErrors:假 地点 : 容器:
这是一个测试
谢谢,
【问题讨论】:
-
我建议将您未捕获的任何方法传递给
| Out-Null。例如$dr.Dispose() | Out-Null -
哦,我在函数中有 $conn.Clone() 而不是 $conn.Close() 更改此解决了问题,谢谢!
-
如果您需要参数,请小心使用这种方法,因为在 PowerShell 中很容易使用字符串插值来执行此操作,这是一种自然且几乎不可避免的诱惑——但这会导致各种问题SQL注入和转义。如果我可以让您对stealing a bit of ready-made code 感兴趣...请注意,如果您确实只需要一个值,
SqlCommand.ExecuteScalar()会明确处理您现在正在做的事情。 -
好点,谢谢!
标签: sql-server powershell