none
Une connexion a été établie avec le serveur, mais une erreur s'est ensuite produite pendant le processus d'ouverture de session.

    Question

  • Bonjour à tous,

     

    J'ai créé un programme dans lequel j'essaie de me connecter avec SQLConnection à une base Sql Server 2005 Express sp2.

    Pour celà, je sélectionne dans un Datagridview un server ( le chargement se fait par SQLDataSourceEnumerator et GetDataSources).Puis je saisis le nom de l'utilisateur et le mot de passe ( authentification SQL Server : les instances SQL Server se trouvent sur du XP Pro ou Home  sur un réseau Workgroup ==> pas d'authentification Windows possible).

    Le bout de code ( en C# ) est :

    SqlConnectionStringBuilder bu = new SqlConnectionStringBuilder();

    bu.ApplicationName = Commun.Produit;

    bu.DataSource = Nom;

    bu.InitialCatalog = "master";

    bu.IntegratedSecurity = false;

    bu.UserID = utilisateur;

    bu.Password = motdepasse;

    SqlConnection con = new SqlConnection(bu.ConnectionString);

    con.Open();

    MessageBox.Show("Connection ouverte");

    con.Close();

     

    La connection est OK à la première sélection .

    Mais si je fais une nouvelle sélection et une nouvelle saisie pour l'urilisateur et mot de passe : plantage avec l'erreur

    Une connexion a été établie avec le serveur, mais une erreur s'est ensuite produite pendant le processus d'ouverture de session. (provider: Fournisseur TCP, error: 0 - Le nom réseau spécifié n'est plus disponible.)

     

    L'exception System.Data.SqlClient.SqlException n'a pas été gérée
      Message="Une connexion a été établie avec le serveur, mais une erreur s'est ensuite produite pendant le processus d'ouverture de session. (provider: Fournisseur TCP, error: 0 - Le nom réseau spécifié n'est plus disponible.)"
      Source=".Net SqlClient Data Provider"
      ErrorCode=-2146232060
      Class=20
      LineNumber=0
      Number=64
      Server="CHAMBRE\\SQLEXPRESS"
      State=0
      StackTrace:
           à System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection)
           à System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj)
           à System.Data.SqlClient.TdsParserStateObject.ReadSniError(TdsParserStateObject stateObj, UInt32 error)
           à System.Data.SqlClient.TdsParserStateObject.ReadSni(DbAsyncResult asyncResult, TdsParserStateObject stateObj)
           à System.Data.SqlClient.TdsParserStateObject.ReadPacket(Int32 bytesExpected)
           à System.Data.SqlClient.TdsParserStateObject.ReadBuffer()
           à System.Data.SqlClient.TdsParserStateObject.ReadByte()
           à System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj)
           à System.Data.SqlClient.SqlInternalConnectionTds.CompleteLogin(Boolean enlistOK)
           à System.Data.SqlClient.SqlInternalConnectionTds.AttemptOneLogin(ServerInfo serverInfo, String newPassword, Boolean ignoreSniOpenTimeout, Int64 timerExpire, SqlConnection owningObject)
           à System.Data.SqlClient.SqlInternalConnectionTds.LoginNoFailover(String host, String newPassword, Boolean redirectedUserInstance, SqlConnection owningObject, SqlConnectionString connectionOptions, Int64 timerStart)
           à System.Data.SqlClient.SqlInternalConnectionTds.OpenLoginEnlist(SqlConnection owningObject, SqlConnectionString connectionOptions, String newPassword, Boolean redirectedUserInstance)
           à System.Data.SqlClient.SqlInternalConnectionTds..ctor(DbConnectionPoolIdentity identity, SqlConnectionString connectionOptions, Object providerInfo, String newPassword, SqlConnection owningObject, Boolean redirectedUserInstance)
           à System.Data.SqlClient.SqlConnectionFactory.CreateConnection(DbConnectionOptions options, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningConnection)
           à System.Data.ProviderBase.DbConnectionFactory.CreatePooledConnection(DbConnection owningConnection, DbConnectionPool pool, DbConnectionOptions options)
           à System.Data.ProviderBase.DbConnectionPool.CreateObject(DbConnection owningObject)
           à System.Data.ProviderBase.DbConnectionPool.UserCreateRequest(DbConnection owningObject)
           à System.Data.ProviderBase.DbConnectionPool.GetConnection(DbConnection owningObject)
           à System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection)
           à System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory)
           à System.Data.SqlClient.SqlConnection.Open()
           à Gestion_Médicale.ConnexionForm.testBtn_Click(Object sender, EventArgs e) dans F:\VS2005\Projets VC#\Gestion Médicale\Gestion Médicale\ConnexionForm.cs:ligne 70
           à System.Windows.Forms.Control.OnClick(EventArgs e)
           à System.Windows.Forms.Button.OnClick(EventArgs e)
           à System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
           à System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
           à System.Windows.Forms.Control.WndProc(Message& m)
           à System.Windows.Forms.ButtonBase.WndProc(Message& m)
           à System.Windows.Forms.Button.WndProc(Message& m)
           à System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
           à System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
           à System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
           à System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
           à System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(Int32 dwComponentID, Int32 reason, Int32 pvLoopData)
           à System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
           à System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
           à System.Windows.Forms.Form.ShowDialog(IWin32Window owner)
           à System.Windows.Forms.Form.ShowDialog()
           à Gestion_Médicale.ServeurForm.testBtn_Click(Object sender, EventArgs e) dans F:\VS2005\Projets VC#\Gestion Médicale\Gestion Médicale\ServeurForm.cs:ligne 70
           à System.Windows.Forms.Control.OnClick(EventArgs e)
           à System.Windows.Forms.Button.OnClick(EventArgs e)
           à System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
           à System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
           à System.Windows.Forms.Control.WndProc(Message& m)
           à System.Windows.Forms.ButtonBase.WndProc(Message& m)
           à System.Windows.Forms.Button.WndProc(Message& m)
           à System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
           à System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
           à System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
           à System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
           à System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(Int32 dwComponentID, Int32 reason, Int32 pvLoopData)
           à System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
           à System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
           à System.Windows.Forms.Form.ShowDialog(IWin32Window owner)
           à System.Windows.Forms.Form.ShowDialog()
           à Gestion_Médicale.AccueilForm.GMServeurBtn_Click(Object sender, EventArgs e) dans F:\VS2005\Projets VC#\Gestion Médicale\Gestion Médicale\AccueilForm.cs:ligne 111
           à System.Windows.Forms.Control.OnClick(EventArgs e)
           à System.Windows.Forms.Button.OnClick(EventArgs e)
           à System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
           à System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
           à System.Windows.Forms.Control.WndProc(Message& m)
           à System.Windows.Forms.ButtonBase.WndProc(Message& m)
           à System.Windows.Forms.Button.WndProc(Message& m)
           à System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
           à System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
           à System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
           à System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
           à System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(Int32 dwComponentID, Int32 reason, Int32 pvLoopData)
           à System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
           à System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
           à System.Windows.Forms.Application.Run(Form mainForm)
           à Gestion_Médicale.Program.Main() dans F:\VS2005\Projets VC#\Gestion Médicale\Gestion Médicale\Program.cs:ligne 18
           à System.AppDomain.nExecuteAssembly(Assembly assembly, String[] args)
           à System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
           à Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
           à System.Threading.ThreadHelper.ThreadStart_Context(Object state)
           à System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
           à System.Threading.ThreadHelper.ThreadStart()

    Je n'ai jamais rencontré ce genre d'erreur en 2 ans de programmation C# 2005 et SQL Server 2005 Express Edition.

    Est-ce que quelqu'un pourrait m'aider à résoudre ce problème ?

     

    Merci d'avance et bonne journée

     

    NB : la chaîne de connection au plantage est :

    {Data Source=CHAMBRE\SQLEXPRESS;Initial Catalog=master;Integrated Security=False;User ID=sa;Password=XXXYYY;Application Name="Gestion Médicale"} 

     

    Au 1er essai, la chaîne de connexion est;

    +  base {Data Source=LAMBIN-274404DC\SQLEXPRESS;Initial Catalog=master;Integrated Security=False;User ID=sa;Password=XXX;Application Name="Gestion Médicale"} 

     

    Détail : CHAMBRE est le poste où s'exécute le programme (XP Pro ).L'autre poste est un XP Home.

    Le problème est le même quel que l'ordre des postes de travail ( Chambre en 1er ou en 2ème : le plantage a eu sur le 2ème essai)

    Thursday, November 15, 2007 6:53 AM

Answers

  • Bonjour,

     

    J'ai trouvé la solution à mon problème

     

    try

    {

    con.Open();

    }

    catch ( SqlException ex )

    {

    if ( ex.Errors[0].Number == 64 )

    {

    // Service Sql Server de l'instance Beta arrété sur le poste Alpha  ( Nom = Alpha\Beta )

    String NomService;

    if ( String.IsNullOrEmpty(Beta) )

    {

    NomService = "MSSQLSERVER";

    }

    else

    {

    NomService = "MSSQL$" + Beta;

    }

    if ( Alpha.Equals(Environment.MachineName) )

    {

    ManagedComputer mc = new ManagedComputerAlpha);

    Service service = mc.Services[NomService];

    service.Start();

    while ( !service.State.Equals(ServiceState.Running) )

    {

    service.Refresh();

    }

    // maintenant le service est démarré relancer la connexion

    MessageBox.Show("Recommencer le test de connexion","Service " + NomService + " démarré";

    }

    else

    {

    MessageBox.Show("Vous n'êtes pas sur le poste de l'instance","Démarrer le service " = nomservice");

    }

    }

    }

     

    ManagedComputer necessite

    using Microsoft.SqlServer.Management.SMO.WMI;   

    ne pas oublier d'ajouter au projet la référence à cette librairie

     

    !!! Attention ManagedComputer ne peut fonctionner à preesque tous les coups que s'il est utilisé sur le poste de travail où s'execute le programme. Il peut fonctionner en réseau si l'on est à l'intérieur d'un domaine ( à condition d'en avoir la permission ) mais il se plantera si l'on est sur un réseau type "Workgroup" .

     

    C'est en utilisant Errors que je ne suis aperçu que l'erreur 64 correspondait à un service SQL Server non démarré : dans ce cas , l'instance SQL Server n'est pas visible sur le réseau sauf pour les classes de SMO.WMI ( ces classes sont très interessantes tant que l'on reste sur son poste ou que l'on est dans un domaine Windows Server mais dans un Workgroup , on ne peut utiliser l'authentification Windows  et adieu SMO.WMI )

     

    En réalité, 64 est un numéro d'index sur la collection de messages d'erreur de l'instance SQL Server et pourrait changer avec SQL Server 2008

     

    En espérant que ce post pourra être utile.

     

    Bonne journée

     

    Je vais essayer de marquer ce post comme répondu.

    Sunday, December 16, 2007 4:51 PM

All replies

  • Bonjour à tous,

     

    j'ai trouvé les 2 raisons de ce prpblème:

    1) j'utilise la livebox comme routeur et j'ai remarqué que j'ai ce problème lorsque la livebox n'arrive plus à accéder à Internet

    2) la 2ème raison est beaucoup plus génante car elle est liée à SQL Server 2005 : ce "plantage" se produit lorsque le service SQL Server de l'instance n'est pas démarrée ou a été arrété

     

    La 2ème raison est génante car le message , me semble-t-il, est faux ou il traduit un décalage énorme entre la réaction  de SQLDatasource.Enumerator.GetDataSources() et SqlConnection.Open().

    Je conçois que ces 2 fonctions agissent de façon différente mais il serait beaucoup plus simple pour SqlConnection.Open() de renvoyer : problème avec le service SQL Server que le nom réseau n'est plus disponible ( à moins que ce ne soit un problème de traduction dans le "fichier" des messages d'erreurs ).

    J'ai dû faire un certain nombre d'essais avant de pouvoir mieux cerner les origines du problème.

    J'ai fait le test aussi avec SSMSE :

    clic droit sur une instance dans la liste des serveurs inscrits puis propriétés puis propriétés de connexion puis tester

    - cas ou l'instance est démarrée :  apparition du message test de la connexion réussie

    - cas où l'instance est arrêtée    : message

    TITRE : Modifier les propriétés d'inscription du serveur
    ------------------------------

    Échec du test du serveur inscrit. Vérifiez le nom du serveur, les informations d'identification de connexion, la base de données, puis cliquez sur Tester à nouveau.

    ------------------------------
    INFORMATIONS SUPPLÉMENTAIRES :

    Une connexion a été établie avec le serveur, mais une erreur s'est ensuite produite pendant le processus d'ouverture de session. (provider: Fournisseur TCP, error: 0 - Le nom réseau spécifié n'est plus disponible.) (Microsoft SQL Server, Erreur : 64)

    Pour obtenir de l'aide, cliquez sur : http://go.microsoft.com/fwlink?ProdName=Microsoft+SQL+Server&EvtSrc=MSSQLServer&EvtID=64&LinkId=20476

    ------------------------------
    BOUTONS :

    OK
    ------------------------------
    message peu clair et surtout il faudrait peut-être suggérer de vérifier le démarrage de l'instance , ce qui permettrait de corriger le problème très rapidement

     

    j'ai fait le test en mettant le service SQL serveur en pause : le message obtenu est beaucoup plus clair

    TITRE : Modifier les propriétés d'inscription du serveur
    ------------------------------

    Échec du test du serveur inscrit. Vérifiez le nom du serveur, les informations d'identification de connexion, la base de données, puis cliquez sur Tester à nouveau.

    ------------------------------
    INFORMATIONS SUPPLÉMENTAIRES :

    Le service SQL Server a été interrompu. Aucune nouvelle connexion ne sera autorisée. Pour redémarrer ce service, utilisez SQL Computer Manager ou l'application Services dans le Panneau de configuration.
    Échec de l'ouverture de session de l'utilisateur ''. (Microsoft SQL Server, Erreur : 17142)

    Pour obtenir de l'aide, cliquez sur : http://go.microsoft.com/fwlink?ProdName=Microsoft+SQL+Server&EvtSrc=MSSQLServer&EvtID=17142&LinkId=20476

    ------------------------------
    BOUTONS :

    OK
    ------------------------------
    dans ce cas, il est précisé que le service a été interrompu.

    Alors pourquoi ne pas faire la même chose dans le cas où le service est arrété ?

     

     

    J'ignore si l'on peut considérer cet incident comme un "bug" et d'ailleurs je ne sais pas comme le transmettre à Microsoft.

    Quelqu'un pourrait-il me conseiller ?

     

    J'espère que cet incident pourra servir à d'autres personnes.

     

    Bonne journée à tous et merci d'avance

    Saturday, November 17, 2007 8:44 AM
  • Bonjour,

     

    J'ai trouvé la solution à mon problème

     

    try

    {

    con.Open();

    }

    catch ( SqlException ex )

    {

    if ( ex.Errors[0].Number == 64 )

    {

    // Service Sql Server de l'instance Beta arrété sur le poste Alpha  ( Nom = Alpha\Beta )

    String NomService;

    if ( String.IsNullOrEmpty(Beta) )

    {

    NomService = "MSSQLSERVER";

    }

    else

    {

    NomService = "MSSQL$" + Beta;

    }

    if ( Alpha.Equals(Environment.MachineName) )

    {

    ManagedComputer mc = new ManagedComputerAlpha);

    Service service = mc.Services[NomService];

    service.Start();

    while ( !service.State.Equals(ServiceState.Running) )

    {

    service.Refresh();

    }

    // maintenant le service est démarré relancer la connexion

    MessageBox.Show("Recommencer le test de connexion","Service " + NomService + " démarré";

    }

    else

    {

    MessageBox.Show("Vous n'êtes pas sur le poste de l'instance","Démarrer le service " = nomservice");

    }

    }

    }

     

    ManagedComputer necessite

    using Microsoft.SqlServer.Management.SMO.WMI;   

    ne pas oublier d'ajouter au projet la référence à cette librairie

     

    !!! Attention ManagedComputer ne peut fonctionner à preesque tous les coups que s'il est utilisé sur le poste de travail où s'execute le programme. Il peut fonctionner en réseau si l'on est à l'intérieur d'un domaine ( à condition d'en avoir la permission ) mais il se plantera si l'on est sur un réseau type "Workgroup" .

     

    C'est en utilisant Errors que je ne suis aperçu que l'erreur 64 correspondait à un service SQL Server non démarré : dans ce cas , l'instance SQL Server n'est pas visible sur le réseau sauf pour les classes de SMO.WMI ( ces classes sont très interessantes tant que l'on reste sur son poste ou que l'on est dans un domaine Windows Server mais dans un Workgroup , on ne peut utiliser l'authentification Windows  et adieu SMO.WMI )

     

    En réalité, 64 est un numéro d'index sur la collection de messages d'erreur de l'instance SQL Server et pourrait changer avec SQL Server 2008

     

    En espérant que ce post pourra être utile.

     

    Bonne journée

     

    Je vais essayer de marquer ce post comme répondu.

    Sunday, December 16, 2007 4:51 PM