Ошибка таймаута в VB.NET при запуске сценария sql - PullRequest
0 голосов
/ 28 января 2011

Может кто-нибудь помочь, пожалуйста?Я пытаюсь создать вид сетки в Visual Studio, подключившись к серверу и используя хранимую процедуру.Я получаю ошибку тайм-аута при тестировании.Может кто-нибудь посоветовать мне, что я могу сделать?Сам запрос занимает около 7 минут.Данные хранятся в таблице.Что я могу сделать, чтобы продлить время ожидания?

Вот мой сценарий подключения:

<%@ Page Language="VB" AutoEventWireup="false" CodeFile="Default2.aspx.vb" Inherits="Default2" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>SQL-EDD 4 SERVER</title>
</head>
<body>
   <asp:GridView ID="GridView1" DataSourceID="SqlDataSource1" AutoGenerateColumns="False"
      runat="server">
      <Columns>
        <asp:BoundField DataField="DBNAME" HeaderText="DBNAME" SortExpression="DBNAME" />
        <asp:BoundField DataField="IMGS" HeaderText="IMGS" ReadOnly="True" 
              SortExpression="IMGS" />
          <asp:BoundField DataField="IMG_DATE_UPLOAD" HeaderText="IMG_DATE_UPLOAD" 
              ReadOnly="True" SortExpression="IMG_DATE_UPLOAD" />
      </Columns>
    </asp:GridView>
    <asp:SqlDataSource ID="SqlDataSource1" runat="server" SelectCommand="IMGCTR"
      ConnectionString="<%$ ConnectionStrings:JEFFREYEDD4 %>" 
        SelectCommandType="StoredProcedure" />


    <form id="form1" runat="server">
    <div>

    </div>
    </form>
</body>
</html>

КОД SQL НИЖЕ:

SET NOCOUNT ON
DECLARE @DBNAME NVARCHAR(MAX)
DECLARE @DBNAME1 NVARCHAR(MAX)
DECLARE @varSQL NVARCHAR(MAX)

DROP TABLE TEMPIMGCOUNTERSERVER3 
CREATE TABLE TEMPIMGCOUNTERSERVER3 
(DBNAME NVARCHAR(MAX),
IMG_DATE_UPLOAD DATETIME,
IMG_UPLOAD_COUNT INT)

DECLARE DBNAME CURSOR FAST_FORWARD FOR
SELECT [NAME] FROM sys.databases WHERE [name] like 'z%' and [name] not like 'Z1301_TEVA_SINGLE' AND [NAME] NOT LIKE 'Z1016_E-100016R'
AND CREATE_DATE BETWEEN GETDATE()-30 AND GETDATE()
ORDER BY [Name]

OPEN DBNAME

FETCH NEXT FROM DBNAME INTO @DBname
WHILE (@@FETCH_STATUS=0)
BEGIN

SET @DBNAME1=('USE ['+ @DBNAME +']')
EXEC SP_EXECUTESQL  @DBNAME1

    Set @varSQL='INSERT INTO TEMPIMGCOUNTERSERVER3 (DBNAME, IMG_UPLOAD_COUNT, IMG_DATE_UPLOAD) 
    SELECT ''['+@DBNAME+']'' AS DBNAME, SUM(PGCOUNT) AS IMAGES, convert(NVARCHAR(10), CREATED, 101) AS CREATED
        FROM ['+@DBNAME+'].dbo.tbldoc WHERE CREATED BETWEEN ''2011-01-16'' AND ''2011-01-22'' AND PGCOUNT >0 GROUP BY CREATED 
        HAVING SUM(PGCOUNT) IS NOT NULL'    
    EXEC SP_EXECUTESQL @varSQL

    FETCH NEXT FROM DBNAME 
    INTO @DBNAME
    END

    CLOSE DBNAME
    DEALLOCATE DBNAME

    INSERT TEMPIMGCOUNTERSERVER3 (DBNAME, IMG_UPLOAD_COUNT)  
    SELECT 'TOTAL_IMGSIZE_IN_MBS', SUM(IMG_UPLOAD_COUNT) FROM TEMPIMGCOUNTERSERVER3 

    SELECT  DBNAME, SUM(IMG_UPLOAD_COUNT) AS IMGS, convert(NVARCHAR(10), IMG_DATE_UPLOAD, 101) AS IMG_DATE_UPLOAD FROM TEMPIMGCOUNTERSERVER3 where IMG_UPLOAD_COUNT > 0
    GROUP BY DBNAME, IMG_DATE_UPLOAD
    ORDER BY IMG_DATE_UPLOAD 

Ошибка заключается в следующем:

Ошибка сервера в приложении «/ lawqlreporting».

Истекло время ожидания.Время ожидания истекло до завершения операции или сервер не отвечает.Заявление было прекращено.Описание: во время выполнения текущего веб-запроса произошло необработанное исключение.Пожалуйста, просмотрите трассировку стека для получения дополнительной информации об ошибке и о том, где она возникла в коде.

Сведения об исключении: System.Data.SqlClient.SqlException: Истекло время ожидания.Время ожидания истекло до завершения операции или сервер не отвечает.Оператор был прерван.

Ошибка источника:

Во время выполнения текущего веб-запроса было сгенерировано необработанное исключение.Информация о происхождении и местонахождении исключения может быть идентифицирована с помощью приведенной ниже трассировки стека исключений.

Трассировка стека:

[SqlException (0x80131904): истекло время ожидания.Время ожидания истекло до завершения операции или сервер не отвечает.Оператор был прерван.] System.Data.SqlClient.SqlConnection.OnError (исключение SqlException, логическое breakConnection) +1951450 System.Data.SqlClient.SqlInternalConnection.OnError (исключение SqlException, Boolean breakConnection.Data.Signer_Darser.dll) 4848.ThrowExceptionAndWarning (TdsParserStateObject stateObj) +194 System.Data.SqlClient.TdsParser.Run (runBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader DATASTREAM, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj) +2394 System.Data.SqlClient.SqlDataReader.ConsumeMetaData () +33 System.Data.SqlClient.SqlDataReader.get_MetaData () +83 System.Data.SqlClient.SqlCommand.FinishExecuteReader (SqlDataReader Д.С., runBehavior runBehavior, String resetOptionsString) +297 System.Data.SqlClient.SqlCommand.RunExecuteReaderTds (CommandBehavior cmdBehavior, runBehavior runBehavior, Boolean returnStream, Логическое асинхронное) +954 System.Data.SqlClient.SqlCommand.RunExecuteReader (CommandBehavior cmdBehavior, RunBehavior runBehavior, булево значение returnStream, метод String, результат DbAsyncResult) +162 System.Data.SqlClient.SqlCommand.RunExecuteReader (CommandBehavior cmdBehavior, RunBehavior runBehavior, метод BooleataBellSecreист_оценке), Метод String) +141 System.Data.SqlClient.SqlCommand.ExecuteDbDataReader (поведение CommandBehavior) +12 System.Data.Common.DbCommand.System.Data.IDbCommand.ExecuteReader (поведение CommandBehavior) +10 System.Data.Common.DbD.FillInternal (набор данных DataSet, DataTable [], datatables Int32 startRecord, Int32 maxRecords, String srcTable, команда IDbCommand, поведение CommandBehavior) +130 System.Data.Common.DbDataAdapter.Fill (набор данных DataSet max, Int32 StringRecordCord Intringкоманда, поведение CommandBehavior) +287 System.Data.Common.DbDataAdapter.Fill (DataSet dataSet, String srcTable) +92 System.Web.UI.WebControls.SqlDataSourceView.ExecuteSelect (DataSourceАргументы SelectArguments) +1297 System.Web.UI.DataSourceView.Select (Аргументы DataSourceSelectArguments, обратный вызов DataSourceViewSelectCallback) +19 System.Web.UI.WebControls.DataBoundControl.PerformSelect () +142 System.Web.UI.WebControlsContBaseBataData) +73 System.Web.UI.WebControls.GridView.DataBind () +4System.Web.UI.WebControls.BaseDataBoundControl.EnsureDataBound () +82 System.Web.UI.WebControls.CompositeDataBoundControl.CreateChildControls () +72 System.Web.UI.Control.EnsureChildControlW87 + SystemControlW (.PreRenderRecursiveInternal () +44 System.Web.UI.Control.PreRenderRecursiveInternal () +171 System.Web.UI.Page.ProcessRequestMain (логическое значение includeStagesBeforeAsyncPoint, логическое значение includeStagesAfterAsyncPoint) + 842

25 версия для МайкрософтВерсия .NET Framework: 2.0.50727.4952;ASP.NET версия: 2.0.50727.4955

Ответы [ 3 ]

4 голосов
/ 28 января 2011

Прежде всего - продление времени ожидания не является решением.Тем не менее, вот как вы делаете это с вашим источником данных:

protected void SqlDataSource1_Selecting(object sender,
SqlDataSourceSelectingEventArgs e)
{
e.Command.CommandTimeout = 30;
} 

Вот анализ, который вы должны выполнить:

Первый: удовлетворительно ли выполняется хранимая процедура при выполнении вне контекстастраница, например, в окне запроса?Если нет, проблема с запросом.Google "оптимизирует SQL-запрос", и вы получите кучу хороших вещей.

Если это произойдет, то как будут выполняться другие запросы в приложении (при условии, что это не первый, который вы пытаетесь получитьза работой)?Если они работают нормально, проверьте, что вы используете одну и ту же строку подключения.

1 голос
/ 28 января 2011

Чтобы увеличить время ожидания, вы можете увеличить CommandTimeout для DataCommand, которая извлекает данные.Когда вы используете SqlDataSource, это делается с помощью обработчика событий для получения команды.Вставьте следующее в код позади вашей страницы:

Private Sub SqlDataSource1_Selecting(sender as object, _
   e as SqlDataSourceSelectingEventArgs) handles SqlDataSource1.Selecting

   e.Command.CommandTimeout = 500 
End Sub

Чтобы увеличить тайм-аут запроса веб-приложения, вы должны установить для параметра executeTimeout подходящую длину, изменив веб-конфигурацию.

<httpRuntime
   executionTimeout = "600" 
/>

Но лучше, конечно, настроить ваш запрос.

0 голосов
/ 31 января 2011

Итак, вот подход, на который вы можете взглянуть без курсора.Я не запускал это, но с некоторыми изменениями это должно работать.

CREATE Table #TableNames (DBNameID INT Not NUll Identity, DBName VarCHAR(50))

CREATE TABLE #TableResults (DBNAME NVARCHAR(MAX),  IMG_DATE_UPLOAD DATETIME,  IMG_UPLOAD_COUNT INT)

Insert Into #TableNames(DBName)
SELECT [NAME] FROM sys.databases 
WHERE [name] like 'z%' and [name] not like 'Z1301_TEVA_SINGLE' 
AND [NAME] NOT LIKE 'Z1016_E-100016R' 
AND CREATE_DATE BETWEEN GETDATE()-30 AND GETDATE() ORDER BY [Name]

DECLARE @Counter INT = 1;
DECLARE @DBName VARCHAR(MAX)
DECLARE @varSQL NVARCHAR(MAX)
Declare @rows INT;
select @rows = COUNT(DBNameID) from #TableNames


While @Counter <= @rows BEGIN
    SET @DBName = (SELECT DBName from #TableNames where DBNameID = @Counter)

    Set @varSQL='INSERT INTO #TableResults (DBNAME, IMG_UPLOAD_COUNT, IMG_DATE_UPLOAD)      
SELECT ''['+@DBNAME+']'' AS DBNAME, SUM(PGCOUNT) AS IMAGES, convert(NVARCHAR(10), CREATED, 101) AS CREATED
FROM ['+@DBNAME+'].dbo.tbldoc WHERE CREATED BETWEEN ''2011-01-16'' AND ''2011-01-22'' AND PGCOUNT >0 GROUP BY CREATED          
HAVING SUM(PGCOUNT) IS NOT NULL' 

SET @Counter += 1
END

INSERT #TableResults (DBNAME, IMG_UPLOAD_COUNT)       
SELECT 'TOTAL_IMGSIZE_IN_MBS', SUM(IMG_UPLOAD_COUNT) 
FROM #TableResults       

SELECT  DBNAME, SUM(IMG_UPLOAD_COUNT) AS IMGS, convert(NVARCHAR(10), IMG_DATE_UPLOAD, 101) AS IMG_DATE_UPLOAD 
FROM #TableResults where IMG_UPLOAD_COUNT > 0     
GROUP BY DBNAME, IMG_DATE_UPLOAD     
ORDER BY IMG_DATE_UPLOAD

DROP TABLE #TableNames
DROP TABLE #TableResults

Если вы работаете над этим, он все еще занимает слишком много времени, возможно, вы захотите посмотреть, сколько времени потребуется для выполнения выбора, который вы выполняете на дБ.Если выполнение каждого из них занимает много времени, вам может потребоваться посмотреть план запроса для этой части самого запроса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...