0

PowerShell で MySQL INSERT ステートメントを実行した後、最後に挿入された ID を返そうとしています。私のINSERTは正常に機能し、データは期待どおりにデータベースに挿入されます。私が抱えている問題は、挿入されたばかりの行の ID を取得することです。

私のコードは以下です:

./MySQL.ps1 -Query "insert into table (field1,field2,field3,field4) values ('$val1','$val2','$val3','$val4')"
$last_id = ./MySQL.ps1 -Query "SELECT LAST_INSERT_ID()"
Write-Host "Last ID: $last_id"

戻り値:

Last ID: System.Data.DataRow

MySQL.ps1:

Param(
  [Parameter(
    Mandatory = $true,
    ParameterSetName = '',
    ValueFromPipeline = $true)]
  [string]$Query
)

$MySQLAdminUserName = 'root'
$MySQLAdminPassword = 'password'
$MySQLDatabase = 'storage_manager'
$MySQLHost = 'localhost'
$ConnectionString = "server=" + $MySQLHost + ";port=3306;uid=" +
                    $MySQLAdminUserName + ";pwd=" + $MySQLAdminPassword +
                    ";database=" + $MySQLDatabase

try {
  [void][System.Reflection.Assembly]::LoadWithPartialName("MySql.Data")
  $Connection = New-Object MySql.Data.MySqlClient.MySqlConnection
  $Connection.ConnectionString = $ConnectionString
  $Connection.Open()

  $Command = New-Object MySql.Data.MySqlClient.MySqlCommand($Query, $Connection)
  $DataAdapter = New-Object MySql.Data.MySqlClient.MySqlDataAdapter($Command)
  $DataSet = New-Object System.Data.DataSet
  $RecordCount = $dataAdapter.Fill($dataSet, "data")
  $DataSet.Tables[0]
} catch {
  Write-Host "ERROR : Unable to run query : $query `n$Error[0]"
} finally {
  $Connection.Close()
}

私も以下を試してみましたが、同じ情報が得られました。

SELECT max(id) FROM mytab WHERE category = 1
4

1 に答える 1

0

関数はDataTable、値だけでなくオブジェクトを返します。値を取得するには、フィールド名 (この場合は SQL 関数の名前) で値を選択する必要があります。

$result  = ./MySQL.ps1 -Query "SELECT LAST_INSERT_ID()"
$last_id = $result.'LAST_INSERT_ID()'
Write-Host "Last ID: $last_id"

LAST_INSERT_CD()プロパティの名前には括弧が含まれており、引用符がないと PowerShell はLAST_INSERT_ID()プロパティではなくメソッドとして解釈するため、2 行目の前後の引用符が必要です。括弧 (またはその他の特殊文字) なしでエイリアスを指定することにより、引用符を避けることができます。

$result  = ./MySQL.ps1 -Query "SELECT LAST_INSERT_ID() AS foo"
$last_id = $result.foo
Write-Host "Last ID: $last_id"
于 2015-09-03T20:55:55.733 に答える