sql >> Databáze >  >> RDS >> Sqlserver

Neočekávaný typ proměnné vrácený Receive-Job

  1. Existuje způsob, jak získat správný/očekávaný typ proměnné, který má být vrácen při volání Receive-Job ?

Kvůli použití úlohy na pozadí ztratíte přesnost písma :objekty, které získáváte zpět, jsou emulace bez metod původních typů.

Ruční znovuvytvoření původních typů nestojí za námahu a nemusí být ani možné – i když práce s emulacemi možná postačí.

Aktualizovat :Podle vaší vlastní odpovědi přechod z práce s System.DataSet do System.DataTable výsledkem jsou použitelné emulace.

Další informace naleznete ve spodní části.

  1. Existuje lepší způsob, jak spouštět dotazy SQL pod jiným účtem AD pomocí příkazu Invoke-Sqlcmd?

Potřebujete probíhající způsob vyvolání za účelem zachování typové věrnosti , ale nemyslím si, že je to možné pomocí libovolných příkazů, pokud chcete předstírat identitu jiného uživatele .

Například v procesu (založená na vláknech) alternativa k Start-Job - Start-ThreadJob - nemá -Credential parametr.

Nejlepším řešením je proto zkusit vytvořit Invoke-SqlCmd 's -Credential parametr pracovat za vás, nebo najít jiný průběžný způsob spouštění dotazů s přihlašovacími údaji daného uživatele.

Serializace a deseralizace objektů v úlohách na pozadí / vzdálená komunikace / mini-shell:

Kdykoli PowerShell zařazuje objekty přes hranice procesu , využívá serializaci založenou na XML u zdroje a deserializaci v místě určení pomocí formátu známého jako CLI XML (Common Language Infrastructure XML).

To se děje v kontextu Vzdáleného ovládání PowerShell (např. Invoke-Command volá s
-ComputerName parametr) a také v úlohách na pozadí (Start-Job ) a tzv. miniskořápky (které se implicitně používají, když voláte rozhraní příkazového řádku PowerShell zevnitř samotného PowerShellu pomocí bloku skriptu; např. powershell.exe { Get-Item / } ).

Tato deseralizace zachovává věrnost typu pouze pro omezenou sadu známých typů , jak je uvedeno v MS-PSRP, specifikaci protokolu PowerShell Remoting Protocol. To znamená, že pouze instance pevné sady typů jsou deserializovány jako jejich původní typ .

Instance všech ostatních typů jsou emulovány :typy podobné seznamům se stanou [System.Collections.ArrayList] v instancích se typy slovníků stanou [hasthable] instance a další typy stanou se vlastními objekty bez metod (pouze vlastnosti) ([pscustomobject] instance) , jehož .pstypenames vlastnost obsahuje původní název typu s předponou Deserialized. (např. Deserialized.System.Data.DataTable ), stejně jako názvy základu typu se stejnou předponou typy (hierarchie dědičnosti).

Navíc hloubka rekurze pro objektové grafy ne -[pscustomobject] instance je omezena na 1 úroveň - Všimněte si, že to zahrnuje instanci vlastních tříd PowerShellu , vytvořený pomocí class klíčové slovo:To znamená, pokud hodnoty vlastností vstupního objektu nejsou instancí dobře známých typů samy o sobě (druhé zahrnují typy pouze s jednou hodnotou, včetně primitivních typů .NET, jako je [int] , na rozdíl od typů složených z více vlastností) jsou nahrazeny jejich .ToString() reprezentace (např. zadejte System.IO.DirectoryInfo.Parent vlastnost, která je další System.IO.DirectoryInfo instance, což znamená, že .Parent hodnota vlastnosti se serializuje jako .ToString() reprezentace této instance, což je její úplný řetězec cesty); ve zkratce:Nevlastní (skalární) objekty se serializují tak, že hodnoty vlastností, které samy nejsou instancemi dobře známých typů, jsou nahrazeny jejich .ToString() zastoupení ; viz tato odpověď pro konkrétní příklad.
Naproti tomu explicitní použití serializace CLI XML prostřednictvím Export-Clixml výchozí je hloubka 2 (vlastní hloubku můžete určit pomocí -Depth a podobně můžete ovládat hloubku, pokud použijete základní System.Management.Automation.PSSerializer zadejte přímo ).

V závislosti na původním typu můžete být schopen rekonstruovat instance původního typu ručně , ale to není zaručeno. (Úplný název původního typu můžete získat voláním .pstypenames[0] -replace '^Deserialized\.' na daný uživatelský objekt.)

V závislosti na vašich potřebách zpracování však emulace původních objektů může být dostačující.



  1. Získejte velikost všech databází v PostgreSQL (psql)

  2. SQL Server 2012 dotazování na data aplikace Access 2007 pomocí chyby OPENROWSET

  3. Nainstalujte Postgres.app na Mac

  4. Co je JDBC protějšek Postgres' \connect příkazu?