Не удается заставить SQL-клиент работать в двоичном модуле powershell

#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 и способа загрузки командлетов.