1

3回目の編集:

次の 2 つのスクリプトの唯一の違い (関数の名前を除く) は、2 番目のスクリプトが明示的な return を介して結果を返さないという事実です。しかし、彼らは異なった振る舞いをします。最初は2行を示しています

abc
efg

グリッド内で、2 番目はグリッド内の空の行を示しています。

スクリプト 1:

ipmo WPK

$ConnectionString = $ConnectionString = "Server=localhost;Integrated Security=True"
$conn = new-object System.Data.SQLClient.SQLConnection
$conn.ConnectionString = $ConnectionString 
$conn.Open() 

function Invoke-sql1
{
    param( [string]$sql,
           [System.Data.SQLClient.SQLConnection]$connection
           )
    $cmd = new-object System.Data.SQLClient.SQLCommand($sql,$connection)
    $ds = New-Object system.Data.DataSet
    $da = New-Object System.Data.SQLClient.SQLDataAdapter($cmd)
    $da.fill($ds) | Out-Null
    return $ds.tables[0]
}

function Show-Bockmarks ($conn) {
        New-ListView -Name ListView -View {
           New-GridView -AllowsColumnReorder -Columns {
               New-GridViewColumn "title" 
           }
    } -show -On_Loaded {
            $ff_sql = @"
SELECT 'abc' title
UNION
SELECT 'efg' title
"@
            $TableView = $window | Get-ChildControl ListView
            $TableView.ItemsSource = @(Invoke-sql1 -sql $ff_sql -connection $conn)
             } 
}

Show-Bockmarks $conn

スクリプト 2:

ipmo WPK

$ConnectionString = $ConnectionString = "Server=localhost;Integrated Security=True"
$conn = new-object System.Data.SQLClient.SQLConnection
$conn.ConnectionString = $ConnectionString 
$conn.Open() 

function Invoke-sql2
{
    param( [string]$sql,
           [System.Data.SQLClient.SQLConnection]$connection
           )
    $cmd = new-object System.Data.SQLClient.SQLCommand($sql,$connection)
    $ds = New-Object system.Data.DataSet
    $da = New-Object System.Data.SQLClient.SQLDataAdapter($cmd)
    $da.fill($ds) | Out-Null
    $ds.tables[0]
}

function Show-Bockmarks ($conn) {
        New-ListView -Name ListView -View {
           New-GridView -AllowsColumnReorder -Columns {
               New-GridViewColumn "title" 
           }
    } -show -On_Loaded {
            $ff_sql = @"
SELECT 'abc' title
UNION
SELECT 'efg' title
"@
            $TableView = $window | Get-ChildControl ListView
            $TableView.ItemsSource = @(Invoke-sql2 -sql $ff_sql -connection $conn)
             } 
}

Show-Bockmarks $conn

最初のスクリプトはグリッドに 2 行を表示し、2 番目のスクリプトはグリッドに空の行を表示します。2番目はこれと同様に動作するようです

関数を使用しない 3 番目のスクリプト:

ipmo WPK

$ConnectionString = $ConnectionString = "Server=localhost;Integrated Security=True"
$conn = new-object System.Data.SQLClient.SQLConnection
$conn.ConnectionString = $ConnectionString 
$conn.Open() 

            $ff_sql = @"
SELECT 'abc' title
UNION
SELECT 'efg' title
"@

function Show-Bockmarks ($conn) {
        New-ListView -Name ListView -View {
           New-GridView -AllowsColumnReorder -Columns {
               New-GridViewColumn "title" 
           }
    } -show -On_Loaded {
        $TableView = $window | Get-ChildControl ListView
        $cmd = new-object System.Data.SQLClient.SQLCommand($ff_sql,$conn)
        $ds = New-Object system.Data.DataSet
        $da = New-Object System.Data.SQLClient.SQLDataAdapter($cmd)
        $da.fill($ds) | Out-Null
        $TableView.ItemsSource = @($ds.tables[0].rows)
    } 
}

Show-Bockmarks $conn

ここで関数を使用しないことに注意してください。明示的に $ds.tables[0] .rowsを使用する必要があります。そうしないと、エラーが発生します

Exception setting "ItemsSource": "Cannot convert the "Table" 
value of type "System.Data.DataTable" 
to type "System.Collections.IEnumerable"."

PowerShell 関数はオブジェクトを返さないため、これが返されない関数と同様に動作する理由を説明できます。しかし、リターンはどのようにして 2 つの行をグリッドに表示するのでしょうか?

元の投稿:

関数 Invoke-sqlite と Invoke-sqlite1 はほぼ同じです。

唯一の違いは、Invoke-sqlite が明示的な return を使用することです。私が実行すると、違いは非常に微妙です

$o1   =  Invoke-sqlite $sql $conn
$o2   =  Invoke-sqlite2 $sql $conn

違いがわかりません。ただし、以下のスクリプトの完全なコンテキストでは、Invoke-sqlite を使用するとグリッドにデータが入力され、Invoke-sqlite を使用するとグリッドに空の行が入力されます。

ところで: スクリプトの目的は、Firefox の places.sqlite 履歴データベースのコピーを検索して、1 ~ 3 個のキーワードの組み合わせでブックマークを検索することです。dll 行 5 のパスと sqlite データベース行 8 のパスを変更する必要があります。

System.Data.SQLite.dll に問題がある場合は、これを参照してください

ipmo WPK

if (! $sqlitedll)
{
    $sqlitedll = [System.Reflection.Assembly]::LoadFrom("C:\Program Files\System.Data.SQLite\bin\System.Data.SQLite.dll") 
}

$ConnectionString = "Data Source=C:\Var\sqlite_ff4\places.sqlite"

$conn = new-object System.Data.SQLite.SQLiteConnection 
$conn.ConnectionString = $ConnectionString 
$conn.Open() 

# $sql = "SELECT * from moz_bookmarks t1 where parent = 4 and t1.title = 'sqlite' or t1.title = 'sql'"

function Invoke-sqlite
{
    param( [string]$sql,
           [System.Data.SQLite.SQLiteConnection]$connection
           )
    $cmd = new-object System.Data.SQLite.SQLiteCommand($sql,$connection)
    $ds = New-Object system.Data.DataSet
    $da = New-Object System.Data.SQLite.SQLiteDataAdapter($cmd)
    $da.fill($ds) | Out-Null
    return $ds.tables[0]
}

function Invoke-sqlite2
{
    param( [string]$sql,
           [System.Data.SQLite.SQLiteConnection]$connection
           )
    $cmd = new-object System.Data.SQLite.SQLiteCommand($sql,$connection)
    $ds = New-Object system.Data.DataSet
    $da = New-Object System.Data.SQLite.SQLiteDataAdapter($cmd)
    $da.fill($ds) | Out-Null
    $ds.tables[0]
}

# $o1   =  Invoke-sqlite $sql $conn
# $o2   =  Invoke-sqlite2 $sql $conn


function Show-Bockmarks ($resource) {
    #New-StackPanel -Orientation vertical {
    New-Grid -Rows 2 -Columns 1 -width 1400 -hight 1000 {

        New-StackPanel -Orientation horizontal -column 0 -row 0 -Children {
             New-Label    '1. Keyword'
             New-TextBox  -Name tag1 -width 200
             New-Label    '2. Keyword'
             New-TextBox  -Name tag2 -width 200
             New-Label    '3. Keyword'
             New-TextBox  -Name tag3 -width 200
             New-Button -Name Search "search" -On_Click {
            $text1 = $window | Get-ChildControl Tag1
            $tag1 = $text1.Text
            $text2 = $window | Get-ChildControl Tag2
            $tag2 = $text2.Text
            $text3 = $window | Get-ChildControl Tag3
            $tag3 = $text3.Text
            if ( $tag2 -ne '') {
$clause2 = @"            
    join moz_bookmarks l2 on b.fk = l2.fk and b.id <> l2.id
    join moz_bookmarks t2 on l2.parent = t2.id and  t2.parent = 4 and upper(t2.title) = upper('$tag2')
"@                        
            } else { $clause2 = '' }        

            if ( $tag3 -ne '') {
$clause3 = @"            
    join moz_bookmarks l3 on b.fk = l3.fk and b.id <> l3.id
    join moz_bookmarks t3 on l3.parent = t3.id and  t3.parent = 4 and upper(t3.title) = upper('$tag3')
"@                        
            } else { $clause3 = '' }        

$ff_sql = @"
SELECT b.title, datetime (b.dateAdded / 1000000, 'unixepoch', 'localtime') dateAdded , p.url
    from moz_bookmarks b
    join moz_bookmarks l1 on b.fk = l1.fk and b.id <> l1.id
    join moz_bookmarks t1 on l1.parent = t1.id and  t1.parent = 4 and upper(t1.title) = upper('$tag1')
    join moz_places p  on b.fk = p.id $clause2 $clause3
where b.title is not null and b.type = 1
"@
#             $query = $window | Get-ChildControl query
#             $query.text = $ff_sql
            $conn = $resource.conn
            $window.Title = "$($conn.database) Database Browser"
            $TableView = $window | Get-ChildControl TableView
            $TableView.ItemsSource = Invoke-sqlite -sql $ff_sql -connection $conn
             } 
#             New-textbox -Name query 
             New-Button -Name Cancel "Close" -On_Click {$window.Close()} 
        }
        # -VerticalScrollBar $True 
        # New-ScrollViewer {
        New-ListView -Column 0 -Row 1 -Name TableView -View {
           New-GridView -AllowsColumnReorder -Columns {
               New-GridViewColumn "title" 
               New-GridViewColumn "dateAdded" 
               New-GridViewColumn "url" 
           }
        }   -On_SelectionChanged {
             start $this.selecteditem.url
        }
        #}

    } -asjob -Resource $resource
}

Show-Bockmarks -resource @{conn = $conn}
4

1 に答える 1

0

助けるために、私はSQLClientの上に同じことを書きました、そしてそれはうまくいくようです。

function func1
{
  param( [string]$sql,
         [System.Data.SQLClient.SQLConnection]$connection
     )


  $cmd = new-object System.Data.SQLClient.SQLCommand($sql,$conn)
  $ds = New-Object system.Data.DataSet
  $da = New-Object System.Data.SQLClient.SQLDataAdapter($cmd)
  $da.fill($ds) | Out-Null

  $ds.Tables[0]
}

function func2
{
  param( [string]$sql,
       [System.Data.SQLClient.SQLConnection]$connection
     )


  $cmd = new-object System.Data.SQLClient.SQLCommand($sql,$conn)
  $ds = New-Object system.Data.DataSet
  $da = New-Object System.Data.SQLClient.SQLDataAdapter($cmd)
  $da.fill($ds) | Out-Null

  return $ds.Tables[0]
}

Clear-Host

$sqldll = [reflection.assembly]::loadwithpartialname("System.Data.SqlClient")
$connectionString="Data Source=JPBHPP2\SQLEXPRESS;Initial Catalog=Ardeche-Earth;Integrated Security=True"

$conn = new-object System.Data.SQLClient.SQLConnection 
$sql = "SELECT * FROM communes WHERE COM_NCC LIKE 'AURI%'"
$conn.ConnectionString = $ConnectionString 
$conn.Open() 

$a = func1 -sql $sql -connection $conn
$b = func2 -sql $sql -connection $conn

Write-Host "`$a : $($a.count)"
Write-Host "`$b : $($b.count)"

$conn.Close() 

$aと$bはSystem.Data.DataRow、最後に同じ配列を保持します

于 2011-04-27T03:43:37.297 に答える