#c# #powershell #.net-core #sqlclient
#c# #powershell #.net-core #sqlclient
Вопрос:
Что я сделал
Я установил powershell 7 (x64 Windows) Создайте новую библиотеку классов c # .net core (VS2019 .net core 3.1), в которую добавлен nuget для
Microsoft.Data.SqlClient 2.0.1
Powershellstandard.library 5.1.0
microsoft.sqlserver.dacfx
создал класс, производный от PSCmdlet, и добавил это:
sqlConnection = new SqlConnection($"Server={Server};Trusted_Connection=True;");
sqlConnection.Open();
В зависимости от того, добавлю ли я «CopyLocalLockFileAssemblies», верно
<PropertyGroup>
<TargetFramework>netcoreapp3.1</TargetFramework>
<CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>
<RootNamespace>VaultTech.Powershell</RootNamespace>
<AssemblyName>VaultTech.Powershell</AssemblyName>
</PropertyGroup>
в файл проекта я получаю либо сообщение об ошибке «платформа не поддерживается» от sqldataclient, либо «сборка не найдена» для sqldataclient.
По какой-то причине CopyLocalLockFileAssemblies также заставляет мои точки останова работать в модуле powershell….
Просматривая сеть, я вижу несколько похожих отчетов об ошибках, но ничто в них не дает мне решения. В основном речь идет о том, что nuget не распознает платформу и, следовательно, не добавляет правильные сборки или тому подобное. Использование sql в командлете не должно быть сложной задачей.
Чего мне не хватает? У меня неправильная библиотека powershell или что-то в этом роде????
ОБНОВЛЕНИЕ 1
После многих комбинаций пакетов я обнаружил, что использование system.data.sqlclient 4.6.1 работает. И только эта версия кажется приемлемой для powershell. Однако это решает только часть моей проблемы. Другая половина заключается в том, что я хочу использовать dacservices из microsoft.sqlserver.dacfx. Сам этот пакет зависит от Microsoft.Data.SqlClient 2.0, и он по-прежнему терпит неудачу с «не поддерживаемой платформой»
ОБНОВЛЕНИЕ 2
Переключение на библиотеку .net Framework и старые версии powershell только для Windows (5 и ниже) заставляет все работать правильно. Установленные пакеты.
Powershellstandard.library 5.1.0
microsoft.sqlserver.dacfx
Тогда все работает нормально. Но я хочу настроить таргетинг на более новую кроссплатформенную версию 7, и она основана на .net core.
код
Люди продолжают спрашивать о коде, но на самом деле это не проблема с кодом, а проблема зависимости или что-то в этом роде. Но просто для понимания понятия кода:
using Microsoft.SqlServer.Dac;
using System;
using System.Data.SqlClient;
using System.IO;
using System.Linq;
using System.Management.Automation;
namespace PowerShell
{
[Cmdlet(VerbsCommon.Add, "Vault")]
[OutputType(typeof(Boolean))]
public class AddVaultCmdlet : PSCmdlet
{
[Parameter(Mandatory = true,
HelpMessage = "Server instance to create the vault on")]
public string Server { get; set; }
[Parameter(Mandatory = true,
HelpMessage = "Name of the vault database")]
public string Name { get; set; }
private SqlConnection sqlConnection;
protected override void BeginProcessing()
{
base.BeginProcessing();
sqlConnection = new SqlConnection($"Server={Server};Trusted_Connection=True;");
sqlConnection.Open();
WriteVerbose("Begin!");
}
protected override void ProcessRecord()
{
try
{
string connectionString = $"Server={Server};Trusted_Connection=True;";
// Roll out the dacpac for the vault
DacServices dacpacService = new DacServices(connectionString);
dacpacService.ProgressChanged = new EventHandler<DacProgressEventArgs>((s, e) =>
WriteProgress(new ProgressRecord(1, "Deploy dacpac", e.Message)));
dacpacService.Message = new EventHandler<DacMessageEventArgs>((s, e) =>
WriteInformation(new InformationRecord(e.Message.Message, "Deploy dacpac")));
}
catch (Exception ex)
{
WriteError(new ErrorRecord(ex, "1", ErrorCategory.NotSpecified, ""));
WriteObject(false);
}
finally
{
WriteObject(true);
}
}
protected override void EndProcessing()
{
base.EndProcessing();
sqlConnection.Close();
}
}
}
Файл проекта
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup Label="Globals">
<SccProjectName>SAK</SccProjectName>
<SccProvider>SAK</SccProvider>
<SccAuxPath>SAK</SccAuxPath>
<SccLocalPath>SAK</SccLocalPath>
</PropertyGroup>
<PropertyGroup>
<TargetFramework>netcoreapp3.1</TargetFramework>
<CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>
<AssemblyName>PowerShell</AssemblyName>
<RootNamespace>PowerShell</RootNamespace>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.SqlServer.DacFx" Version="150.4897.1" />
<PackageReference Include="PowerShellStandard.Library" Version="5.1.0">
<PrivateAssets>All</PrivateAssets>
</PackageReference>
<PackageReference Include="System.Data.SqlClient" Version="4.6.1" />
</ItemGroup>
<ItemGroup>
<Compile Update="Resource.Designer.cs">
<DesignTime>True</DesignTime>
<AutoGen>True</AutoGen>
<DependentUpon>Resource.resx</DependentUpon>
</Compile>
</ItemGroup>
<ItemGroup>
<EmbeddedResource Update="Resource.resx">
<Generator>ResXFileCodeGenerator</Generator>
<LastGenOutput>Resource.Designer.cs</LastGenOutput>
</EmbeddedResource>
</ItemGroup>
</Project>
Комментарии:
1. См. Следующее: github.com/dotnet/core/blob/master/release-notes/3.1 /…
2. @jdweng. К сожалению, это мне не помогает. Понижение версии немного решило проблему, но не полностью. Я обновил вопрос. Похоже, что-то в том, как powershell загружает свои командлеты, вызывает определенные версии сборок.
3. В Powershell или нет ничего плохого
Microsoft.Data.SqlClient
. Вы не опубликовали свой код или файл проекта, поэтому можно только догадываться.Depending on if I add true to the project file
что это значит? Ошибки говорят о том, что либо неправильные библиотеки были скопированы для целевой платформы (например, x64 была развернута в системе x86), либо библиотеки полностью отсутствуют4. @PanagiotisKanavos «true» было небольшой опечаткой, редактор stackoverflow скрывал xml. Я его скорректировал. Я также добавил второе обновление и пример кода, хотя, по моему мнению, это зависит от проблемы в проекте или в powershell и способа загрузки командлетов.