全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:2721
推到 Plurk!
推到 Facebook!

SQLite Locate 型態不支援

答題得分者是:GrandRURU
boy330077
一般會員


發表:39
回覆:59
積分:19
註冊:2009-10-15

發送簡訊給我
#1 引用回覆 回覆 發表時間:2015-01-19 16:18:20 IP:211.20.xxx.xxx 訂閱
 var
SQLite:TSimpleDataSet;
strPath:string;
dbExist:Boolean;
i:integer;
begin
inherited;
strPath:=ExtractFilePath(Application.ExeName) 'temp.sqlite';
dbExist:=FileExists(strPath);
SQLConnection1.Params.Values['Database'] := strPath;
SQLConnection1.Connected:=True;
SQLite:=TSimpleDataSet.Create(self);
SQLite.Connection:=SQLConnection1;
if not dbExist then
begin
SQLite.DataSet.CommandText:=
' CREATE TABLE "prod_data" ( ' #13
' "prod_barcode" TEXT, ' #13
' "prod_name" TEXT );';
SQLite.Execute;
end;
SQLite.Close;
SQLite.DataSet.CommandType:=ctTable;
SQLite.DataSet.CommandText:='prod_data';
SQLite.Open;
SQLite.Locate('prod_barcode','PP00000001',[]);
SQLite.Free;
end;


//---------------------------

錯誤訊息為 Field 'prod_barcode' is of an unsupported type

看起來因該是 不支援的型態
所以我換過 char(20) , varcahr(20), nvarchar(20) 都是一樣的錯誤

開始懷疑難道 SQLite 不支援? 但是 LOACTE 因該是 元件做的事情 只要連上了因該和資料庫沒有關係?
請前輩指導
GrandRURU
站務副站長


發表:234
回覆:1651
積分:1742
註冊:2005-06-21

發送簡訊給我
#2 引用回覆 回覆 發表時間:2015-01-19 17:18:54 IP:59.120.xxx.xxx 訂閱
prod_barcode 被識別為什麼欄位型態?

===================引 用 boy330077 文 章===================
var
SQLite:TSimpleDataSet;
strPath:string;
dbExist:Boolean;
i:integer;
begin
inherited;
strPath:=ExtractFilePath(Application.ExeName) 'temp.sqlite';
dbExist:=FileExists(strPath);
SQLConnection1.Params.Values['Database'] := strPath;
SQLConnection1.Connected:=True;
SQLite:=TSimpleDataSet.Create(self);
SQLite.Connection:=SQLConnection1;
if not dbExist then
begin
SQLite.DataSet.CommandText:=
' CREATE TABLE "prod_data" ( ' #13
' "prod_barcode" TEXT, ' #13
' "prod_name" TEXT );';
SQLite.Execute;
end;
SQLite.Close;
SQLite.DataSet.CommandType:=ctTable;
SQLite.DataSet.CommandText:='prod_data';
SQLite.Open;
SQLite.Locate('prod_barcode','PP00000001',[]);
SQLite.Free;
end;


//---------------------------

錯誤訊息為 Field 'prod_barcode' is of an unsupported type

看起來因該是 不支援的型態
所以我換過 char(20) , varcahr(20), nvarchar(20) 都是一樣的錯誤

開始懷疑難道 SQLite 不支援? 但是 LOACTE 因該是 元件做的事情 只要連上了因該和資料庫沒有關係?
請前輩指導
boy330077
一般會員


發表:39
回覆:59
積分:19
註冊:2009-10-15

發送簡訊給我
#3 引用回覆 回覆 發表時間:2015-01-20 09:03:47 IP:211.20.xxx.xxx 訂閱
意思是  prod_barcode 

1. 被 delphi 視為 什麼型態嗎?
我不知道從哪裡看

2. 我要Locate 的型態嗎?
是字串,所以我建表的欄位都是選擇字串型態
locate的語法以前也是這樣下,因該沒有問題

//----------------------------------------------------------------------------------------------

不過我有發現 假設我用Navicat 先建一筆資料進去 Locate就不會錯誤
GrandRURU
站務副站長


發表:234
回覆:1651
積分:1742
註冊:2005-06-21

發送簡訊給我
#4 引用回覆 回覆 發表時間:2015-01-20 16:50:59 IP:59.120.xxx.xxx 訂閱
prod_barcode 
沒資料前是
TBlobField?
TMemoField?
TWideField?

有資料後?

如果是 TBlobField ,那 Locate 的確是不能使用的

===================引 用 boy330077 文 章===================
意思是 prod_barcode

1. 被 delphi 視為 什麼型態嗎?
我不知道從哪裡看

2. 我要Locate 的型態嗎?
是字串,所以我建表的欄位都是選擇字串型態
locate的語法以前也是這樣下,因該沒有問題

//----------------------------------------------------------------------------------------------

不過我有發現 假設我用Navicat 先建一筆資料進去 Locate就不會錯誤
boy330077
一般會員


發表:39
回覆:59
積分:19
註冊:2009-10-15

發送簡訊給我
#5 引用回覆 回覆 發表時間:2015-01-21 15:27:24 IP:211.20.xxx.xxx 訂閱
我再建立 prodbarcode 時 都刻意挑  TEXT  或是   CHAR(20)......
理論上來說 建起來 因該是字串型態

用 navicat 去看也是字串型態

只是從DELPHI 端不知道 怎麼看 DESIGN 狀態下好像連不上 所以無法判定到底是哪種型態
老大仔
尊榮會員


發表:77
回覆:835
積分:1082
註冊:2006-07-06

發送簡訊給我
#6 引用回覆 回覆 發表時間:2015-01-21 17:25:23 IP:210.61.xxx.xxx 未訂閱
不知道以下對你有沒有幫助...
希望有...@@

[code delphi]
procedure TForm1.Button1Click(Sender: TObject);
var
i: Integer;
begin
for i := 0 to SimpleDataSet1.FieldCount - 1 do
begin
ShowMessage(FieldtypeNames[SimpleDataSet1.Fields[i].DataType]);
end;
end;

[/code]


===================引 用 boy330077 文 章===================
我再建立 prodbarcode 時 都刻意挑 TEXT 或是 CHAR(20)......
理論上來說 建起來 因該是字串型態

用 navicat 去看也是字串型態

只是從DELPHI 端不知道 怎麼看 DESIGN 狀態下好像連不上 所以無法判定到底是哪種型態
P.D.
版主


發表:571
回覆:3880
積分:3666
註冊:2006-10-31

發送簡訊給我
#7 引用回覆 回覆 發表時間:2015-01-22 13:02:18 IP:118.169.xxx.xxx 未訂閱
你要不要嘗試使用 FireDAC 來操作看看
boy330077
一般會員


發表:39
回覆:59
積分:19
註冊:2009-10-15

發送簡訊給我
#8 引用回覆 回覆 發表時間:2015-01-23 14:03:18 IP:211.20.xxx.xxx 訂閱
感謝 老大仔

已經取得欄位型態測試

CREATE TABLE 後 就算給的是 CHAR(20) DELPHI 仍認為是 wideMemo 型態

但是我用 navicat 給予一行資料後 卻變成了 widestring 型態

-------------------------------------------

所以原因是在 wideMemo 不能locate
給了一筆資料DELPHI 又認為他是 widestring 忽然又可以 locate

難道就沒有辦法 create 以後 告訴 delphi 他是 wideString (強制轉換型態之類的???)

--------------------回P.D. 大
FireDAC 的部分 因開發環境是 EX3 似乎沒找到 元件 所以沒做測試
編輯記錄
boy330077 重新編輯於 2015-01-23 14:04:35, 註解 無‧
GrandRURU
站務副站長


發表:234
回覆:1651
積分:1742
註冊:2005-06-21

發送簡訊給我
#9 引用回覆 回覆 發表時間:2015-01-23 22:32:19 IP:221.120.xxx.xxx 訂閱
If CDs.recordcount = 0 then
Exit;

Cds.locate(...)
...

或是自己寫 Scan 的查詢,大概像是:

function ScanDataSet(A_SourceDS: TDataSet; const A_FindField: string; AFindValue: Variant):Boolean;
begin
Result := False;
A_DataSet.DisableControls;
A_DataSet.First;
while not A_DataSet.Eof do
begin
if A_DataSet.FieldByName(A_FindField).Value = A_FindValue then
begin
Result := True;
Break;
end;
A_SourceDS.Next;
end;
A_SourceDS.EnableControls;
end;

寫得很簡單,沒有模糊查詢及忽視大小寫功能

找到會回傳 True,並停在找到的那一筆 Row,;
反之則回傳 False,並移到最後一筆。


===================引 用 boy330077 文 章===================
感謝 老大仔

已經取得欄位型態測試

CREATE TABLE 後 就算給的是 CHAR(20) DELPHI 仍認為是 wideMemo 型態

但是我用 navicat 給予一行資料後 卻變成了 widestring 型態

-------------------------------------------

所以原因是在 wideMemo 不能locate
給了一筆資料DELPHI 又認為他是 widestring 忽然又可以 locate

難道就沒有辦法 create 以後 告訴 delphi 他是 wideString (強制轉換型態之類的???)

--------------------回P.D. 大
FireDAC 的部分 因開發環境是 EX3 似乎沒找到 元件 所以沒做測試
編輯記錄
GrandRURU 重新編輯於 2015-01-23 23:15:57, 註解 無‧
GrandRURU 重新編輯於 2015-01-23 23:16:49, 註解 無‧
GrandRURU
站務副站長


發表:234
回覆:1651
積分:1742
註冊:2005-06-21

發送簡訊給我
#10 引用回覆 回覆 發表時間:2015-01-25 12:09:49 IP:221.120.xxx.xxx 訂閱
原來 DataType 是用在這邊!

又上了一課。謝謝分享!



===================引 用 老大仔 文 章===================
不知道以下對你有沒有幫助...
希望有...@@

[code delphi]
procedure TForm1.Button1Click(Sender: TObject);
var
i: Integer;
begin
for i := 0 to SimpleDataSet1.FieldCount - 1 do
begin
ShowMessage(FieldtypeNames[SimpleDataSet1.Fields[i].DataType]);
end;
end;

[/code]


===================引 用 boy330077 文 章===================
我再建立 prodbarcode 時 都刻意挑 ‚ TEXT ‚ 或是 ‚ CHAR(20)......
理論上來說 建起來 ‚ 因該是字串型態

用 navicat ‚ 去看也是字串型態

只是從DELPHI 端不知道 怎麼看 ‚ DESIGN 狀態下好像連不上 ‚ 所以無法判定到底是哪種型態
老大仔
尊榮會員


發表:77
回覆:835
積分:1082
註冊:2006-07-06

發送簡訊給我
#11 引用回覆 回覆 發表時間:2015-01-26 09:44:16 IP:210.61.xxx.xxx 未訂閱
GrandRURU 大大:
您過獎了~
我只是剛好以前也有需要判斷欄位型態的需求
所以當時有去找了一些相關資訊~
取之於KTOP用之於KTOP~



===================引 用 GrandRURU 文 章===================
原來 DataType 是用在這邊!

又上了一課。謝謝分享!



===================引 用 老大仔 文 章===================
不知道以下對你有沒有幫助...
希望有...@@

[code delphi]
procedure TForm1.Button1Click(Sender: TObject);
var
‚ i: Integer;
begin
‚ for i := 0 to SimpleDataSet1.FieldCount - 1 do
‚ begin
‚ ‚ ‚ ShowMessage(FieldtypeNames[SimpleDataSet1.Fields[i].DataType]);
‚ end;
end;

[/code]


===================引 用 boy330077 文 章===================
我再建立 prodbarcode 時 都刻意挑 ƒ‚‚ TEXT ƒ‚‚ 或是 ƒ‚‚ CHAR(20)......
理論上來說 建起來 ƒ‚‚ 因該是字串型態

用 navicat ƒ‚‚ 去看也是字串型態

只是從DELPHI 端不知道 怎麼看 ƒ‚‚ DESIGN 狀態下好像連不上 ƒ‚‚ 所以無法判定到底是哪種型態
P.D.
版主


發表:571
回覆:3880
積分:3666
註冊:2006-10-31

發送簡訊給我
#12 引用回覆 回覆 發表時間:2015-01-27 10:02:11 IP:118.169.xxx.xxx 未訂閱
補充一下, 

我使用xe7 firedac, 型態也是 ftwildMemo, 但在 firedac ttable 下使用 locate 是可以被搜尋的
系統時間:2017-10-20 20:19:48
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!