Forum: ADO.NET |
Thema:
Unerklärlicher Fehler |
Von:
Stephan (
31.03.2005 12:22) |
Hallo,
ich hab in meinem Projekt eine Stelle an der ich eine Stored Proc ausführe mit Execute Reader. Da ich aber weiters dann die Daten in Form einer Datatable benötige habe ich mir eine Funktion aus dem Internet kopiert, welche die Daten umwandelt. Das hat bisher immer gut funktioniert, aber nun ist die Datenmenge, welche durch ExecuteReader aufgerufen wird gewaltig gewachsen und nun kann es passieren, dass es nicht funktioniert. Leider kann ich mir diesen Fehler nicht erklären, darum hier der Code:
Dim objConn As New SqlClient.SqlConnection()
Dim objCommand As SqlClient.SqlCommand = objConn.CreateCommand
Dim objReader As SqlClient.SqlDataReader
Dim dtResult As DataTable
Dim drResult As DataRow
Dim alList As New ArrayList()
objCommand.CommandType = CommandType.StoredProcedure
objCommand.CommandText = "sp_Applicant_Search"
objCommand.CommandTimeout = 0
With objCommand.Parameters
.Add("@Query", xstrXML)
.Add("@SiteID", xiSiteID)
.Add("@MaxRows", iMaxRows)
.Add("@TotalCount", SqlDbType.Int)
End With
objCommand.Parameters("@Query").Direction = ParameterDirection.Input
objCommand.Parameters("@SiteID").Direction = ParameterDirection.Input
objCommand.Parameters("@MaxRows").Direction = ParameterDirection.Input
objCommand.Parameters("@TotalCount").Direction = ParameterDirection.Output
While Not ADO.Open(objConn)
'Try to open the connection
End While
objReader = objCommand.ExecuteReader
dtResult = ADO.ConvertDataReaderToDataTable(objReader)
ADO.Open ist eine von mir geschriebene Funktion, welche die Connection öffnet und True zurückgibt, wenn dies erfolgreich war.
Convert Datareader to Datatable:
Public Shared Function ConvertDataReaderToDataTable(ByRef reader As SqlDataReader) As DataTable
Dim schemaTable As dataTable = reader.GetSchemaTable()
Dim dataTable As dataTable = New dataTable()
Dim intCounter As Integer
Dim iTemp As Integer = 0
For intCounter = 0 To schemaTable.Rows.Count - 1
Dim dataRow As DataRow = schemaTable.Rows(intCounter)
Dim columnName As String = CType(dataRow("ColumnName"), String)
Dim column As DataColumn = New DataColumn(columnName, _
CType(dataRow("DataType"), Type))
dataTable.Columns.Add(column)
Next
While reader.Read()
Dim dataRow As DataRow = dataTable.NewRow()
For intCounter = 0 To reader.FieldCount - 1
dataRow(intCounter) = reader.GetValue(intCounter)
Next
dataTable.Rows.Add(dataRow)
iTemp += 1
Debug.WriteLine("Row: " & iTemp)
End While
Return dataTable
End Function
Der Fehler tritt in der Funktion ConvertDataReaderToDatatable auf und zwar in der Zeile:
dataRow(intCounter) = reader.GetValue(intCounter)
Der Fehler der ausgegeben wird:
System.Data.SqlClient.SqlException: Timeout ist abgelaufen. Das Zeitlimit wurde vor dem Beenden des Vorgangs überschritten oder der Server reagiert nicht.
at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, TdsParserState state)
at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, TdsParserState state)
at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning()
at System.Data.SqlClient.TdsParser.ReadNetlib(Int32 bytesExpected)
at System.Data.SqlClient.TdsParser.ReadBuffer()
at System.Data.SqlClient.TdsParser.ReadByteArray(Byte[] buff, Int32 offset, Int32 len)
at System.Data.SqlClient.TdsParser.ReadEncodingChar(Int32 length, Encoding encoding)
at System.Data.SqlClient.TdsParser.ReadValue(_SqlMetaData md, Int32 length)
at System.Data.SqlClient.TdsParser.ProcessRow(_SqlMetaData[] columns, Object[] buffer, Int32[] map, Boolean useSQLTypes)
at System.Data.SqlClient.SqlDataReader.PrepareRecord(Int32 i)
at System.Data.SqlClient.SqlDataReader.GetValue(Int32 i)
at epunkt.DataAccess.ADO.ConvertDataReaderToDataTable(SqlDataReader& reader) in C:\Projekt\develop\DataAccess\Database\ADO.vb:line 649
at epunkt.DataAccess.Applicant.Applicant.Search(String xstrXML, Int32 xiSiteID, Int32& xiTotalCount, Int32 iMaxRows) in C:\Projekt\develop\DataAccess\Applicant\Applicant.vb:line 559
Kann mir bitte jemand sagen wie es zu diesem Fehler kommt?
LG
Stephan
Betreff |
Von |
Datum |
|
|
Stephan
|
31.03.2005 12:43 |
|
|
Re: Unerklärlicher Fehler
so unerklärlich ist das doch nicht, <br>der Timeout ist abgelaufen, was du ja selber einräumst an der großen datenmenge leigt<br><br>Die Dauer kann man per CommandTimeout einstellen |
|
|
|
|
|
Hannes
Preishuber
|
31.03.2005 12:45 |
|
|
G.
Guest
|
02.05.2005 11:15 |
|
|
Re: Unerklärlicher Fehler
Beginnt der Name einer SP mit "sp_", so nimmt der SQL Server an, dass dies ein System-Procedure ist und sucht diese folglich zuerst in der master db ! Findet er sie dort nicht verwendet er die... |
|
|
|
|
|
G.
Guest
|
10.11.2005 15:17 |
|
|
Antworten
Vorsicht bei der Eingabe: Die Zeichen ' oder -- sind nicht erlaubt!