GVKun编程网logo

sql-server-2005 – 过程从ADO.NET中超时,但在SSMS中没有(pl/sql过程已成功完成)

19

如果您想了解sql-server-2005–过程从ADO.NET中超时,但在SSMS中没有和pl/sql过程已成功完成的知识,那么本篇文章将是您的不二之选。我们将深入剖析sql-server-2005

如果您想了解sql-server-2005 – 过程从ADO.NET中超时,但在SSMS中没有pl/sql过程已成功完成的知识,那么本篇文章将是您的不二之选。我们将深入剖析sql-server-2005 – 过程从ADO.NET中超时,但在SSMS中没有的各个方面,并为您解答pl/sql过程已成功完成的疑在这篇文章中,我们将为您介绍sql-server-2005 – 过程从ADO.NET中超时,但在SSMS中没有的相关知识,同时也会详细的解释pl/sql过程已成功完成的运用方法,并给出实际的案例分析,希望能帮助到您!

本文目录一览:

sql-server-2005 – 过程从ADO.NET中超时,但在SSMS中没有(pl/sql过程已成功完成)

sql-server-2005 – 过程从ADO.NET中超时,但在SSMS中没有(pl/sql过程已成功完成)

我有一个存储过程给我一个sqlException,因为我从代码运行它时超时(超时设置为30).当我直接在Management Studio中运行该过程时,它会在1秒内执行.我也只在针对特定数据库运行时获得超时.当我使用其他数据库时,它可以快速完成而不会出现错误.这是完整的错误消息:
System.Data.sqlClient.sqlException (0x80131904): Timeout expired.  The timeout period elapsed prior to completion of the operation or the server is not responding.
   at System.Data.sqlClient.sqlConnection.OnError(sqlException exception,Boolean breakConnection)
   at System.Data.sqlClient.sqlInternalConnection.OnError(sqlException exception,Boolean breakConnection)
   at System.Data.sqlClient.TdsParser.ThrowExceptionAndWarning()
   at System.Data.sqlClient.TdsParser.Run(RunBehavior runBehavior,sqlCommand cmdHandler,sqlDataReader dataStream,BulkcopySimpleResultSet bulkcopyHandler,TdsParserStateObject stateObj)
   at System.Data.sqlClient.sqlDataReader.ConsumeMetaData()
   at System.Data.sqlClient.sqlDataReader.get_MetaData()
   at System.Data.sqlClient.sqlCommand.FinishExecuteReader(sqlDataReader ds,RunBehavior runBehavior,String resetoptionsstring)
   at System.Data.sqlClient.sqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior,Boolean returnStream,Boolean async)
   at System.Data.sqlClient.sqlCommand.RunExecuteReader(CommandBehavior cmdBehavior,String method,DbAsyncResult result)
   at System.Data.sqlClient.sqlCommand.RunExecuteReader(CommandBehavior cmdBehavior,String method)
   at System.Data.sqlClient.sqlCommand.ExecuteReader(CommandBehavior behavior,String method)
   at System.Data.sqlClient.sqlCommand.ExecuteDbDataReader(CommandBehavior behavior)
   at System.Data.Common.DbCommand.System.Data.IDbCommand.ExecuteReader(CommandBehavior behavior)

这个堆栈跟踪对任何人都意味着什么?看起来我的sproc可能已经完成了,并且在尝试读取某种元数据时超时了?

我尝试在运行过程中查看该进程并将其暂停. sys.dm_os_waiting_tasks将等待类型显示为IO_COMPLETION,如果有任何用途的话.我在数据库中使用sp_who2’active’看到的唯一进程是一次超时和我的活动SSMS窗口,所以我不认为这是一个阻塞问题.我验证了这个数据库与工作数据库具有相同的权限,并运行dbcc checkdb而没有任何错误.如何确定超时的原因?

解决方法

您可以将超时的会话的SET选项与不是的会话的SET选项进行比较:
SELECT
    session_id,[ansi_defaults],[ansi_null_dflt_on],[ansi_nulls],[ansi_padding],[ansi_warnings],[arithabort],[concat_null_yields_null],[deadlock_priority],[quoted_identifier],[transaction_isolation_level]
FROM
    sys.dm_exec_sessions
WHERE
    session_id IN (<spid1>,<spid2>);

当您发现一些不同的情况时,请尝试将每个设置更改为SSMS查询中的相反设置,直到获得超时(或在发送查询之前手动设置应用程序代码中的选项).现在,我没有方便的2005实例,所以没有测试过这个查询.您可能需要注释掉一个或多个列名称.

.NET 中SQL Server 2000、SQL Server 2005 连接字符串

.NET 中SQL Server 2000、SQL Server 2005 连接字符串

摘要: SQL Server 2005和SQL Server 2000在数据库访问上面是通用的,关键在一个 连接 串的配置,其实这两个数据的 连接 串是可以通用的,关键是数据库服务器地址的问题。SQL Server 2005和2000数据库默认访问端口不一样。2005是2317,2000的是1433。 微软的

摘要:SQL Server 2005和SQL Server 2000在数据库访问上面是通用的,关键在一个连接串的配置,其实这两个数据的连接串是可以通用的,关键是数据库服务器地址的问题。SQL Server 2005和2000数据库默认访问端口不一样。2005是2317,2000的是1433。

 

 

微软的SQL Server 2005和SQL Server 2000在数据库访问上面是通用的,关键在一个连接串的配置,其实这两个数据的连接串是可以通用的,关键是数据库服务器地址的问题。SQL Server 2005和2000数据库默认访问端口不一样。2005是2317,2000的是1433。下面四个连接串都可以访问2000。   
 
Server=myServerAddress;Database=DatabaseName;Uid=UserName;Pwd=Password;  
Data Source=myServerAddress;Initial Catalog=DatabaseName;User ID=UserName;pwd=Password;  
Server=myServerAddress,1433;Database=DatabaseName;Uid=UserName;Pwd=Password;  
Data Source=myServerAddress,1433;Initial Catalog=DatabaseName;User ID=UserName;pwd=Password;   

 
myServerAddress是数据库服务器地址,当您只写地址不写端口的情况下他们默认访问的是1433端口,也就是sqlserver 2000的数据库服务器。如果你想访问sqlserver 2005你就必须加上访问端口(,2317)或者在后面添加(\SQLExpress),如下面   
 
Server=myServerAddress,2317;Database=DatabaseName;Uid=UserName;Pwd=Password;  
Data Source=myServerAddress,2317;Initial Catalog=DatabaseName;User ID=UserName;pwd=Password;  
Server=myServerAddress\SQLExpress;Database=DatabaseName;Uid=UserName;Pwd=Password;  
Data Source=myServerAddress\SQLExpress;Initial Catalog=DatabaseName;User ID=UserName;pwd=Password; 
  
 
通过对比你就会发现,这里面的关键部分就是端口, 只要端口对了就任何问题,至于他们的访问形式和方法是完全一样,因为他们虽然不是双胞胎但也是亲兄弟,沟通方式一样,唯一的就是名字不一样。

ADO.NET在SQLSERVER2005数据库的存储设计模式

ADO.NET在SQLSERVER2005数据库的存储设计模式

【xmzhaoym原创,请勿转载】

  • 1、自动返回自增ID自增值的方法

原理:ADO.NET对象sqlDataAdapter 在更新数据对象时,如更新DataTable或DaTarow时,sqlDataAdapter 的sqlCommand对象(InsertCommand、UpdateCommand )的返回值,会自动回写到DaTarow的相应字段名的值。通过这种方式可以将自增ID值和时间戳字段值返回到客户端ADO.NET对象中。具体实现要点如下:

 

    sqlDataAdapter da = new sqlDataAdapter();
    da.InsertCommand = this.insertCommand;
    da.UpdateCommand = this.updateCommand;
    da.DeleteCommand = this.deleteCommand;
    da.Update(this.dataTable);

 

假设自增表结构为

CREATE TABLE Test (
       ID                   smallint IDENTITY(1,1),
       Name                 varchar(20) NULL,
       LastChanged          timestamp NULL,
       PRIMARY KEY CLUSTERED (ID ASC)
)
go

 

InsertCommand 对应的存储过程:

 

CREATE PROCEDURE  dbo.TestInsert
(
 @Name varchar(20),
 @LastChanged timestamp
)
AS
INSERT INTO  dbo.Test
(
 Name
)
VALUES
(
 @Name
)

 

 --关键脚本,通过Select 字段名,实现返回值。sqlDataAdapter 对象自动将返回值回写到前台DaTarow对象
 Select ID,LastChanged From dbo.Test Where ID = @@IDENTITY 

GO

 

  • 2、避免数据行被多用户相互覆盖的方式

一个简单便捷的方法是在保存数据时,通过sqlSERVER2005的时间戳字段,检查数据是否被其他用户修改。

 

时间戳字段介绍:

时间戳字段 timestamp 是sqlSERVER2005新增的字段类型,它的作用在于:只要数据库的表增加一个时间戳字段,数据库系统将自动维护任何该表的行记录的修改时间戳,它是一个数值型,行记录只要有任何字段被修改,该时间戳字段将自动累加一个数值。这个机制,为检查行记录是否被其他用户修改提供了简单高效的支持。特别在两个副本表之间数据同步,或数据仓库需要差异读取子上次修改后的行记录,这些特备影响性能的查询,均可以用时间戳实现高效的查询。以往获取差异数据,往往要进行时间字段的对比。时间戳的数据累加基数是定位在表,也就是说时间戳的值在表里面一定是不重复的。

 

存储过程示例:

CREATE PROCEDURE  dbo.TestUpdate
(
@ID smallint,
@Name varchar(20),
@LastChanged timestamp
)
AS
UPDATE  dbo.Test SET
Name = @Name
WHERE
ID = @ID AND LastChanged=@LastChanged -- where条件加入时间戳条件,如果数据行被外部用户修改了,则时间戳值一定和当----前值不一致,导致更新0行,通过 “IF @@ROWCOUNT = 0” 判断,抛出异常,阻止外部保存

 

IF @@ROWCOUNT = 0
    RAISERROR('Row has been edited by another user',16,1)   

          
SELECT LastChanged    --每次修改,时间戳都会产生新值,所以最新值必须返回到前台客户端,原理同1介绍的方法。
FROM dbo.Test  WHERE ID = @ID


RETURN

 

 UI层注意事项

WINFORM的dataGridView1控件在显示timestamp字段时,会出现异常错误。实际上用户不需要在UI看到timestamp字段。

解决的方法,隐藏或删除grid的时间戳column列。如this.dataGridView1.Columns["LastChanged"].Visible = false。

asp.net – SQL Server查询从ADO.NET运行速度比SSMS慢

asp.net – SQL Server查询从ADO.NET运行速度比SSMS慢

我有一个网站的查询需要15-30秒的时间,同样的查询在.5秒内运行sql Server Management studio.使用sql Profiler不能看到任何锁定问题,也不能从SSMS手动重现延迟.一个星期前,我分离并重新连接数据库,这似乎奇迹般地解决了这个问题.今天,当这个问题再次丑陋的时候,我只想重建索引.这也解决了这个问题.但是,我认为这不一定是一个索引问题,因为索引不会自动重建在一个简单的分离/附加,据我所知.

有什么想法可能导致延误?我的第一个想法是,可能有一些参数嗅探存储过程被调用(所述存储过程运行CTE,如果重要)导致了一个坏的查询计划,这将解释问题的间歇性质.由于分离/重新连接和索引重建在理论上应该使缓存的查询计划无效,这是有道理的,但我不确定如何验证这一点.此外,为什么不通过SSMS手动运行相同的查询(直接从具有完全相同参数的sql Profiler复制)的查询显示相同的延迟?

有什么想法吗?

解决方法

如果一个坏的计划被缓存,那么SSMS也应该使用同样的坏的计划,如果你运行的是相同参数的查询.

找不到根本原因不能有更好的解决方案.试图偷看和戳捅各种设置,希望它修复问题永远不会给你实际确定的信心.此外,下一次系统可能会有一个不同的问题,你会相信这个同样的问题重新出现,并应用一个坏的解决方案.

最好的尝试是捕获坏的执行计划. Showplan XML Event Class Profiler事件是您的朋友,您可以获得ADO.Net电话的计划.这是一个非常重的事件,所以你应该附加分析器,并捕获它只有当问题出现在一个简短的会话.

查询IO统计信息也可以帮助. RPC:Completed和SQL: Batch Completed事件都包括读取和写入,因此您可以比较由ADO.Net调用与SSMS一个执行的逻辑IO的数量.大差异(完全相同的查询和参数)表示不同的计划.7003是另一个调查渠道.您可以在其中找到您的查询计划并检查执行统计信息.

所有这些都应该有助于确定问题是否是一个坏的计划或别的东西,首先.

ASP.NET中不使用LINQ访问 mssql server 2005数据库解决办法

ASP.NET中不使用LINQ访问 mssql server 2005数据库解决办法

.net中不使用linq访问 mssql server 2005解决办法

应用程序的数据访问是通过ado.net完成的,ado.net可以使web应用程序从各种数据源中快速访问数据。

在asp.net中不使用linq访问数据库,而是通过写sql文直接访问microsoft sql server 2005

1.添加引用system.configuration,并在程序中使用命名空间using system.configuration。

2."configurationmanager.connectionstrings["connectionstring"].connectionstring"中方括号中引号内的字符串和我的工程中web.config配置文件中标记中的属性"name="mywebconnectionstrings""的字符串不一致。正确的应为属性name中的字符串。

3.没有打开数据库连接。因为我的程序中缺少l了"sqlcon.open();”这句代码。

using system.data.sqlclient; using system.configuration; protected void setorders(sting morders)        { string sqlconnstr = configurationmanager.connectionstrings["mywebconnectionstrings"].connectionstring;                 sqlconnection sqlcon = new sqlconnection(sqlconnstr);                 sqlcommand commd = new sqlcommand();                 commd.connection = sqlcon;                 sqlcon.open();                 commd.commandtext = "update  orderlist set status = 1 where (orderid in (" + mpayingnum + ")"+")";                 sqldatareader sqldatareader = commd.executereader();                 commd = null;                 sqlcon.close();                 sqlcon = null; }

关于sql-server-2005 – 过程从ADO.NET中超时,但在SSMS中没有pl/sql过程已成功完成的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于.NET 中SQL Server 2000、SQL Server 2005 连接字符串、ADO.NET在SQLSERVER2005数据库的存储设计模式、asp.net – SQL Server查询从ADO.NET运行速度比SSMS慢、ASP.NET中不使用LINQ访问 mssql server 2005数据库解决办法等相关知识的信息别忘了在本站进行查找喔。

本文标签: