Gee*_*eth 7 sql powershell ado.net executereader
我正在尝试从PowerShell脚本中读取SQL表中的数据.我可以在reader对象中看到数据,但是在使用While (readerobject.read()){}
它时,它不会进入循环内部.
Powershell:
$cmd = $sqlConn.CreateCommand()
$cmd.CommandText ="SELECT * from user"
$movedUserDetails = $cmd.ExecuteReader()
while ($movedUserDetails.Read())
{
"[0] : " + $movedUserDetails.GetValue(0)
}
$movedUserDetails.Close()
Run Code Online (Sandbox Code Playgroud)
语法是正确的,但是在循环中你没有对值做任何事情.你会想以某种方式坚持下去.下面是在PowerShell中运行一些基本SQL的示例,它有两种不同类型的命令(Text/SP)和两种不同的执行方法(DataAdapter/DataReader).每个中的任何一个都应该正常工作.
# config
$svr = "serverName"
$db = "databaseName"
# connection
$sqlConnection = New-Object System.Data.SqlClient.SqlConnection
$sqlConnection.ConnectionString = "Server=$svr;Database=$db;Integrated Security=True"
$sqlConnection.Open()
# command A - text
$sqlCmd = New-Object System.Data.SqlClient.SqlCommand
$sqlCmd.Connection = $sqlConnection
$sqlCmd.CommandText = "SELECT name AS TABLE_NAME FROM sys.tables"
# command B - stored procedure
$sqlCmd = New-Object System.Data.SqlClient.SqlCommand
$sqlCmd.Connection = $sqlConnection
$sqlCmd.CommandText = "sys.sp_tables"
$sqlCmd.CommandType = [System.Data.CommandType]::StoredProcedure
$sqlCmd.Parameters.Add("@table_owner", "dbo")
# execute A - data reader
$reader = $sqlCmd.ExecuteReader()
$tables = @()
while ($reader.Read()) {
$tables += $reader["TABLE_NAME"]
}
$reader.Close()
# execute B - data adapter
$dataTable = New-Object System.Data.DataTable
$sqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter
$sqlAdapter.SelectCommand = $sqlCmd
$sqlAdapter.Fill($dataTable)
$sqlConnection.Close()
Run Code Online (Sandbox Code Playgroud)
下面的答案是但已经过时了。您现在应该使用Invoke-Sqlcmd。
Invoke-Sqlcmd -Query $sqlStatement -ConnectionString $ConnectionString;
Run Code Online (Sandbox Code Playgroud)
您可能需要执行 aInstall-Module -Name SqlServer
才能安装它。
如果您不想安装该SqlServer
模块或者您的 Powershell 版本为 2 或更低,您可以尝试使用SqlDataAdapter
. 我制作了这个 Powershell 模块来使用 SQL 获取记录。它从来没有让我失望过
function Invoke-SqlSelect
{
[CmdletBinding()]
Param
(
[ValidateNotNullOrEmpty()]
[Parameter(ValueFromPipeline=$True,Mandatory=$True)]
[string] $SqlServer,
[Parameter(ValueFromPipeline=$True,Mandatory=$False)]
[string] $Database = "master",
[ValidateNotNullOrEmpty()]
[Parameter(ValueFromPipeline=$True,Mandatory=$True)]
[string] $SqlStatement
)
$ErrorActionPreference = "Stop"
$sqlConnection = New-Object System.Data.SqlClient.SqlConnection
$sqlConnection.ConnectionString = "Server=$SqlServer;Database=$Database;Integrated Security=True"
$sqlCmd = New-Object System.Data.SqlClient.SqlCommand
$sqlCmd.CommandText = $SqlStatement
$sqlCmd.Connection = $sqlConnection
$sqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter
$sqlAdapter.SelectCommand = $sqlCmd
$dataTable = New-Object System.Data.DataTable
try
{
$sqlConnection.Open()
$sqlOutput = $sqlAdapter.Fill($dataTable)
Write-Output -Verbose $sqlOutput
$sqlConnection.Close()
$sqlConnection.Dispose()
}
catch
{
Write-Output -Verbose "Error executing SQL on database [$Database] on server [$SqlServer]. Statement: `r`n$SqlStatement"
return $null
}
if ($dataTable) { return ,$dataTable } else { return $null }
}
Run Code Online (Sandbox Code Playgroud)