MySQL 4.1.14NT を使用しています。
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;
}