Private/Invoke-SqliteCrudReader.ps1

function Invoke-SqliteCrudReader {
    <#
    .SYNOPSIS
        Runs a generated SELECT statement and emits PowerShell objects.
    .DESCRIPTION
        Executes a parameterized reader query, scrubs database nulls, and disposes temporary ADO.NET objects.
    .PARAMETER Connection
        Open SQLite connection used for the query.
    .PARAMETER Query
        Generated SELECT statement.
    .PARAMETER Parameters
        Parameter names and values to bind.
    .PARAMETER QueryTimeout
        Command timeout in seconds.
    #>

    [CmdletBinding()]
    param(
        [Parameter(Mandatory)]
        [System.Data.SQLite.SQLiteConnection]$Connection,

        [Parameter(Mandatory)]
        [string]$Query,

        [System.Collections.IDictionary]$Parameters,

        [int]$QueryTimeout = 600
    )

    $command = $Connection.CreateCommand()
    $adapter = $null
    $dataSet = New-Object System.Data.DataSet
    try {
        $command.CommandText = $Query
        $command.CommandTimeout = $QueryTimeout
        Add-SqliteCrudParameterSet -Command $command -Parameters $Parameters
        $adapter = New-Object System.Data.SQLite.SQLiteDataAdapter($command)
        [void]$adapter.Fill($dataSet)
        if ($dataSet.Tables.Count -gt 0) {
            foreach ($row in $dataSet.Tables[0].Rows) {
                [DevSetup.Core.SQLite.DBNullScrubber]::DataRowToPSObject($row)
            }
        }
    } finally {
        if ($null -ne $adapter) {
            $adapter.Dispose()
        }
        $command.Dispose()
        $dataSet.Dispose()
    }
}