DataTable.Rows.Find (MultiplePrimaryKey) в Powershell - PullRequest
0 голосов
/ 06 июня 2018

Я работаю с таблицей SQL Server, привожу в качестве таблицы данных внесение некоторых изменений и сохранение данных обратно в базу данных.

Сейчас я застрял в поиске правильного синтаксиса для DataTable.Rows.Find (PrimaryKey)

Для простоты я создаю простой набор данных с некоторыми данными, которые вы можете проверить на своем концетакже.

Вот мой синтаксис.

[System.Data.DataTable]$dtGL = New-Object System.Data.DataTable("GL")
#Schemas
$dtGL.Columns.Add("Account", "String") | Out-Null
$dtGL.Columns.Add("Property", "String") | Out-Null
$dtGL.Columns.Add("Date", "DateTime") | Out-Null
$dtGL.Columns.Add("Amount", "Decimal") | Out-Null

[System.Data.DataColumn[]]$KeyColumn = ($dtGL.Columns["Account"],$dtGL.Columns["Property"],$dtGL.Columns["Date"])
$dtGL.PrimaryKey = $KeyColumn 

#Records
$dtGL.Rows.Add('00001','1000','1/1/2018','185') | Out-Null 
$dtGL.Rows.Add('00001','1000','1/2/2018','486') | Out-Null
$dtGL.Rows.Add('00001','1001','1/1/2018','694') | Out-Null
$dtGL.Rows.Add('00001', '1001', '1/2/2018', '259') | Out-Null

[String[]]$KeyToFind = '00001', '1001', '01/01/2018'
$FoundRows = $dtGL.Rows.Find($KeyToFind)
$FoundRows | Out-GridView 

Я получаю следующую ошибку

Exception calling "Find" with "1" argument(s): "Expecting 3 value(s) for the key being indexed, but received 1 value(s)."
At C:\Users\MyUserName\OneDrive - MyUserName\MyCompany\PowerShell\Samples\Working With DataTable.ps1:32 char:5
+     $FoundRows = $dtGL.Rows.Find($KeyToFind)
+     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : ArgumentException

Я также пытался разделить параметры

$P01 = '00001'
$P02 = '1001'
$P03 = '01/01/2018'

$FoundRows = $dtGL.Rows.Find($P01,$P02,$P03)

Вот ошибка

Cannot find an overload for "Find" and the argument count: "3".
+     $FoundRows = $dtGL.Rows.Find($P01,$P02,$P03)
+     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodException
    + FullyQualifiedErrorId : MethodCountCouldNotFindBest

Ответы [ 2 ]

0 голосов
/ 06 июня 2018

это должно работать хорошо, я попытался следующим образом:

$P01 = '00001'
$P02 = '1001'
$P03 = '01/01/2018'

$FoundRows = $dtGL.Rows.Find(@($P01,$P02,$P03))
0 голосов
/ 06 июня 2018

DataRowCollection.Find требуется массив объектов.Перед редактированием вы показали, что передаете массив строк.Это сработало бы, если бы каждый столбец первичного ключа имел тип String.Поскольку у вас есть DateTime, вам нужно передать массив Object, и значение для столбца Date должно иметь тип DateTime.

Попробуйте изменить способ реализации KeyToFind на массив объектов, приведя каждый другой типпо пути:

[Object[]]$KeyToFind = [String]'00001', [String]'1001', [DateTime]'01/01/2018'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...