Mysql foreach循环将多行插入数据库

Mysql foreach循环将多行插入数据库,mysql,loops,powershell,foreach,insert,Mysql,Loops,Powershell,Foreach,Insert,我需要找出谁登录了端点。我们有一个SID历史记录表,我正在使用它作为转换表。这将导致用户名而不是SID。连接工作正常,但它只从事件日志中插入一个事件 我在foreach循环中包含了insert语句。我错过了什么 我运行这个示例的主机有15个以上的事件,我需要将所有15个事件插入MySQL数据库,以便查询特定SID登录的机器 下面是简单而难看的代码。连接可以工作,但一次只插入一行 # MySQL Connection string # function Connect-MySQL([string]

我需要找出谁登录了端点。我们有一个SID历史记录表,我正在使用它作为转换表。这将导致用户名而不是SID。连接工作正常,但它只从事件日志中插入一个事件

我在foreach循环中包含了insert语句。我错过了什么

我运行这个示例的主机有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
}

我不知道dotnet是如何工作的,从来没有使用过它,但看看你的代码,你正在循环,实际上是在对每条记录进行查询。可能只是提交了最后一张唱片,或者只是其中一张,因为我不懂网络,所以不确定。但您可以做的一件事是运行一个查询,一次插入所有值,下面是一个基于代码的解决方案

$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"

我希望这能有所帮助。

删除行
$ErrorActionPreference='silentlycontinue'
,看看是否有东西坏了。此外,请确认
$events
实际上包含多个项目。当我取下EA时,没有任何项目会中断$当我在循环外部或内部回显时,事件有超过15个结果。如果我在循环外回显$uservar,我只会返回控制台一次-$events,我会得到所有这些事件….:/foreach($events中的event){$1=$event.replacementstrings[1]$2=$event.timegenerated$3=$event.machinename$query=“INSERT INTO infosec.ewarp_testing(data1,data2,data3)值('$1','$2','$3')”$Rows=Execute MySQLNonQuery$conn$query您仍在执行多个查询,我只是想告诉你如何用一个查询插入多个记录,减少开销。。。