2011-10-05 81 views
4

我在Visual Studio中使用SQL在數據庫中發生convserion錯誤。.net c#sql字符串到日期轉換錯誤

我正在使用的數據庫是一個普通的sql服務器數據庫。 它被賦予我作爲我的任務。

這是我的查詢方法是我的web

[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; 
     } 

    } 

有一個與正常人一樣的查詢沒有問題:

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

錯誤:

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

你的「正常查詢」(第二個例子)只是時機已經成熟虐待......這是一種致命的查詢。我可以用這種網絡訪問方法殺死你的服務器。 –

+0

驗證你的日期格式 – Boomer

+0

marc gravell這是一個沒有1會殺死的學校作業。值'24/09/2011'從數據庫中複製而來。 – user904406

回答

6

你應該處理與日期在C#中使用時間解析邏輯(以您接受的格式),並將其作爲參數傳遞,即

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

並添加一個SqlParameter與您想要的DateTime值;這樣...沒有問題。在數據庫中沒有解析,也沒有注入風險。並且查詢計劃也可以重複使用。全面勝利。

例如:

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

@DepartureDate代表什麼?我如何使用它? – user904406

+0

@ user904406是您要添加的*參數*; 2秒,我會充實更多的例子(尋找編輯) –

2

馬克Gravell是絕對正確的。不過,試試這個:

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

我沒有.format函數爲我的字符串。我如何使用它? – user904406

+0

對不起,應該是dairport.toString(「yyyMMdd」) – Boomer

0

你的錯誤說:「從字符串轉換日期和/或時間時,轉換失敗。」

使用SQL日期替換該行

DateTime date = Convert.ToDateTime(ddate); 

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

嘗試了這一點...

+0

對不起,我不認爲它與轉換有關。我已經刪除它,錯誤來自第一個SQL查詢是「SELECT * FROM Flight_Schedule S WHERE S.departure_date = '24/09/2011'」。一個非常簡單的查詢,不應該給出任何錯誤。第二個sql查詢只是一個帶有機場代碼字符串(不是日期)的普通查詢。 – user904406

0

作爲最佳實踐的規則,如果你必須指定日期你的SQL查詢,總是嘗試使用ISO格式(yyyy-MM-dd)。在大多數情況下,它將防止出現任何轉換錯誤。

在您的代碼:

​​

克里斯