c# - 无法让 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>
解决方案
推荐阅读
- ruby-on-rails - 允许数组中的参数(具有同一模型的多个实例的表单)
- asp.net - 可以从 asp.net core 2.2 目标的 SignInManager 在 4.6.1 上运行
- c# - 如何在 C# 中使用 Microsoft.Azure.Management.Automation AutomationClient 启动 Azure Runbook/webhook?
- c++ - 错误:未在此范围内声明“sumProduct”
- ios - yarn run ios - 错误:找不到模块 - React Native
- powershell-4.0 - 在powershell中创建一个环回,直到满足变量
- dc.js - 如何在我的交叉过滤器组中使用自定义减少功能?
- excel - VBA Excel 查找 2 个动态范围之间的值
- javascript - 通过 socket.io 发送 var
- c# - 使用双精度列表中的 foreach 循环创建字符串列表。每两个值必须压缩成一个字符串,然后添加到列表中