2013-02-06 33 views
0

我正在使用MySQL 4.1.14NT。訪問MySql的ADO.NET - 無法將MySQL日期/時間值轉換爲System.DateTime

我使用ADO.NET和MySQL連接器來查詢具有日期時間字段

當我運行查詢,我得到的錯誤「無法MySQL的日期/時間值轉換爲System.DateTime表「

我發現的唯一解決方法是將」Allow Zero Datetime = true「添加到數據庫的連接字符串中。

停止錯誤,但現在在數據集中,某些日期字段返回日期01/01/0001 00:00:00,但是當我在查詢瀏覽器中運行查詢時,它們具有正常的日期值。

我該怎麼辦?

編輯:

CREATE TABLE `notam_status` (
    `DEMAND_ID` decimal(6,0) NOT NULL default '0', 
    `NOTAM_KEY` varchar(25) NOT NULL default '', 
    `AIRPORT` varchar(5) default NULL, 
    `ARR_DEP` char(1) default NULL, 
    `DEP_DATETIME` datetime default NULL, 
    `ARR_DATETIME` datetime default NULL, 
    `NOTAM_TEXT` text, 
    `LAST_MOD_DATETIME` datetime default NULL, 
    `STATUS` char(1) default NULL, 
    `STATUS_BY` varchar(15) default NULL, 
    `STATUS_DATETIME` datetime default NULL, 
    `SOURCE_ID` char(1) default NULL, 
    `ACCOUNT_ID` varchar(10) default NULL, 
    `NOTAM_ID` varchar(9) default NULL, 
    `NOTAM_PART` decimal(3,0) default NULL, 
    `CNS_LOCATION_ID` varchar(10) default NULL, 
    `REMARKS` text, 
    `TRIPNUMBER` decimal(6,0) default NULL, 
    PRIMARY KEY (`DEMAND_ID`,`NOTAM_KEY`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COMMENT='InnoDB free: 11264 kB; InnoDB free: 7168 kB'; 

下面是我使用的代碼:

private List<Notam> GetNotamsFor(string airport) 
      { 
       List<Notam> result = new List<Notam>(); 

       string sql = 
        @"SELECT a.source_id, a.account_id, a.notam_id, a.notam_part, a.cns_location_id, cast(a.last_mod_datetime as datetime), a.notam_report, a.q_code, a.effective_datetime, a.expire_datetime 
         FROM notams a 
         WHERE (a.cns_location_id = ?airport 
         OR a.cns_location_id = ?kairport) 
         AND a.source_id != 'F' 
         AND (a.cancel_datetime IS NULL OR a.cancel_datetime > UTC_Timestamp()) 
         AND (a.delete_datetime IS NULL OR a.delete_datetime > UTC_Timestamp()) 
         "; 

       MySqlParameter[] parameters = new MySqlParameter[] 
       { 
        new MySqlParameter 
        { 
         ParameterName="airport", 
         MySqlDbType=MySqlDbType.String, 
         Value=airport 
        }, 
        new MySqlParameter 
        { 
         ParameterName="kairport", 
         MySqlDbType=MySqlDbType.String, 
         Value="k"+airport 
        } 
       }; 

       DataSet ds = RunMySqlQuery(sql, "weather", parameters); 

       // If I look at the dataset, the field "last_mod_datetime' 
       // has the value 01/01/0001 00:00:00 

       if (ds.Tables.Count > 0) 
        foreach (DataRow r in ds.Tables[0].Rows) 
        { 
         result.Add(NotamFiller.FillFrom(r)); 
        } 

       return result; 
      } 

private DataSet RunMySqlQuery(string sql, string database, MySqlParameter[] parameters) 
     { 

      DataSet ds = new DataSet(); 
      try 
      { 
       MySqlCommand mc = new MySqlCommand(sql, _MySqlConnection); 
       if (parameters != null) 
        mc.Parameters.AddRange(parameters); 
       var adapter = new MySqlDataAdapter(mc); 
       adapter.Fill(ds); 
      } 
      catch (Exception ex) 
      { 
       Console.WriteLine(ex.ToString()); 
      } 

      return ds; 
     } 
+0

你能指出哪些值導致你的問題? –

+0

你的模式是什麼樣的,你的代碼是什麼樣的?你確定你要求填寫數據而不是null嗎? (一個簡短但完整的程序+ schema +數據證明這個問題會使這個問題更容易診斷。) –

+1

你是否必須使用一個7歲以上的MySQL版本?你有沒有在更新的版本上嘗試過相同的代碼? –

回答

0

原來,填充表的其他代碼在更新日期字段時使用帶​​有MySqlDBType.String的MySqlParameter而不是MySqlDBType.Timestamp,並且它結束存儲01 -01-0001 00:00在日期字段中。

0

輪番出在填充表的代碼中存在的問題。 MySQLParameter類的MySqlDBType被設置爲字符串而不是時間戳

相關問題