不能 return INSERT 语句后的最后一个已知 ID
Can't return the last known ID after an INSERT statement
我正在尝试 return 在 运行 之后插入的最后一个 ID MySQL 使用 PowerShell 的 INSERT 语句。我的 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"
returns:
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
您的函数 returns 一个 DataTable
对象,而不仅仅是一个值。要获得您需要通过字段名称 select 的值(在您的例子中是 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()
解释为方法而不是属性。您可以通过指定不带括号(或其他特殊字符)的别名来避免引号:
$result = ./MySQL.ps1 -Query "SELECT LAST_INSERT_ID() <b>AS foo</b>"
$last_id = $result.<b>foo</b>
Write-Host "Last ID: $last_id"
我正在尝试 return 在 运行 之后插入的最后一个 ID MySQL 使用 PowerShell 的 INSERT 语句。我的 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"
returns:
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
您的函数 returns 一个 DataTable
对象,而不仅仅是一个值。要获得您需要通过字段名称 select 的值(在您的例子中是 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()
解释为方法而不是属性。您可以通过指定不带括号(或其他特殊字符)的别名来避免引号:
$result = ./MySQL.ps1 -Query "SELECT LAST_INSERT_ID() <b>AS foo</b>"
$last_id = $result.<b>foo</b>
Write-Host "Last ID: $last_id"