我的问题始于Entity Framework查询执行速度非常慢(约 2 分钟)。所以我开始调查
同时,问题似乎也在标准中SqlConnection
我有一个非常简单的查询
SELECT 1 AS [C1], [Extent1].[OldReleaseID] AS [OldReleaseID], [Extent1].[ProductName] AS [ProductName], [Extent1].[Price] AS [Price], [Extent1].[DiscountAmount] AS [DiscountAmount], [Extent1].[DiscountRate] AS [DiscountRate], [Extent1].[AbsorbVat] AS [AbsorbVat], [Extent1].[SerialCode] AS [SerialCode], [Extent1].[BrandName] AS [BrandName] FROM [dbo].[LocalSaleProductExts]() AS [Extent1]
Run Code Online (Sandbox Code Playgroud)
当我运行它时,SSMS它会在 0-1 秒内执行并返回大约 30k 行
同样的精确查询在 .net 中运行ExecuteReader大约 100 秒!
在线研究基本上指出了 2 个解决方案:ARITHABORT 和参数嗅探,所以为了好玩,我将所有这些添加到 SSMS 中
DBCC FREESESSIONCACHE
DBCC FREEPROCCACHE
SET ARITHABORT OFF
Run Code Online (Sandbox Code Playgroud)
还有0-1秒。
在我的代码中我添加了SET ARITHABORT ON. 这是我的简单代码
Using sc = New SqlClient.SqlConnection("data …Run Code Online (Sandbox Code Playgroud) 有谁知道是否System.Data.SqlClient.SqlConnection有自己的实现来访问SQL Server?或者它是否使用以下客户端之一:
SQLOLEDB)(已弃用)SQLNCLI)(已弃用)MSOLEDBSQL)在这句话中:
myCommand.ExecuteReader(CommandBehavior.CloseConnection)
Run Code Online (Sandbox Code Playgroud)
如果发生异常,它会关闭连接吗?
我注意到了这个问题,但我的问题更加具体.
使用是否有任何好处
using (SqlConnection conn = new SqlConnection(conStr))
{
using (SqlCommand command = new SqlCommand())
{
// dostuff
}
}
Run Code Online (Sandbox Code Playgroud)
代替
using (SqlConnection conn = new SqlConnection(conStr))
{
SqlCommand command = new SqlCommand();
// dostuff
}
Run Code Online (Sandbox Code Playgroud)
显然,如果您计划使用相同的连接运行多个命令,这很重要,因为关闭a SqlDataReader比关闭并重新打开连接更有效(调用conn.Close();conn.Open();也会释放连接).
我看到许多人坚持认为未能关闭SqlDataReader手段会留下开放的连接资源,但这不仅适用于您不关闭连接的情况吗?
在VB.NET中我可以使用:
Protected Conn As New SqlConnection(ConfigurationManager.ConnectionStrings("Active").ConnectionString)
Run Code Online (Sandbox Code Playgroud)
但是,当我在C#中执行以下操作时:
protected SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings("conn"));
Run Code Online (Sandbox Code Playgroud)
我收到错误:
"ConfigurationManager"名称在当前上下文中不存在
然后,如果我将其更改为:
protected SqlConnection conn = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings("conn"));
Run Code Online (Sandbox Code Playgroud)
我收到错误:
不可调用的成员'System.Configuration.ConfigurationManager.ConnectionStrings'不能像方法一样使用.
为什么这样,我如何使用C#连接到我的SQL Server数据库?
我有一个关于使用CodeFirst方法的EntityFramework的问题.基于EntityConnection源代码和文档,我无法使用已打开的SqlConnection创建它.它要求应该关闭.我们有一些不同的数据库数据层(nHibernate等),如果我们可以在它们之间重用相同的SqlConnection,那将是很好的.但似乎,EntityFramework不允许这样做.我可以将关闭的SqlConnection传递给DbContext,但是对我来说关闭每个DbContext的连接并不好.
有没有办法重用打开的SQL连接?
编辑
EF转到OpenSource后,我能够更新它.我改变的唯一一行是在System.Data.Entity.Core.EntityClient.EntityConnection类的构造函数中.
if (connection.State != ConnectionState.Closed)
{
//throw new ArgumentException(Strings.EntityClient_ConnectionMustBeClosed);
}
Run Code Online (Sandbox Code Playgroud)
在我评论抛出异常之后,我能够重用现有的已打开的SQL连接,并且在DBContext使用它之后,它不会关闭它,并且它仍然可用于其他东西.
我的示例代码:
var connection = new SqlConnection(connectionString);
connection.Open();
MetadataWorkspace workspace = GetWorkspace(connection); // I loaded it from the same context, and save it in memory.
EntityConnection eConnection = new EntityConnection(workspace, connection);
using(var context = new EFContext(connection, false))
{
var someData = context.SomeTable.ToList();
}
connection.Close();
Run Code Online (Sandbox Code Playgroud) 我用的时候
SqlConnection.GetSchema("Tables");
Run Code Online (Sandbox Code Playgroud)
它返回目标数据库的所有表和视图.
有没有办法只返回表?我所做的所有研究表明我正确地做了这一点,但它总是返回视图,就像它们是表格一样.我在调试中挖掘了DataTable,我甚至找不到区别.报告的数据类型相同......据我所知,它无法区分视图和表.(它在某种程度上是有意义的,因为所有意图和目的的视图都是一个表.)
我正在使用Northwind数据库进行测试.
我在C#中编写应用程序.
这是我运行以获取架构信息的代码.很简单.
SQLCon.Open();
DataTable tables = SQLCon.GetSchema("Tables");
SQLCon.Close();
Run Code Online (Sandbox Code Playgroud)
我非常想使用getschema方法而不必以另一种方式查询数据库......如果可能的话.
请帮我理解以下内容:
public sealed class SqlConnection : DbConnection, ICloneable {...}
Run Code Online (Sandbox Code Playgroud)
在上面的课程中我有两个疑问
在C#中,多重继承是不可能的(我们可以通过接口实现这一点).但是这里DBconnection不是一个接口那么它如何支持多重继承呢?
Iclonable是一个接口.它有一个名为object Clone()的方法.但是在Sqlconnection Class中没有实现该方法.怎么可能?
请帮我理解这个
找不到确切的问题/答案。在VB.NET中,如果我在Try / Catch块中打开SqlConnection,并且抛出了异常(正确捕获),该连接是否隐式关闭,还是必须将其关闭?(如果尝试失败,它甚至会打开吗?)
我自己会“测试”,但是当抛出异常时,我真的不知道如何判断连接是打开还是关闭。
谢谢!
我正在对ADO.Net和EF进行一些实验,以便更好地理解它如何处理SQL Server连接.
我发现ADO.Net非常有趣.我正在创建多个任务,调用一个简单的插入SQL脚本,并正确等待处理SqlConnection和SqlCommand.这里没什么特别的,但是当10k任务完成处理时,所有SQL连接仍然挂起(我通过运行确认sp_who).清除这些连接的唯一方法是关闭应用程序实例.
这怎么可能呢?我尝试了很多东西来强迫它关闭,= null数据访问实例+强制GC但没有...
我试图从这种行为中弄清楚,但我失败了.有线索吗?
static void Main(string[] args)
{
Console.WriteLine(DateTime.Now.ToString("HH:mm:ss"));
for (int i = 0; i < 10000; i++)
{
Task.Run(() =>
{
var dbLegacy = new DataAccessLegacy();
dbLegacy.TableBInsert();
dbLegacy = null;
});
}
Console.ReadKey();
}
public void TableBInsert()
{
using (SqlConnection connection = new SqlConnection(@"Password=qpqp;Persist Security Info=True;User ID=sqlUser2;Initial Catalog=DatabaseA;Data Source=VM2HOSTNAME\VM2INSTANCEA"))
{
using (SqlCommand command = new SqlCommand("DatabaseBInsert", connection))
{
command.CommandType = CommandType.StoredProcedure;
command.Parameters.Add("ColAInt", SqlDbType.Int);
command.Parameters[0].Value = (new Random()).Next(0, 5000);
command.Parameters.Add("ColBTinyInt", SqlDbType.TinyInt); …Run Code Online (Sandbox Code Playgroud) sqlconnection ×10
c# ×6
sql-server ×4
.net ×3
vb.net ×2
ado.net ×1
dispose ×1
oop ×1
sql ×1
sqlcommand ×1
ssms ×1
views ×1