2017-03-12 1 views
0

Je développe un système de surveillance d'assiduité et j'ai besoin de calculer la différence de temps entre OutTime et InTime. Le problème est que je ne peux pas le faire parce que la valeur InTime est dans la base de données, je n'arrive pas à le paramétrer. Ma requête fonctionne avec le mode de requête d'Access mais pas avec C#. Voici mon code pour le bouton de temporisation.Temps de calcul C# Utilisation de la requête

private void savetimeout() 
    { 
     OleDbCommand command = new OleDbCommand(); 
     command.Connection = connection; 
     command.CommandText = @" UPDATE TimeinTimeout 
            SET OutTime = @1 AND HoursWorked = ROUND(([OutTime]-[InTime])*24,2) 
            WHERE EmployeeID = @2 AND InDate = @3"; 
     command.Parameters.Clear(); 
     command.Parameters.AddWithValue("@1", DateTime.Now.ToLongTimeString()); 


     command.Parameters.AddWithValue("@2", textBox1.Text); 
     command.Parameters.AddWithValue("@3", DateTime.Now.ToShortDateString()); 

     command.ExecuteNonQuery(); 
     MessageBox.Show("Data Saved!"); 
     this.Hide(); 
     Form1 Mm = new Form1(); 
     Mm.ShowDialog(); 

    } 
+0

Les champs OutTime, InTime et InDate de type DateTIme? Indiquez le schéma de la table de base de données et indiquez-nous les valeurs présentes dans la table au moment où vous exécutez cette requête. – Steve

+0

Oui, tous sont la date et l'heure, alors quelle est la prochaine étape? –

+0

OutTime doit être défini sur DateTime.Now, alors que, HoursWorked peut être défini avec la différence entre OutTime - InTime – Steve

Répondre

0

Si je comprends bien, vous avez un champ OutTime que vous voulez régler avec l'heure et, dans la même requête, vous voulez calco la différence entre la valeur connue dans le champ InTime et le courant temps.

Vous pouvez utiliser une requête comme celui-ci

command.CommandText = @"UPDATE TimeinTimeout 
         SET HoursWorked = @1-[InTime], 
         OutTime = @2 
         WHERE EmployeeID = @3 AND InDate = @4"; 

command.Parameters.Add("@1", OleDbType.Date).Value = DateTime.Now; 
command.Parameters.Add("@2", OleDbType.Date).Value = DateTime.Now; 
// Is this field really a string? 
// If not use the appropriate type and convert the textbox.text 
command.Parameters.Add("@3", OleDbType.VarWChar).Value = textBox1.Text; 
command.Parameters.Add("@4", OleDbType.Date) = DateTime.Today; 
command.ExecuteNonQuery(); 

Notez que de ne pas confondre le moteur de base de données, vous devez spécifier exactement ce que vos paramètres sont. L'utilisation de AddWithValue avec le champ DateTime et le passage d'une chaîne créent un problème car votre moteur de base de données doit convertir ces chaînes en valeurs datetime et cette conversion peut générer des problèmes inattendus. Toujours spécifier exactement le type de vos paramètres.

+0

Il est dit "Index était en dehors des limites du tableau" même que mes tentatives précédentes –

+0

Sur quelle ligne? ... – Steve

+0

Aucune idée, c'est juste une boîte aux messages –