Tag: sql server

使用entity framework的SQL查询运行速度较慢,使用错误的查询计划

我一般成功使用entity framework,但一个查询运行速度非常慢。 查询(由EF生成)如下: exec sp_executesql N’SELECT [Project1].[downtimeId] AS [downtimeId], CASE WHEN ([Extent12].[downtimeStart] > @p__linq__7) THEN [Extent13].[downtimeStart] ELSE @p__linq__8 END AS [C1], CASE WHEN ([Extent14].[equipmentID] IS NULL) THEN 0 ELSE [Extent15].[equipmentID] END AS [C2], CASE WHEN ([Extent16].[equipmentID] IS NULL) THEN N”Unit Overhead” ELSE [Extent18].[equipmentCode] END AS [C3], CASE WHEN ( CAST( [Project1].[downtimeEquipmentStart] AS datetime2) > @p__linq__9) […]

使用外键引用映射多对多关系

对于精通EF的用户来说,这应该是一个简单的问题。 我有以下模式(在我的脑海中)表示表之间的关系应该如何。 [FooBar] [Foo] [Bar] FooId PK,FK Id PK Id PK BarId PK,FK BarId FK Name IsRead Name Description Description 但是,当我尝试使用EF代码生成模式时,首先它无法解释实体之间的关系,因为我已经解释了它们(将外键FooId添加到[bar]表中)并且无法完全创建[FooBar]桥牌桌。 如果有人可以指导我如何使用EF4代码实现上述架构 – 首先我很感激。 只要创建了所需的数据库模式,解决方案是否涉及我的POCO模型上的属性,流畅的配置或两者的混合都无关紧要。 POCO型号: public class Foo { public int Id { get; set; } public string Text { get; set; } public string Description { get; set; } public int BarId { […]

使用IEnumerable 返回类型的SQL数据是否有任何陷阱?

我的问题是关于SQL连接状态,负载等基于以下代码: public IEnumberable GetMyTypeObjects() { string cmdTxt = “select * from MyObjectTable”; using(SqlConnection conn = new SqlConnection(connString)) { using(SqlCommand cmd = new SqlCommand(cmdTxt, conn)) { conn.Open(); using(SqlDataReader reader = cmd.ExecuteReader()) { while(reader.Read()) { yield return Mapper.MapTo(reader); } } } } yield break; } 我可以看到这可能是一个问题,如果有许多进程在IEnumerable对象的迭代之间运行类似的代码,执行时间长,因为连接将打开更长时间等等。但是,这似乎也可能会减少CPU使用率在SQL服务器上,因为它只在使用IEnumerable对象时返回数据。 它还降低了客户端上的内存使用量,因为客户端只需在其工作时加载一个MyType实例,而不是加载所有出现的MyType(通过迭代整个DataReader并返回List或其他内容)。 您是否有任何实例可以想到您不希望以这种方式使用IEnumerable,或者您认为它完全适合的任何实例? 这会给SQL服务器带来什么样的负载? 这是你在自己的代码中使用的东西(除非提到NHibernate,Subsonic等)吗? –

如何创建定期日历活动?

我正在使用asp mvc 3,jquery完整日历,ms sql sever 2008和c#。 我想知道是否有人知道如何制作重复活动? 我不确定如何制作它们。 例如,在谷歌日历中,您可以永久地重复预约。 我怀疑他们在数据库中生成X次约会。 我想知道如何在我的数据库中有一行,并且知道如何在需要时调用它。 此外,谷歌日历和Outlook有很多重复选项,如重复在第1个月,上个月等。 有没有这样的库构建? 或者我是从头开始做的? PS 我在共享主机上,因此解决方案必须使用有限的权限。

查询在NHibernate中出现超时错误,但在SQL Server中没有

我在C#中遇到了NHibernate的问题。 当它想要执行查询时,应用程序面临ADO超时错误,但是当我使用SQL事件探查器捕获查询,然后我在SQL Server的新查询中运行它时,它只需要2秒 有任何想法吗??

在C#/ .NET3.5中构建动态SQL查询的最佳方法?

我正在研究的一个项目涉及重构一个C#Com对象,它作为一些Sql 2005数据库的数据库访问层。 现有代码的作者使用字符串和许多if语句手动构建了所有sql查询,以构造相当复杂的sql语句(~10个连接,> 10个子选择,~15-25 where条件和GroupBy)。 基表始终是相同的,但连接,条件和分组的结构取决于传递给我的类/方法的一组参数。 构建像这样的SQL查询确实有效,但它显然不是一个非常优雅的解决方案(而且很难阅读/理解和维护)…我可以自己写一个简单的“querybuilder”,但我很确定我不是第一个遇到这种问题的人,因此我的问题是: 你如何构建数据库查询? C#是否提供了一种动态构建查询的简便方法?

用c#创建新的sql server表

我有这个代码来创建新的SQL表,当我执行它时它显示我在屏幕截图上的这个错误。 在我的数据库中没有这样的表。 它显示此错误任何名称的表。 谁能帮我? public void Create(string TName, string ConString) { try { using (SqlCommand cmd = new SqlCommand(“CREATE TABLE [dbo].[‘” + TName + “‘](” + “[ID] [int] IDENTITY(1,1) NOT NULL,” + “[DateTime] [date] NOT NULL,” + “[BarCode] [nvarchar](max) NOT NULL,” + “[ArtNumber] [nvarchar](max) NOT NULL,” + “[ProductName] [nvarchar](50) NOT NULL,” + “[Quantity] [int] NOT […]

C#方法锁定SQL Server表

我有一个C#程序需要对SQL Server表执行一组批量更新(20k +)。 由于其他用户可以通过Intranet网站一次更新这些记录,我们需要构建能够锁定表的C#程序。 一旦表被锁定以防止其他用户进行任何更改/搜索,我们将需要预先形成所请求的更新/插入。 由于我们正在处理如此多的记录,因此我们不能使用TransactionScope (这似乎是最简单的方式),因为我们的事务最终由MSDTC服务处理。 我们需要使用另一种方法。 根据我在互联网上阅读的内容,使用SqlTransaction对象似乎是最好的方法,但是我无法让表锁定。 当程序运行并且我单步执行下面的代码时,我仍然可以通过Intranet站点执行更新和搜索。 我的问题是双重的。 我正确使用SqlTransaction吗? 如果是这样(或者即使没有)是否有更好的方法来获取表锁,允许当前程序运行以搜索和预先形成更新? 我希望在程序执行下面的代码时锁定表。 C# SqlConnection dbConnection = new SqlConnection(dbConn); dbConnection.Open(); using (SqlTransaction transaction = dbConnection.BeginTransaction(IsolationLevel.Serializable)) { //Instantiate validation object with zip and channel values _allRecords = GetRecords(); validation = new Validation(); validation.SetLists(_allRecords); while (_reader.Read()) { try { record = new ZipCodeTerritory(); _errorMsg = string.Empty; […]

TransactionScope助手无故耗尽连接池 – 帮助?

前段时间我问了一个关于TransactionScope升级到MSDTC的问题,当时我还没想到。 ( 上一个问题 ) 简而言之,在SQL2005中,为了使用TransactionScope,您只能在TransactionScope的生命周期内实例化并打开一个SqlConnection。 使用SQL2008,您可以实例化多个SqlConnections,但在任何给定时间只能打开一个SqlConnections。 SQL2000将始终升级到DTC …我们的应用程序中不支持SQL2000,一个WinForms应用程序,BTW。 我们对单连接问题的解决方案是创建一个名为LocalTransactionScope(又名’LTS’)的TransactionScope助手类。 它包装了一个TransactionScope,最重要的是,它为我们的应用程序创建并维护了一个SqlConnection实例。 好消息是,它可以工作 – 我们可以在不同的代码片段中使用LTS,它们都加入了环境事务。 非常好。 问题是,创建的每个根 LTS实例都将创建并有效地从连接池中终止连接。 通过’有效杀死’我的意思是它将实例化一个SqlConnetion,它将打开一个新连接(无论出于何种原因,它永远不会重用来自池的连接),并且当该根LTS被释放时,它会关闭并处理SqlConnection,这是应该将连接释放回池中以便可以重复使用,但是,它显然永远不会被重用。 池膨胀直到最大化,然后在建立max-pool-size + 1连接时应用程序失败。 下面我附上了一个精简的LTS代码版本和一个示例控制台应用程序类,它将演示连接池耗尽。 要观察连接池膨胀,请使用SQL Server Managment Studio的“活动监视器”或此查询: SELECT DB_NAME(dbid) as ‘DB Name’, COUNT(dbid) as ‘Connections’ FROM sys.sysprocesses WITH (nolock) WHERE dbid > 0 GROUP BY dbid 我在这里附加LTS,以及一个示例控制台应用程序,您可以使用它来演示它将使用池中的连接并且永远不会重复使用也不会释放它们。 您需要为LTS添加对System.Transactions.dll的引用以进行编译。 注意事项:它是打开和关闭SqlConnection的根级LTS,它始终在池中打开一个新连接。 嵌套LTS实例没有区别,因为只有根LTS实例建立了SqlConnection。 如您所见,连接字符串始终相同,因此应重用连接。 是否有一些我们没有遇到的神秘条件导致连接不被重复使用? 除了彻底改变之外,还有其他解决办法吗? public sealed class LocalTransactionScope […]

使用SqlBulkCopy插入数据时出错

我正在尝试使用SqlBulkCopy批量插入数据到SQL 2008。 这是我的表: IF OBJECT_ID(N’statement’, N’U’) IS NOT NULL DROP TABLE [statement] GO CREATE TABLE [statement]( [ID] INT IDENTITY(1, 1) NOT NULL, [date] DATE NOT NULL DEFAULT GETDATE(), [amount] DECIMAL(14,2) NOT NULL, CONSTRAINT [PK_statement] PRIMARY KEY CLUSTERED ( [ID] ASC ) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS […]