DataAdapter.de remplissage(dataset) exception délai sur une base de données spécifique
Dans un VB.NET application (VS2005) je suis de l'appel d'une procédure stockée par le biais d'un SQLDataAdapter.
Sur ma base de données locale tout fonctionne bien. Si je fais cela sur une autre base de données que je reçois un délai d'attente d'exception.
c'est le code :
Public Overloads Shared Function ExecuteDataset( _
ByVal connection As SqlConnection, _
ByVal commandType As CommandType, _
ByVal commandText As String, _
ByVal ParamArray commandParameters() As SqlParameter) As DataSet
If (connection Is Nothing) Then Throw New ArgumentNullException("connection")
' Create a command and prepare it for execution
Dim cmd As New SqlCommand
Dim ds As New DataSet
Dim dataAdatpter As SqlDataAdapter
Dim mustCloseConnection As Boolean = False
dataAdatpter = Nothing
PrepareCommand(cmd, connection, CType(Nothing, SqlTransaction), commandType, commandText, commandParameters, mustCloseConnection)
cmd.CommandTimeout = 0 'I get a timeout exception if I leave this out
Try
' Create the DataAdapter & DataSet
dataAdatpter = New SqlDataAdapter(cmd)
' Fill the DataSet using default values for DataTable names, etc
dataAdatpter.Fill(ds)
' Detach the SqlParameters from the command object, so they can be used again
cmd.Parameters.Clear()
Finally
If (Not dataAdatpter Is Nothing) Then dataAdatpter.Dispose()
End Try
If (mustCloseConnection) Then connection.Close()
' Return the dataset
Return ds
End Function ' ExecuteDataset
J'ai exécuté la procédure stockée directement sur la base de données et qui fonctionne très bien et rapide.
J'ai aussi essayé de mettre la propriété CommandTimeout de cmd à 0.
Quand je fais cela de la procédure stockée est exécutée mais cela prend un temps très long.
De nouveau, même si je travaille sur une bd locale il n'y a pas de problèmes.
Ici est la stacktrace de l'exception délai
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(TdsParserStateObject stateObj)
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, RunBehavior runBehavior, Boolean returnStream, Boolean async)
at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result)
at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, 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)
at System.Data.Common.DbDataAdapter.FillInternal(DataSet dataset, DataTable[] datatables, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior)
at System.Data.Common.DbDataAdapter.Fill(DataSet dataSet, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior)
at System.Data.Common.DbDataAdapter.Fill(DataSet dataSet)
at KlantenApplicatie.BL.DAL.SQLHelper.ExecuteDataset(SqlConnection connection, CommandType commandType, String commandText, SqlParameter[] commandParameters) in C:\BitProjects\teamsystem\gerher\KlantenApplicatie.BL.DAL\sqlHelper\SQLHelper.vb:line 545
Toutes les idées sur ce qui pourrait être la cause de cela?
Oui, j'ai même exécuté la procédure stockée dans sql server avec les mêmes paramètres et cela fonctionne bien. La connectionstring dans tha application est crypté. Mais toutes les autres fonctionnalités fonctionne très bien et rapide de sorte que la connexion est cryptée chaîne fonctionne
pouvez-vous partager plein de code pour remplir un DataSet?
Le code est ajouté
À partir de votre code n'est pas possible de voir si la connexion est déjà ouvert lorsque vous appelez Remplir. Probablement que la connexion est fermée et que quelque chose l'empêche d'ouvrir. Si vous ajoutez une clause catch à votre Try/Enfin vous pouvez voir le message d'erreur exact et de faire rapport à ce sujet.
OriginalL'auteur Gert Hermans | 2013-01-02
Vous devez vous connecter pour publier un commentaire.
J'ai trouvé une solution.
Il s'est avéré être un problème de la détection des paramètres de requête optimalisation.
J'ai besoin d'ajouter l'OPTION(RECOMPILER) à sql qui crée de la procédure stockée.
le problème est expliqué ici:
http://www.sqlmag.com/article/sql-server/-using-the-recompile-query-hint-to-solve-parameter-sniffing-problems-94369
Et ici:
http://social.technet.microsoft.com/Forums/en-US/sqldatabaseengine/thread/74a85e26-be9b-4830-9638-6aa30fd9e3e7
OriginalL'auteur Gert Hermans