2011-10-05 4 views
4

Je rencontre une erreur convserion pour la base de données en utilisant SQL dans Visual Studio..net C# chaîne sql à date erreur de conversion

La base de données que j'utilise est une base de données SQL Server normale. Il me est donné comme ma mission.

C'est ma méthode de requête est mon webservice

[WebMethod] 
    public bool search(string ddate, string dairport, string aairport, string seat) 
    { 
     int seat2 = Convert.ToInt32(seat); 
     DateTime date = Convert.ToDateTime(ddate); 

     String query1 = "SELECT * FROM Flight_Schedule S WHERE S.departure_date = '24/09/2011'"; 

     using (SqlConnection connect = new SqlConnection(conn)) 
     { 
      SqlCommand cmd = new SqlCommand(query1, connect); 
      connect.Open(); 
      SqlDataReader result = cmd.ExecuteReader(); 
      try 
      { 
       if (result.Read()) 
       { 
        return true; 
       } 

      finally 
      { 
       result.Close(); 
       connect.Close(); 
       connect.Dispose(); 
      } 
      return false; 
     } 

    } 

Il n'y a pas de problème avec les requêtes normales comme:

"SELECT * FROM Flight_Schedule S WHERE S.origin_airport_code = '" + dairport + "'"; 

Erreur:

System.Data.SqlClient.SqlException: Conversion failed when converting date and/or time from character string. 
    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.HasMoreRows() 
    at System.Data.SqlClient.SqlDataReader.ReadInternal(Boolean setTimeout) 
    at System.Data.SqlClient.SqlDataReader.Read() 
    at AirportService.AirportServices.search(String ddate, String dairport, String aairport, String seat) in C:\Users\XXXXX\Documents\Visual Studio 2010\Projects\WebService2\AirportService\AirportServices.asmx.cs:line 47 
+2

Votre "requête de la normale" (deuxième exemple) est juste RIPE un abus ... qui est une requête MORTEL. Je pourrais tuer votre serveur avec cette méthode accessible sur le Web. –

+0

vérifiez le format de votre date – Boomer

+0

margra gravell c'est une tâche scolaire que personne ne tuerait. la valeur '24/09/2011 'est copiée de la base de données. – user904406

Répondre

6

Vous devriez gérer la date- logique d'analyse du temps (dans votre format accepté) à l'intérieur du C#, et le transmettre comme paramètre, par exemple

String query1 = "SELECT * FROM Flight_Schedule S WHERE S.departure_date = @departureDate" 

et ajouter un SqlParameter avec la valeur DateTime que vous voulez; De cette façon ... pas de problèmes. Pas d'analyse à la DB, et aucun risque d'injection. Et la réutilisation du plan de requête aussi. Gagne tout le tour.

Par exemple:

DateTime when = DateTime.Parse(ddate); // better to use ParseExact and formally state the format you are using 
const string query1 = "SELECT * FROM Flight_Schedule S WHERE S.departure_date = @departureDate"; 

using (SqlConnection connect = new SqlConnection(conn)) 
{ 
    using (SqlCommand cmd = new SqlCommand(query1, connect)) 
    { 
     cmd.Parameters.AddWithValue("departureDate", when); 
     connect.Open(); 
     using (SqlDataReader result = cmd.ExecuteReader()) 
     { 
      ... etc 
     } 
    } 
} 
+0

à quoi sert @DepartureDate? comment je l'utilise? – user904406

+0

@ user904406 c'est le * paramètre * que vous ajouteriez; 2 secs, je vais étoffer plus de l'exemple (chercher une édition) –

2

Marc Gravell est tout à fait raison. Mais essayez ceci:

"SELECT * FROM Flight_Schedule S WHERE S.origin_airport_code = '" + dairport.ToString("yyyyMMdd") + "'"; 
+0

je n'ai pas de fonction .format pour ma chaîne. comment je l'utilise? – user904406

+0

désolé, il devrait être dairport.toString ("yyyMMdd") – Boomer

0

Votre erreur dit « Échec de la conversion date et/ou le temps de chaîne de caractères. »

Remplacez cette ligne

DateTime date = Convert.ToDateTime(ddate); 

Pour

IFormatProvider theCultureInfo = new System.Globalization.CultureInfo("en-GB", true); 
DateTime theDateTime = DateTime.ParseExact(ddate, "mm-dd-yyyy", theCultureInfo); 

Try this out ...

+0

désolé, je ne pense pas que cela a à voir avec convertir. Je l'avais enlevé et l'erreur est venue de la première requête sql qui est "SELECT * FROM Flight_Schedule S O WH S.departure_date = '24/09/2011 '". une requête très simple qui ne devrait pas donner d'erreur. la deuxième requête sql est juste une requête normale avec une chaîne du code d'aéroport (pas de date). – user904406

0

En règle générale, de bonnes pratiques par date SQL, si vous devez indiquer la date à votre requête SQL, essayez toujours d'utiliser le format ISO (aaaa-MM-jj). Dans la plupart des cas, cela empêchera toute erreur de conversion.

Dans votre code:

"SELECT * FROM Flight_Schedule S WHERE S.origin_airport_code = '" + ddate.ToString("yyyy-MM-dd") + "'"; 

Kris