VFP 愛用者社區 首頁 VFP 愛用者社區
本討論區為 Visual Foxpro 愛用者經驗交流的地方, 請多多利用"搜尋"的功能, 先查看看有無前例可循, 如果還有不懂的再發問. 部份主題有附加檔案, 須先註冊成為社區居民才可以下載.
 
 常見問題常見問題   搜尋搜尋   會員列表會員列表   會員群組會員群組   會員註冊會員註冊 
 個人資料個人資料   登入檢查您的私人訊息登入檢查您的私人訊息   登入登入

MySQL 的數值資料, 只要是 8.1 之值的資料, 即過濾不出來

 
發表新主題   回覆主題    VFP 愛用者社區 首頁 -> VFP 討論區
上一篇主題 :: 下一篇主題  
發表人 內容
h580920



註冊時間: 2005-02-28
文章: 35


第 1 樓

發表發表於: 星期六 四月 09, 2011 12:15 pm    文章主題: MySQL 的數值資料, 只要是 8.1 之值的資料, 即過濾不出來 引言回覆

請教各位, 我最近遇到一個怪問題, 麻煩各位試試
1. 請在 mysql 上建立一個 numeric (8,2) 的欄位, 欄位名稱隨意 ex: qty
2. 新增一筆或數筆 8.1 之值的資料
3. 請下類似下面的 where 條件
n1=8.1
n2=8.1
where qty>=?n1 and qty<=?n2

where qty BETWEEN n1 and n2
則過濾結果會得空資料

但是只要是下面的情況之一, 就都可以過濾出資料
1. n1<>n2 值時
2. 只要 n1、n2 之值不等於8.1 時, 例如:9.1 or 7.1 .. 就都ok
3. 下 " where qty BETWEEN " + TRANSFORM(n1) + " AND " + TRANSFORM(n2)
4. 先將 n1 和 n2 之值轉換成「字串」ex: n1=tran(8.1) ... 就都 ok

我的 mysql = 5.0.51b vfp=9.0

不知是何原因? (嘗試過將 qty 欄位型態改成 decimal (8,2) 一樣結果)
回頂端
檢視會員個人資料 發送私人訊息
ckp6250



註冊時間: 2004-07-30
文章: 1645


第 2 樓

發表發表於: 星期六 四月 09, 2011 4:51 pm    文章主題: 引言回覆

若方便
把您的資料庫傳上來看看
回頂端
檢視會員個人資料 發送私人訊息 參觀發表人的個人網站
h580920



註冊時間: 2005-02-28
文章: 35


第 3 樓

發表發表於: 星期六 四月 09, 2011 5:33 pm    文章主題: 補上 mysql 的備份檔 .sql 和 測試碼 引言回覆

測試的 TABLE 只有一個 QTY 的欄位, 欄位結構=decimal(8,2)
測試的程式如下
N1=8.1
N2=8.1
A1 = SQLEXEC(SnHAN, "SELECT * FROM TEST1 WHERE QTY>=?n1 AND QTY<=?N2 ", "TMP1") && SnHAN 是我在別支程式中所建立的連線通道
MESSAGEBOX(A1) && A1 = 1 (奇怪 A1 =1, 但是 TMP1 卻是無任何資料)
SELECT TMP1
BROWSE
回頂端
檢視會員個人資料 發送私人訊息
ckp6250



註冊時間: 2004-07-30
文章: 1645


第 4 樓

發表發表於: 星期六 四月 09, 2011 10:40 pm    文章主題: 引言回覆

真是玄耶
我的測試結果也是一樣

還好我平常都不使用 ?n1 這種模式
不然, Bug 抓不完
回頂端
檢視會員個人資料 發送私人訊息 參觀發表人的個人網站
h580920



註冊時間: 2005-02-28
文章: 35


第 5 樓

發表發表於: 星期六 四月 09, 2011 11:00 pm    文章主題: 引言回覆

請問您不用 ?n1 方式, 那會是使用類似下面的方式嗎?
"WHERE SIZE_D>=" + TRANSFORM(n1) + " AND SIZE_D<="+TRANSFORM(n2)
此方式我測試是可以的
只是不曉得此問題是 VFP 還是 Mysql 的 bug
引言回覆:

n1=8.1
n2=8.1
where qty>=?n1 and qty<=?n2

where qty BETWEEN n1 and n2
則過濾結果會得空資料

修正 where qty BETWEEN n1 and n2
為 where qty BETWEEN ?n1 and ?n2
回頂端
檢視會員個人資料 發送私人訊息
LiuRambo



註冊時間: 2007-11-27
文章: 481


第 6 樓

發表發表於: 星期六 四月 09, 2011 11:17 pm    文章主題: 引言回覆

不好意思 插個話

用?是可以將外面的變數值 直接帶入到運算式嗎
回頂端
檢視會員個人資料 發送私人訊息 MSN Messenger
ckp6250



註冊時間: 2004-07-30
文章: 1645


第 7 樓

發表發表於: 星期日 四月 10, 2011 6:21 am    文章主題: 引言回覆

回 h580920 大大
我平常用的是如同您的
"WHERE SIZE_D>=" + TRANSFORM(n1) + " AND SIZE_D<="+TRANSFORM(n2) 這個模式

我一直覺得,兩個系統之間的溝通,
越單純越好,直接丟『結果』過去,會比丟『變數』要好

至於問題是 VFP 還是 Mysql 的 bug?
這就很難說了
經我測試, vfp 傳給 Mysql 的 ?n1 和 ?n2
Mysql 接收到的參數是正確的,它是真真實實接收到 8.1
VFP 並沒有傳錯參數

不過,如果您在 mysql 上寫一段程式
代碼:

CREATE DEFINER=`root`@`marco-desktop` PROCEDURE `proc_t`(in v1 decimal(8,2) , in v2 decimal(8,2))
begin
select * from test1 where qty between v1 and v2;
end;


然後,在vfp 中使用
代碼:

call proc_t(?n1,?n2)


這倒能正確查到資料

誰是誰非,真的說不清楚
有待高人指點了
回頂端
檢視會員個人資料 發送私人訊息 參觀發表人的個人網站
h580920



註冊時間: 2005-02-28
文章: 35


第 8 樓

發表發表於: 星期一 四月 11, 2011 12:36 pm    文章主題: 引言回覆

ckp6250 佩服您有先見之明, 還好我目前是將 SQLEXEC() 相關函數都包在「自訂函數」中使用, 或許在其中將 ? 傳入之值組合成字串, 應該可解決,否則就頭大了)

可否請教ckp6250, 關於 DATE 型態的欄位比對時, 您是否是以「日期字串」來比對處理 ex: date1='2010/01/01'

回 LiuRambo :我覺得應該是說 VFP 會將 ?所接變數內容傳給 SQL Server

另外麻煩一下各位有使用 mssql 的人, 以同樣的資料和方法幫我側一下, 是否會有同樣情況

寫了一小段程式, 測試 UPDATE 是否一樣, 又發現不只 8.1 之值, 像 8.2 也一樣 (但是奇怪的是, 在事後對 8.2 之資料使用 ?方式下 UPDATE 又可以, 被搞混了), 目前測試是只有「小數位」的資料才會出錯, 其他「字元」或「日期」或「int」
都未發現

LOCAL M_NUM, M_MSG
M_MSG = ""
Q_NUM = 0
FOR M_I=1 TO 90
Q_NUM = Q_NUM + 0.1
N1=Q_NUM
N2=Q_NUM
M_OK1 = SQLEXEC(SnHAN, "INSERT INTO test.test1 (QTY, NO1) VALUES (?Q_NUM, 'AAA') ")
IF M_OK1>=1
M_OK = SQLEXEC(SnHAN, "UPDATE test.test1 SET NO1='BBB' WHERE QTY>=?N1 AND QTY<=?N2 ")
* M_OK = SQLEXEC(SnHAN, "UPDATE test.test1 SET NO1='BBB' WHERE QTY>="+TRAN(N1)+" AND QTY<="+TRANSFORM(N2)) && 此法可得預期結果
IF M_OK<=0
M_MSG = M_MSG+CHR(13)+CHR(10)+TRANSFORM(Q_NUM)
ENDIF
ENDIF
ENDFOR
WAIT CLEAR
MESSAGEBOX(M_MSG)
回頂端
檢視會員個人資料 發送私人訊息
ckp6250



註冊時間: 2004-07-30
文章: 1645


第 9 樓

發表發表於: 星期一 四月 11, 2011 3:15 pm    文章主題: 引言回覆

回 h580920
日期比對,就如同您所說的方式。

至於測試問題,小弟個人覺得,實在毋庸耗廢力氣去測試
VFP這種『where qty>=?n1 and qty<=?n2 』的用法,我一直認為很邪門
不知道是否為 VFP 或微軟的獨創?
不知道 Delphi 或 C 或 java 有沒有類似用法?
回頂端
檢視會員個人資料 發送私人訊息 參觀發表人的個人網站
syntech



註冊時間: 2003-05-16
文章: 4213
來自: Taipei,Taiwan

第 10 樓

發表發表於: 星期一 四月 11, 2011 4:12 pm    文章主題: 引言回覆

應該要先找看看 mysql 有沒有類似 mssql 的 profiler 工具,
可以監看 mysql 究竟收到怎樣的命令.

就 mssql 而言,
vfp 發出去的是一個參數化查詢(Parameterized Query 或 Parameterized Statement)命令

http://zh.wikipedia.org/wiki/%E5%8F%83%E6%95%B8%E5%8C%96%E6%9F%A5%E8%A9%A2


所以應該要關注在 vfp 是否發出正確的命令.


在delphi/bcb 也可以把sql命令做成參數化,
其實這樣可以避免做成字串命令時的型態轉換錯誤,或是遇到單雙引號破壞sql命令的情況.

_________________
如果公司有下列困擾:
1. 找不到便宜,快速,簡易的 生產排程軟體
2. 不知道如何快速排定 採購計劃
3. 成本抓不準,自己算比軟體算有用
4. 想學習系統規劃,想找系統架構的顧問

請聯絡我們,也許我們幫得上忙
回頂端
檢視會員個人資料 發送私人訊息 發送電子郵件 AIM Address
syntech



註冊時間: 2003-05-16
文章: 4213
來自: Taipei,Taiwan

第 11 樓

發表發表於: 星期一 四月 11, 2011 4:23 pm    文章主題: 引言回覆

舉一個例子:
vfp 中
代碼:

clot_no= '10B03328'
STMT = "SELECT  convert(char,DATE_STA,112) AS DATE_STA,convert(char,DATE_END,112) AS DATE_END,PMS_MAO_M.*  "
STMT = STMT+" FROM PMS_MAO_M  "
STMT = STMT+" WHERE  LOT_NO =  ?cLOT_NO "
=SQLEXEC(xConnHandle,STMT,'MAO')


ms sql server 會收到:
代碼:

exec sp_executesql N'SELECT  convert(char,DATE_STA,112) AS DATE_STA,convert(char,DATE_END,112) AS DATE_END,PMS_MAO_M.*   FROM PMS_MAO_M    WHERE  LOT_NO =  @P1  ', N'@P1 varchar(8)', '10B03328'



我不知道mysql 會出現什麼,
但你可以自己照vfp做出來的參數化命令執行看看,
是否也會出現同樣問題

_________________
如果公司有下列困擾:
1. 找不到便宜,快速,簡易的 生產排程軟體
2. 不知道如何快速排定 採購計劃
3. 成本抓不準,自己算比軟體算有用
4. 想學習系統規劃,想找系統架構的顧問

請聯絡我們,也許我們幫得上忙
回頂端
檢視會員個人資料 發送私人訊息 發送電子郵件 AIM Address
syntech



註冊時間: 2003-05-16
文章: 4213
來自: Taipei,Taiwan

第 12 樓

發表發表於: 星期一 四月 11, 2011 4:33 pm    文章主題: 引言回覆

bcb的做法 (與delphi 大同小異)
代碼:

  tempSQL->Close();
  tempSQL->SQL->Clear();
  tempSQL->SQL->Add("delete tmplist where TRAN_NO='INT'and PRG_NO='WKSB51' and CREA_D=:STIME");   // :表示稍後提供參數內容
  tempSQL->ParamByName("STIME")->ParamType = ptInputOutput;
  tempSQL->ParamByName("STIME")->DataType = ftDateTime;    // 指定參數型態
  tempSQL->ParamByName("STIME")->Value = Now();      // 指定參數值
  tempSQL->ExecSQL();



ms sql server 收到:
代碼:

exec sp_executesql N'delete tmplist where TRAN_NO=''INT''and PRG_NO=''WKSB51'' and CREA_D=@P1
', N'@P1 datetime', '04 11 2011  4:35:15:927PM'

_________________
如果公司有下列困擾:
1. 找不到便宜,快速,簡易的 生產排程軟體
2. 不知道如何快速排定 採購計劃
3. 成本抓不準,自己算比軟體算有用
4. 想學習系統規劃,想找系統架構的顧問

請聯絡我們,也許我們幫得上忙
回頂端
檢視會員個人資料 發送私人訊息 發送電子郵件 AIM Address
ckp6250



註冊時間: 2004-07-30
文章: 1645


第 13 樓

發表發表於: 星期一 四月 11, 2011 5:52 pm    文章主題: 引言回覆

感謝 syntech 提點
我在第七樓有提到
VFP 的 ? n1 , 發給 Mysql 的『數值』是正確的。
只不過, 不知道為什麼 Mysql 查不出資料

但, 若是用 內儲程式去接收 ?n1
則又執行無誤

若按照syntech大大的說法及提供的連結,
Mysql 也是支援參數化查詢 http://zh.wikipedia.org/wiki/%E5%8F%83%E6%95%B8%E5%8C%96%E6%9F%A5%E8%A9%A2#MySQL

那麼, 是否可以判定,這個 bug 該算在 Mysql 頭上?
回頂端
檢視會員個人資料 發送私人訊息 參觀發表人的個人網站
從之前的文章開始顯示:   
發表新主題   回覆主題    VFP 愛用者社區 首頁 -> VFP 討論區 所有的時間均為 台北時間 (GMT + 8 小時)
1頁(共1頁)

 
前往:  
無法 在這個版面發表文章
無法 在這個版面回覆文章
無法 在這個版面編輯文章
無法 在這個版面刪除文章
無法 在這個版面進行投票
無法 在這個版面附加檔案
無法 在這個版面下載檔案


Powered by phpBB © 2001, 2005 phpBB Group
正體中文語系由 phpbb-tw 維護製作