|
VFP 愛用者社區 本討論區為 Visual Foxpro 愛用者經驗交流的地方, 請多多利用"搜尋"的功能, 先查看看有無前例可循, 如果還有不懂的再發問. 部份主題有附加檔案, 須先註冊成為社區居民才可以下載.
|
上一篇主題 :: 下一篇主題 |
發表人 |
內容 |
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 文章主題: |
|
|
不好意思 插個話
用?是可以將外面的變數值 直接帶入到運算式嗎 |
|
回頂端 |
|
|
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 中使用
這倒能正確查到資料
誰是誰非,真的說不清楚
有待高人指點了 |
|
回頂端 |
|
|
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. 想學習系統規劃,想找系統架構的顧問
請聯絡我們,也許我們幫得上忙 |
|
回頂端 |
|
|
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. 想學習系統規劃,想找系統架構的顧問
請聯絡我們,也許我們幫得上忙 |
|
回頂端 |
|
|
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. 想學習系統規劃,想找系統架構的顧問
請聯絡我們,也許我們幫得上忙 |
|
回頂端 |
|
|
ckp6250
註冊時間: 2004-07-30 文章: 1645
第 13 樓
|
|
回頂端 |
|
|
|
|
您 無法 在這個版面發表文章 您 無法 在這個版面回覆文章 您 無法 在這個版面編輯文章 您 無法 在這個版面刪除文章 您 無法 在這個版面進行投票 您 無法 在這個版面附加檔案 您 無法 在這個版面下載檔案
|
|