[前][次][番号順一覧][スレッド一覧]

mysql:9587

From: bon <bon <bon@xxxxxxxxxx>>
Date: Thu, 10 Jun 2004 16:54:21 +0900
Subject: [mysql 09587] 更新する行が見つからない。


bonです。

OS:Windows 2000 Server
MySQL:mysql-4.0.18-win.zip
ODBC:MyODBC-3.51.06.exe
を使用しています。
ODBCのオプションは
Don't optimize column width
Return matching rows
にチェックしています。

以下のテーブルとデータを使用し、
−−−−−ここから−−−−−
DROP TABLE IF EXISTS testtbl;
CREATE TABLE testtbl (
  did varchar(16) NOT NULL default '',
  dt datetime default NULL,
  PRIMARY KEY  (did)
) TYPE=MyISAM;

INSERT INTO testtbl VALUES ('1','');
INSERT INTO testtbl VALUES ('2',NULL);
−−−−−ここまで−−−−−

データを放り込んだ結果は
mysql> desc testtbl;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| did   | varchar(16) |      | PRI |         |       |
| dt    | datetime    | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)

mysql> select * from testtbl;
+-----+---------------------+
| did | dt                  |
+-----+---------------------+
| 1   | 0000-00-00 00:00:00 |
| 2   | NULL                |
+-----+---------------------+
2 rows in set (0.00 sec)
です。

そして、以下を拡張子vbsで保存し
−−−−−ここから−−−−−
Const C_ActConn	= "dsn=hoge;uid=hogeuser;pwd=hogepass"

MsgBox ChgData(1),,"1"
MsgBox ChgData(2),,"2"

Function ChgData(a_did)

On Error Resume Next
	Set rs = CreateObject("ADODB.Recordset")
	strSql = "select * from testtbl where did='" & a_did & "'"
	rs.CursorType = 2
	rs.LockType = 3
	rs.Open strSql, C_ActConn
	If rs.EOF <> True Then
		rs.Fields("dt") = Date & " " & Time
		rs.Update
		If Err Then
			ChgData = "ERR"
		Else
			ChgData = "OK"
		End If
	End If
	rs.Close
	Set rs = Nothing
End Function
−−−−−ここまで−−−−−
実行すると、
最初はERRを表示され、次はOKと表示されます。

エラーの内容は
「更新する行が見つからなかったため、クエリ_ベースの更新に失敗しました。」
です。
更新する行があるにもかかわらずです。


これは、
datetimeに、''を挿入した場合、'0000-00-00 00:00:00'になる
MySQLのバグでしょうか?
SQL Serverでは、'1900-01-01 00:00:00.000'になり
select * from testtbl where isnull(dt,0)=0;
select * from testtbl where dt='1900-01-01';
で、2つのSQL文ともdid=2が返りますが、
MySQLでは、
mysql> select * from testtbl where isnull(dt)=1;
+-----+------+
| did | dt   |
+-----+------+
| 2   | NULL |
+-----+------+
1 row in set (0.00 sec)

mysql> select * from testtbl where dt='0000-00-00';
+-----+---------------------+
| did | dt                  |
+-----+---------------------+
| 1   | 0000-00-00 00:00:00 |
+-----+---------------------+
1 row in set (0.00 sec)

NULLと'0000-00-00'は別扱いでした。

それとも、
ODBCのバグでしょうか?
それとも
日付にnullか正当な値以外を挿入したら動作は保証できない
ということでしょうか?


よろしくお願いします。


-----------------
bon@xxxxxxxxxx

[前][次][番号順一覧][スレッド一覧]

->    9587 2004-06-10 16:54 [bon <bon@xxxxxxxxxx>] 更新する行が見つからない。              
      9594 2004-06-11 07:13 ┗[Kenji Irie <kenji@xx]                                       
      9595 2004-06-11 10:12  ┗[bon <bon@xxxxxxxxxx>]