在 .Net Core 2.0 中使用 System.Data.SqlClient.dll 时出现版本冲突错误。它看起来像是 Core dll 和 NetStandard dll 之间的冲突。不知道为什么提到
"System.Data.SqlClient,版本=4.5.0.0
这是不存在的。
Web 应用程序调用业务库,业务库又调用 DAL。DAL 正在使用 System.Data.SqlClient.dll。全部都在 .Net Core2.0 中。
你能帮忙吗?
这是错误。
1> “System.Data.SqlClient, Version=4.2.0.2, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a”和“System.Data.SqlClient, Version=4.5.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a”之间存在冲突. 1> "System.Data.SqlClient, Version=4.2.0.2, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" 被选中是因为它是主要的并且 "System.Data.SqlClient, Version=4.5.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a" “ 不是。1> 依赖于“System.Data.SqlClient, Version=4.2.0.2, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a”的参考文献[C:\Program Files\dotnet\sdk\NuGetFallbackFolder\system.data.sqlclient\4.4.3\ ref\netstandard2.0\System.Data.SqlClient.dll]。1> C:\Program Files\dotnet\sdk\NuGetFallbackFolder\system.data.sqlclient\4.4。3\ref\netstandard2.0\System.Data.SqlClient.dll 1> 项目文件项包括导致引用“C:\Program Files\dotnet\sdk\NuGetFallbackFolder\system.data.sqlclient\4.4.3\ref\netstandard2 .0\System.Data.SqlClient.dll”。1> C:\Program Files\dotnet\sdk\NuGetFallbackFolder\system.data.sqlclient\4.4.3\ref\netstandard2.0\System.Data.SqlClient.dll 1> 依赖于“System.Data.SqlClient,版本=4.5.0.0,文化=中性,PublicKeyToken=b03f5f7f11d50a3a”[]。1> D:\Projects.Net Core\Test Apps\Postsharp\SmartBank.Web\SmartBank.Core.Business\SmartBank.Core.Business\bin\Debug\netcoreapp2.0\SmartBank.Core.DAL.dll 1> 项目文件项目包括导致引用“D:\Projects.Net Core\Test Apps\Postsharp\SmartBank.Web\SmartBank.Core.Business\SmartBank.Core.
我有与此类似的代码在多个BackgroundServices (.NET 7)中运行。经过几天的运行时间(显然,循环之间的延迟为几分钟(到几小时))SqlConnection会导致数以万计的悬空句柄出现大量内存泄漏(可能所有曾经使用过的句柄仍然被引用,即使正确地与数据库)。我正在使用.NET 的 SqlClient 5.0.1。
using System;
using System.Threading;
using System.Threading.Tasks;
using System.Diagnostics;
using Microsoft.Data.SqlClient;
namespace Memleak;
static class Program
{
const string connectionString = "Server=lpc:localhost;"
+ "Integrated Security=True;Encrypt=False;"
+ "MultipleActiveResultSets=False;Pooling=False;";
static async Task Main(params string[] args)
{
using CancellationTokenSource cts = new();
// not to forget it running
cts.CancelAfter(TimeSpan.FromMinutes(15));
CancellationToken ct = cts.Token;
using Process process = Process.GetCurrentProcess();
long loop = 1;
while (true)
{
await ConnectionAsync(ct);
// this seems …Run Code Online (Sandbox Code Playgroud) 我在本地模式下使用Visual Studio 2008中的ReportViewer控件,其中对象作为数据源.我的类映射到数据库中的数据表.在对象中,它根据需要加载相关对象.因此,在您尝试使用该属性之前,它会将引用保留为null,然后它会尝试自动从数据库加载它.这些类使用System.Data.SqlClient命名空间.
当我与Windows窗体应用程序中的对象进行交互时,一切都按预期工作.但是,当我传递要用作报表数据源的对象并尝试自动加载相关对象时,它会失败.代码创建一个SqlConnection对象,当我在其上调用GetCommand()时,抛出以下异常:
[System.Security.SecurityException] {
"Request for the permission of type 'System.Data.SqlClient.SqlClientPermission, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' failed."
} System.Security.SecurityException
Run Code Online (Sandbox Code Playgroud)
我已经尝试搜索错误,但显示的所有结果都是在SQL Server或ASP.Net上运行的CLR程序集.我在创建SqlConnection对象之前尝试在我的代码中添加以下调用(如搜索结果中所示),但它显然没有做任何事情:
System.Data.SqlClient.SqlClientPermission(System.Security.Permissions.PermissionState.Unrestricted).Assert();
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
我有一个应用程序,它将从SQL读取数据并通过WCF发送到客户端应用程序,方式类似于:
SqlDataAdapter da = new SqlDataAdapter( cmd )
DataSet ds = new DataSet();
da.Fill( ds );
return ds;
Run Code Online (Sandbox Code Playgroud)
所有日期/时间都以UTC格式存储在数据库中.我注意到,如果运行应用程序的计算机上的时钟偏差,客户端收到的日期/时间也会有所偏差.似乎在DateTime类型是未指定类型的情况下,WCF将在内部将其表示为本地时间,并且这样发送,因此应用程序和客户端之间的任何时间差异都将导致日期/时间移位.
我可以检索数据集并修复日期/时间字段,但是这里有人会想到一些更好的方法来填充数据集,这样每个DateTime字段都会自动成为da.Fill()上的DateTimeKind.Utc吗?
在命名空间下System.Data.SqlClient,我们有SqlDataReader.GetSqlBinary
和SqlDataReader.GetSqlBytes.
两者似乎都给出了"原始数据".如果是这样,他们之间有什么区别?
在C#中,我使用sql脚本将数据添加到List中,其中T将是一个具有映射到sql脚本的字段/属性的类.
我怎么能在F#中做到这一点?这篇文章以标准方式使用存储过程.
using (conn)
{
conn.Open();
using (SqlCommand cmd = new SqlCommand("dbo.query_here", conn))
{
cmd.CommandText = "dbo.query_here";
cmd.CommandType = System.Data.CommandType.StoredProcedure;
cmd.CommandTimeout = 600;
cmd.Parameters.Add(new SqlParameter("@x1", Convert.ToString(x)));
cmd.Parameters.Add(new SqlParameter("@y1", y));
cmd.Parameters.Add(new SqlParameter("@z1", z));
SqlDataReader reader = cmd.ExecuteReader();
while (reader.Read())
{
MyListOfClasses.Add(new MyDataClass(reader.GetInt32(reader.GetOrdinal("x"))
reader.GetDouble(reader.GetOrdinal("y")),
reader.GetDouble(reader.GetOrdinal("a")),
reader.GetDouble(reader.GetOrdinal("b"))));
}
reader.Close();
}
conn.Close();
Run Code Online (Sandbox Code Playgroud)
我意识到F#并不像这样直截了当,但我需要以类似的方式将这些数据放入F#列表中.也更喜欢那些本质上不起作用的建议,并遵循与C#代码类似的模式.
在之前的一个帖子中有人建议使用记录,但这与SqlDataReader无关.最好有一个类列表,这样我就可以在每个项目上使用getter和setter.
我应该在"为什么不只是使用C#"的不可避免的评论之前添加.很明显我可以使用C#,但我正在探索在F#中编写算法的可能性,为此我需要从SQL Server获取原始数据.
我重新安装了Visual Studio 2017 Professional。我正在使用.NET 4.7.1构建一个快速的POC控制台应用程序,但找不到System.Data.SqlClient的引用。
我已经搜寻了我的系统,找到了System.Data.SqlClient.dll的4个版本,但是没有一个是正确的并且无法编译。我也曾尝试使用System.Data,但其中没有对SqlClient的引用。我已经为System.Data手动添加了dll /引用,但是也没有解决引用问题。
目前,我的应用程序非常简单,由于缺少参考,因此无法编译。
我需要采取什么步骤才能解决此问题?
using System;
using System.Data;
using System.Data.SqlClient;
namespace ConsoleApp1
{
class Database
{
public void Start()
{
string connString = @"server=(local);initial catalog=MyDatabase;Integrated Security=SSPI;";
using (SqlConnection conn = new SqlConnection(connString))
{
conn.Open();
using (SqlCommand cmd = new SqlCommand("SELECT TOP 10 ID, Name FROM TableA", conn))
{
using (SqlDataReader reader = cmd.ExecuteReader())
{
while(reader.Read())
{
Console.WriteLine("ID: [{0}], Name: [{1}]", reader.GetValue(0), reader.GetValue(1));
}
}
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud) 我有一个使用 SQL Server 的繁忙 ASP.NET 5 Core 应用程序(每秒数千个请求)。最近,我们决定尝试将一些热代码路径切换为async数据库访问,但是......应用程序甚至没有启动。我收到此错误:
从池中获取连接之前超时时间已过。发生这种情况的原因可能是所有池连接都在使用中并且已达到最大池大小。
我看到线程池中的线程数量增长到 40...50...100...
我们使用的代码模式非常简单:
using (var cn = new SqlConnection(connenctionStrng))
{
cn.Open();
var data = await cn.QueryAsync("SELECT x FROM Stuff WHERE id=@id"); //QueryAsync is from Dapper
}
Run Code Online (Sandbox Code Playgroud)
我做了一个进程转储,所有线程都在线上cn.Open(),只是坐在那里等待。
这主要发生在 IIS 上的应用程序“回收”期间,即应用程序进程重新启动并且 HTTP 请求从一个进程排队到另一个进程时。导致队列中有数万个请求需要处理。
嗯,是的,我明白了。我想我知道发生了什么事。async使应用程序更具规模。当数据库忙于响应我的查询时,控制权将返回给其他线程。它尝试并行打开越来越多的连接。连接池已满。但是为什么关闭的连接在工作完成后没有立即返回到池中呢?
从async“传统”代码切换到“传统”代码可以立即解决问题。
我有什么选择?
100?尝试过200,没有帮助。我应该尝试一下吗10000?OpenAsync而不是Open? 没有帮助。SqlClient,据说已修复。据说。async根本不与数据库访问一起使用?呃……async当像这个答案建议的那样使用时,我们真的必须想出我们自己的节流机制吗?我很惊讶没有内置的解决方法......PS 仔细查看进程转储 …
将应用程序部署到azure应用程序服务后面临以下问题:
未处理的异常。System.IO.FileNotFoundException:无法加载文件或程序集“Microsoft.Data.SqlClient,版本= 5.0.0.0,文化=中性,PublicKeyToken = *********”。该系统找不到指定的文件。
在本地一切正常。 Microsoft.Data.SqlClient出现在site/wwwroot中

运行时堆栈:Dotnetcore - 6.0 主应用程序和 .net6 上的所有类库 服务器操作系统:Linux
Microsoft.Data.SqlClient 作为 Microsoft.EntityFrameworkCore.SqlServer (v.7.0.2) 的参考提供
尝试了不同类型的 Nuget Packages 版本 - 仍然有相同的问题尝试将 Microsoft.Data.SqlClient (最新版本和 5.0.0.0)直接安装到项目中 - 仍然相同
System.PlatformNotSupportedException in Microsoft.Data.SqlClient.dll: 'Strings.PlatformNotSupported_DataSqlClient'我正在尝试将我的 azure 函数应用程序作为 docker 映像运行,当我这样做时,每当我尝试调用我的数据层(无论我使用的是 EF Core 还是 Dapper)时,它都会抛出异常。当我将 API 项目设置为启动而不是 docker 映像时,我可以很好地运行该应用程序。
那里有非常相似的问题,但没有一个考虑到它仅在我尝试将其作为 docker 映像运行或我的目标框架是netcoreapp3.1. 我已经尝试过类似问题所说的内容。这是添加System.Data.SqlClient为 Nuget 包,无论我制作什么版本都没有帮助。
我怀疑我需要添加一些东西Dockerfile or something.
编辑:我可以通过简单地创建一个azure函数、添加docker支持、创建一个在本地数据库上执行CRUD操作的简单数据层、然后运行docker映像并调用执行此操作的端点来在新项目中重新创建该问题CRUD 操作。希望有帮助。
sqlclient ×10
c# ×6
.net ×3
.net-core ×2
ado.net ×2
async-await ×2
.net-6.0 ×1
.net-7.0 ×1
asynchronous ×1
docker ×1
f# ×1
list ×1
sql-server ×1
system.data ×1
winforms ×1