【问题标题】:foreach loop ot insert multiple rows into databaseforeach 循环将多行插入数据库
【发布时间】:2015-12-25 15:15:06
【问题描述】:

我需要弄清楚谁登录了端点。我们有一个 SID 历史表,我将其用作转换表。这将产生用户名而不是 SID。连接工作正常,但它只插入事件日志中的一个事件。

我将插入语句包含在 foreach 循环中。我错过了什么?

我运行它的示例主机有超过 15 个事件,我需要将所有 15 个事件插入 MySQL 数据库,以便查询特定 SID 已登录的计算机。

下面是简单丑陋的代码。连接有效,但一次只能插入一行。

# MySQL Connection string #
function Connect-MySQL([string]$user,[string]$pass, [string]$MySQLHost,[string]$database) {
  # Load MySQL .NET Connector Objects
  [void][system.reflection.Assembly]::LoadWithPartialName("MySql.Data")

  $connStr = "server=" + $MySQLHost + ";port=3306;uid=" + $user + ";pwd=" + $pass + ";database="+$database+";Pooling=FALSE"
  $conn = New-Object MySql.Data.MySqlClient.MySqlConnection($connStr)
  $conn.Open()
  return $conn
}

# Close Conn
function Disconnect-MySQL($conn) {
  $conn.Close()
}

# MySQL Connection Vars #
$user = ''
$pass = ''
$database = ''
$MySQLHost = ''

$conn = Connect-MySQL $user $pass $MySQLHost $database

function Execute-MySQLNonQuery($conn, [string]$query) {
  $command = $conn.CreateCommand()
  $command.CommandText = $query
  $RowsInserted = $command.ExecuteNonQuery()
  $command.Dispose()

  if ($RowsInserted) {
    return $RowInserted
  } else {
    return $false
  }
}

$ErrorActionPreference = 'silentlycontinue'

$events = Get-Eventlog -Log system -ComputerName '.' | Where-Object {
  (($_.EventID -like "*7001*") -or
  ($_.EventID -like "*7002*"))
} | Select-Object replacementstrings, machinename, timegenerated ;
foreach ($event in $events) {
  $outObj = new-object psobject -Property @{
    user = $event.ReplacementStrings[1]
    time = $event.timegenerated
    machine = $event.machinename
  }

  $uservar = $outObj.user
  $timevar = $outObj.time
  $machinevar = $outObj.machine

  $query = "INSERT INTO infosec.ewarp_testing (data1,data2,data3) VALUES ('$uservar', '$timevar','$machinevar')"
  echo "$uservar $timevar $machinevar"
  $Rows = Execute-MySQLNonQuery $conn $query
}

【问题讨论】:

  • 删除$ErrorActionPreference = 'silentlycontinue'这一行,看看是否有问题。此外,请验证 $events 是否实际包含多个项目。
  • 当我关闭 EA 时没有任何中断。当我在循环外部或内部回显时,$Events 有超过 15 个结果。如果我在循环外回显 $uservar,我只会得到一个返回控制台 - $events 我得到所有这些......:/

标签: mysql loops powershell foreach insert


【解决方案1】:

我不确定 dot net 是如何工作的,从未使用过它,但是查看您的代码,您正在循环并实际上对每条记录进行查询。也许它只是提交最后一条记录,或者只是其中一个,不确定,因为我不知道 dot net。但是您可以做的一件事是运行一个查询,一次插入所有值,这是基于您的代码的解决方案。

$query = "INSERT INTO infosec.ewarp_testing (data1,data2,data3) VALUES ('$uservar', '$timevar','$machinevar')"

将该行更改为连接一串值的位置:

$values = ""
$values = $values + "('$uservar', '$timevar','$machinevar'),"

这将构建一个“值”字符串,在每组 (...), 之间放置一个逗号,您必须使用我可以想象的某种字符串函数删除最后一个。

循环完成后,您将继续获取所有值并在循环外运行单个查询:

$query = "INSERT INTO infosec.ewarp_testing (data1,data2,data3) VALUES $values"

我希望这会有所帮助。

【讨论】:

  • foreach($events in $events){ $1 = $event.replacementstrings[1] $2 = $event.timegenerated $3 = $event.machinename $query = "INSERT INTO infosec.ewarp_testing (data1, data2,data3) VALUES ('$1', '$2','$3')" $Rows = Execute-MySQLNonQuery $conn $query }
  • 你还在做多个查询,我只是想告诉你如何用一个查询插入多条记录,更少的开销......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-18
  • 2015-05-14
  • 1970-01-01
  • 2017-10-05
相关资源
最近更新 更多