首页 > 解决方案 > 无法让 SQL 客户端在二进制 powershell 模块中工作

问题描述

我做了什么

我安装了 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 无法识别平台,因此没有添加正确的程序集等。在 cmdlet 中使用 sql 应该不是一件难事。

我错过了什么?我有错误的PowerShell库还是什么????

更新 1

经过多次组合包后,我发现使用 system.data.sqlclient 4.6.1 可以工作。而且只有那个版本似乎可以被 powershell 接受。然而,这只解决了我的部分问题。另一半是我想从 microsoft.sqlserver.dacfx 中使用 dacservices。这个包本身依赖于 Microsoft.Data.SqlClient 2.0 并且仍然失败并出现“不支持的平台”

更新 2

切换到 .net 框架库和仅适用于 Windows 的旧版 powershell 版本(5 及更低版本)可以使一切正常运行。安装的软件包。

Powershellstandard.library 5.1.0
microsoft.sqlserver.dacfx 

那时一切正常。但我想针对较新的跨平台版本 7,并且该版本是基于 .net 核心的。

代码

人们一直在询问代码,但这实际上不是代码问题,而是依赖问题等。但只是为了娱乐代码概念:

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>

标签: c#powershell.net-coresqlclient

解决方案


推荐阅读