2015-07-20 2 views
0

J'ai créé un service Windows qui extrait des données d'une base de données locale et exécute une fonction. Pour se connecter à la base de données j'ai écrit le code suivantWindows Le service ne démarre pas en raison de DataAdapter.Fill()

SqlConnection connstring1; 
      string conn1 = ConfigurationManager.ConnectionStrings["nameOfConnectionString"].ConnectionString.ToString(); 
      connstring1 = new SqlConnection(conn1); 
      connstring1.Open(); 
      string cmd = "Select [OrderId], [VendorId], [txtPaymentMethod] , [txtPaymentStatus], [Updated_On] FROM [Postmate_ Shopping].[dbo].[tbl_Order_Master] WHERE [txtPaymentMethod] = 'online' AND [txtPaymentStatus]= 'pending'"; 
      DataTable dt = new DataTable(); 
      DataSet ds = new DataSet(); 
      SqlDataAdapter da1 = new SqlDataAdapter(cmd, connstring1); 
      da1.Fill(ds); 
      da1.Dispose(); 
      connstring1.Close(); 

Le code avant da1.Fill (ds); fonctionne et le service est installé mais quand da1.Fill (ds); est inclus dans le code, le service ne démarre pas. J'ai essayé le même code dans une application web et ça marchait bien. C'est ce que j'ai quand da1.Fill (ds); est inclus:

Le service "ScheduledService" sur l'ordinateur local démarré puis arrêté. Certains services s'arrêtent automatiquement s'ils ne sont pas utilisés par d'autres services ou programmes.

Pour vérifier si le service fonctionne correctement j'ai supprimé le code ci-dessus et remplacé par ce code:

FileStream fs = new FileStream(@"d:\ScheduledService.txt", 
FileMode.OpenOrCreate, FileAccess.Write); 
//set up a streamwriter for adding text 
StreamWriter sw = new StreamWriter(fs); 

//find the end of the underlying filestream 
sw.BaseStream.Seek(0, SeekOrigin.End); 

//add the text 
sw.WriteLine(content); 
//add the text to the underlying filestream 
sw.Flush(); 
//close the writer 
sw.Close(); 

le service a bien fonctionné. J'ai essayé de rechercher le problème mais aucune solution pertinente n'a pu être trouvée. S'il vous plaît aider. Merci d'avance.

Demandez plus de précisions si nécessaire.

EDIT: Avez-vous des idées sur l'utilisation de DataTeader?

+0

Etes-vous sûr la chaîne de connexion est correcte, et que la requête exécute contre cette connexion sans erreurs? – StingyJack

+0

Oui, le même code que j'ai essayé dans une application web et qui a bien fonctionné. EDIT: Il récupère les valeurs de la base de données. – ashwinx

+0

Utilisez-vous l'utilisateur Windows pour vous connecter à DB? –

Répondre

1

C'est parce que da1.Fill (ds) est l'échec avec une exception. Vérifiez le journal des événements s'il existe des détails sur l'exception. En regardant votre code, 1) Pas besoin d'ouvrir et de fermer la connexion car l'adaptateur fait cela pour vous, 2) La méthode élimination doit être après votre fermeture. 3) Utilisez la portée "using" pour vos objets DB qui s'occuperont de la disposition implicite.

Enfin, ne le faites pas au démarrage du service. Le démarrage du service est vraiment pour toute initialisation et devrait revenir le plus tôt possible. Lancer un thread pour effectuer d'autres activités.

+0

Pour vérifier le journal des événements, je suis allé à ** Observateur d'événements >> Windows Logs >> Système **. J'ai vérifié les entrées sous ** Service Control Manager ** et les détails étaient les suivants: ** Un délai d'attente (30000 millisecondes) a été atteint en attendant une réponse de transaction du service Service1. ** – ashwinx

+0

Et l'ouverture et la fermeture des connexions et l'utilisation disposer étaient des tentatives désespérées pour faire fonctionner le code: P. – ashwinx

+0

okie qui précise que votre code sql a une exception. Essayez d'exécuter le code dans une application de console et assurez-vous que la connectivité fonctionne correctement. – XtremeBytes

0

Vous avez indiqué dans les commentaires que vous utilisez l'authentification Windows et que votre service fonctionne probablement sous le compte du système local. Utilisez l'authentification du serveur SQL ou définissez le service pour l'exécuter sous votre compte Windows.

Aller aux services, vos propriétés de service et sur onglet Connexion choisissez votre utilisateur Windows:

enter image description here

+0

D'accord, je vais essayer ça. THanks – ashwinx

+0

Pouvez-vous suggérer les changements que je vais devoir faire? – ashwinx

+0

MERCI A TONN !!!! Cela a travaillé l'homme .. – ashwinx