TARS RestAPI應用
# Smart之TARS RestAPI應用
# 1. 說明
TARS中包含了RestAPI功能,可以通過HTTPURL的形式去訪問來實現TARS的各個功能。在使用本範例前,需在TARS中的[參數設定]-[常規設定]
中勾選驗證使用者身份
,設定用戶數據庫為TARS
。
![](/isoface/doc/assets/img/20201126224313479_14756.152d92f3.png)
在[參數設定]-[REST/SSL]
中啟用開啟REST
,設定REST資料庫的訪問方式為通過SQL編號(安全性高)
。
![](/isoface/doc/assets/img/20201126230749385_20446.2c5d2ba9.png)
在[使用者管理]
中設定RestAPI的登錄使用者。
![](/isoface/doc/assets/img/20201126231658164_18050.ffcadce1.png)
在[預設SQL管理]
中設定SQL編號的相關命令。
![](/isoface/doc/assets/img/20201126231742563_11023.489b89f8.png)
通過範例學習,可以掌握TARS中RestAPI的使用方法,並結合Smart實現訪問的相關功能。
# 2. 設計明細
開啟Smart智慧控制平臺,分別加入下插圖之控制元件。或者通過點選功能表欄[檔案]
-[打開專案]
選擇專案打開該範例。
![](/isoface/doc/assets/img/20201117224601881_5087.85ab3f89.png)
①:TEdit元件,控制元件名稱為edtHost
。
②:TEdit元件,控制元件名稱為edtPort
。
③:TComboBox元件,控制元件名稱為cbbCompressMode
。
④:TCheckBox元件,控制元件名稱為chkNeedLogin
。
⑤:TCheckBox元件,控制元件名稱為chkNeedSign
。
⑥:TPageControl元件,控制元件名稱為PageControl1
。
⑦:TEdit元件,控制元件名稱為edtConnectionDefName
。
⑧:TEdit元件,控制元件名稱為edtUserName
。
⑨:TEdit元件,控制元件名稱為edtPassword
。
⑩:TEdit元件,控制元件名稱為edtVerifyCode
。
(11):TImage元件,控制元件名稱為imgVerifyCode
(12):TEdit元件,控制元件名稱為edtToken
。
(13):TDBGrid元件,控制元件名稱為grd1
。
(14):TDataSource元件,控制元件名稱為ds1
(15):TRFDataSet元件,控制元件名稱為RFDataSet1
。
(16):TButton元件,控制元件名稱為btnLogin
。
(17):TButton元件,控制元件名稱為btnLogOut
。
Main窗體屬性設定
BorderStyle
:設定窗體顯示的邊框樣式=bsDialog
。ClientHeight
:窗體客戶區高度=706
。ClientWidth
:窗體客戶區寬度=901
。
①edtHost屬性設定
Height
:設定控制元件高度=21
。Width
:設定控制元件寬度=145
。Name
:設定控制元件名稱=edtHost
。Text
:設定顯示的文字內容=127.0.0.1
。
②edtPort屬性設定
Height
:設定控制元件高度=21
。Width
:設定控制元件寬度=146
。Name
:設定控制元件名稱=edtPort
。Text
:設定顯示的文字內容=8809
。
③cbbCompressMode屬性設定
Height
:設定控制元件高度=21
。Width
:設定控制元件寬度=174
。Name
:設定控制元件名稱=cbbCompressMode
。Item
:設定顯示的選項,雙擊該屬性或者點選右側[...]
打開編輯界面。
ItemIndex
:設定預設選擇的項的索引=0
。
④chkNeedLogin屬性設定
Caption
:設定單選框的標籤名稱,設定為驗證使用者
。Checked
:設定是否處於勾選狀態,設定為True
。
⑤chkNeedSign屬性設定
Caption
:設定單選框的標籤名稱,設定為驗證簽名
。Checked
:設定是否處於勾選狀態,設定為False
。
⑥PageControl1屬性設定
- 通過在其界面上右鍵點選,選擇
Next Page
以新增頁面。 - 分別為幾個頁面標籤取名為
登錄
、查詢數據
、更新數據
、預存程序
。
- 通過在其界面上右鍵點選,選擇
⑦edtConnectionDefName屬性設定
Height
:設定控制元件高度=21
。Width
:設定控制元件寬度=139
。Name
:設定控制元件名稱=edtConnectionDefName
。Text
:設定顯示的文字內容=TARS
。
⑧edtUserName屬性設定
Height
:設定控制元件高度=21
。Width
:設定控制元件寬度=139
。Name
:設定控制元件名稱=edtUserName
。Text
:設定顯示的文字內容=admin
。
⑨edtPassword屬性設定
Height
:設定控制元件高度=21
。Width
:設定控制元件寬度=139
。Name
:設定控制元件名稱=edtPassword
。Text
:設定顯示的文字內容=admin
。
⑩edtVerifyCode屬性設定
Height
:設定控制元件高度=21
。Width
:設定控制元件寬度=139
。Name
:設定控制元件名稱=edtVerifyCode
。TextHint
:設定顯示的文字提示資訊=六位數字
。Visible
:設定控制元件是否可見=False
。
(11)imgVerifyCode屬性設定
Height
:設定控制元件高度=33
。Width
:設定控制元件寬度=121
。Name
:設定控制元件名稱=imgVerifyCode
。
(12)edtToken屬性設定
Height
:設定控制元件高度=21
。Width
:設定控制元件寬度=731
。
(13)grd1屬性設定
Align
:該控制元件位於pgcDataSet
中,設定該屬性為alClient
,即佔滿客戶端區域。Name
:設定控制元件名稱=grd1
。DataSource
:設定其數據源控制元件,設定為ds1
。
(14)ds1屬性設定
DataSet
:設定其數據集控制元件,設定為RFDataSet1
。Name
:設定控制元件名稱=ds1
。
(16)btnLogin屬性設定
Caption
:設定控制元件字幕=登錄
。Height
:設定控制元件高度=55
。Width
:設定控制元件寬度=75
。Name
:設定控制元件名稱=btnLogin
。
(17)btnLogout屬性設定
Caption
:設定控制元件字幕=註銷
。Height
:設定控制元件高度=55
。Width
:設定控制元件寬度=75
。Name
:設定控制元件名稱=btnLogout
。
# 3. 程式設計
# 3.1. 程式初始設定
設定初始變數與常量。
private
FAccessToken: string;
FImageBase64Data: string;
FAppSecret: string;
//FStopWatch: TStopwatch;
FHaveDataSet: Boolean;
2
3
4
5
6
const
// 使用者名稱是 admin ,密碼是123456的md5值 e10adc3949ba59abbe56e057f20f883e
STATUS_OK = 0; // ok
STATUS_PARAMETER_INVALID = 1; // 請求參數錯誤
STATUS_TOKEN_INVALID = 2; // 令牌錯誤
STATUS_VERIFY_FAILURE = 3; // 驗證錯誤/使用者名稱或密碼錯誤
STATUS_DBMS_ERROR = 4; // 資料庫系統錯誤
STATUS_NOT_LOGINED = 5; // 未登錄
STATUS_VERIFYCODE_INVALID = 6; // 驗證碼錯誤
STATUS_TOKEN_EXPIRED = 7; // 授權已過期
STATUS_VERIFYCODE_REQUEST = 9; // 請輸入驗證碼
2
3
4
5
6
7
8
9
10
11
12
TyrParse
解析JSON的函式。
function TyrParse(const AJSON: string; out Value: TRtcRecord): Boolean;
begin
Result := True;
try
Value := TRtcRecord.FromJSON(AJSON);
except
Result := False;
end;
end;
2
3
4
5
6
7
8
9
CheckJSON
檢驗JSON。
function TMyHandler.CheckJSON(var AJsonObject: TRtcRecord; AJSON: string): Boolean;
begin
Result := TyrParse(AJSON, AJsonObject);
if not Result then
FThis.pgcDataSet.ActivePageIndex := 1;
// AJsonObject.asDateTime['datetime']:=Now;
// InfoDlg(AJsonObject.toJSON);
end;
2
3
4
5
6
7
8
9
GetTimestamp
獲取時間格式的函式。
function GetTimestamp: string;
begin
Result := FormatDateTime('yyyy-MM-dd HH:mm:ss', Now);
end;
2
3
4
Log
記錄日誌的過程。
procedure TMyHandler.Log(const S: string);
begin
FThis.mmoJSON.Lines.Add(DateTimeToStr(Now) + ':' + S);
end;
2
3
4
MakeSign
用於產生簽名的函式。
function MakeSign(const AParams: TStringList; const AppSecret: string): string;
var
I: Integer;
Data, SignMethod: string;
begin
SignMethod := AParams.Values['sign_method'];
// 參數排序
AParams.Sort;
// 參數拼接
Data := '';
for I := 0 to AParams.Count - 1 do
Data := Data + AParams[I].Replace('=', '');
// MD5 演算法
if SignMethod = 'md5' then
Result := paxfunc.GetStringMD5(AppSecret + Data + AppSecret).ToUpper
else
Result := paxfunc.GetHMAC(Data, AppSecret).ToUpper;
end;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Login
登錄的過程。
procedure TMyHandler.Login(const ChangeVerifyCode: Boolean);
var
Response, URL: string;
Params: TStringList;
JsonObj: TRtcRecord;
begin
URL := Format('http://%s:%s/rest/user/login', [FThis.edtHost.Text, FThis.edtPort.Text]);
Params := TStringList.Create;
try
Params.Values['user_name'] := FThis.edtUserName.Text;
Params.Values['password'] := paxfunc.GetStringMD5(FThis.edtPassword.Text);
Params.Values['db_name'] := FThis.edtConnectionDefName.Text;
Params.Values['version'] := '2.0';
URL := URL + '?user_name=' + FThis.edtUserName.Text
+ #38 + 'password=' + paxfunc.GetStringMD5(FThis.edtPassword.Text)
+ #38 + 'db_name=' + FThis.edtConnectionDefName.Text
+ #38 + 'version=' + '2.0';
if not ChangeVerifyCode then
begin
if not (FImageBase64Data = '') then
begin
Params.Values['verify_code'] := FThis.edtVerifyCode.Text;
URL := URL + '=' + FThis.edtVerifyCode.Text;
end;
end;
Response := paxfunc.NetHttpGet(URL,'');
//Log(URL+ Params.Text);
finally
FreeAndNil(Params);
end;
if not CheckJSON(JsonObj, Response) then
Log('接收的數據有誤,不是合法的 JSON')
else
begin
Log('使用者登錄回覆:' + JsonObj.toJSON);
if JsonObj.asInteger['status'] = STATUS_OK then
begin
FAccessToken := JsonObj.asText['token'];
FAppSecret := JsonObj.asText['app_secret'];
FThis.edtVerifyCode.Hide;
FThis.imgVerifyCode.Hide;
FImageBase64Data := '';
FThis.edtToken.Text:= FAccessToken;
end
else if JsonObj.asInteger['status'] = STATUS_VERIFYCODE_REQUEST then
begin
FThis.edtVerifyCode.Show;
FThis.imgVerifyCode.Show;
FImageBase64Data := JsonObj.asText['verify_code'];
paxfunc.LoadVerifycode(FImageBase64Data,FThis.imgVerifyCode);
end
else
begin
Log(JsonObj.asText['message']);
FAccessToken := '';
end;
FreeAndNil(JsonObj);
end;
FThis.pgcDataSet.ActivePageIndex := 1;
end;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
# 3.2. 事件設定
- ①btnLogin-OnClick事件
點選登錄
標籤頁中的[登錄]
按鈕,執行登錄操作。
procedure TMyHandler.btnLoginClick;
begin
Login(false);
end;
2
3
4
- btnQuery-OnClick事件
點選查詢數據
標籤頁中的[查詢]
按鈕,執行查詢操作。
procedure TMyHandler.btnQueryClick;
var
Response: string;
URL: string;
Params: TStringList;
JsonObj: TRtcRecord;
S: string;
begin
//if not CheckLogin then
// Exit;
//檢查 JSON 語法是否正確。
if not CheckJSON(JsonObj, FThis.mmoOpenSQL.Lines.text) then
begin
Log('JSON 語法有誤。');
Exit;
end;
FHaveDataSet := True;
//FStopWatch := TStopwatch.StartNew;
URL := Format('http://%s:%s/rest/db/opensql', [FThis.edtHost.Text, FThis.edtPort.Text]);
Params := TStringList.Create;
try
Params.Values['token'] := FThis.edtToken.Text;// FAccessToken;
Params.Values['data'] := JsonObj.toJSON;
URL := URL + '?token=' + FThis.edtToken.Text // FAccessToken;
+ #38+ 'data=' + JsonObj.toJSON;
if FThis.chkNeedSign.Checked then // 驗證簽名
begin
Params.Values['sign_method'] := 'md5'; // hmac,md5
Params.Values['timestamp'] := GetTimestamp;
Params.Values['version'] := '2.0';
URL := URL + #38 + 'sign_method=' + 'md5' // hmac,md5
+ #38 + 'timestamp=' + Params.Values['timestamp']
+ #38 + 'version=' + '2.0'
+ #38 + 'sign=' + MakeSign(Params, FAppSecret);
end;
// 非同步模式提交參數
//AsyncHTTPClient.Post(URL, Params);
Response := paxfunc.NetHttpGet(URL,'');
if not CheckJSON(JsonObj, Response) then
begin
Log('接收的數據有誤,不是合法的 JSON');
Exit;
end;
if JsonObj.asInteger['status'] = STATUS_OK then
begin
// 將 JSON 轉為 DataSet
if FHaveDataSet then
begin
DM.JsonObjToDataSet(FThis.RFDataSet1,JsonObj);
Log('獲取到:'+IntToStr(FThis.RFDataSet1.RecordCount)+'條記錄.');
end
else
Log(JsonObj.toJSON);
end
else
Log('服務端回覆:' + JsonObj.asText['message']);
finally
FreeAndNil(Params);
FreeAndNil(JsonObj);
end;
end;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
- btnExecSQL-OnClick事件
點選更新數據
標籤頁中的[執行]
按鈕,執行SQL。
procedure TMyHandler.btnExecSQLClick;
var
URL, Response: string;
Params: TStringList;
JsonObj: TRtcRecord;
begin
//if not CheckLogin then
// Exit;
// 檢查 JSON 語法是否正確。
if not CheckJSON(JsonObj, FThis.mmoExecSQL.Lines.Text) then
begin
Log('JSON 語法有誤。');
Exit;
end;
FHaveDataSet := False;
URL := Format('http://%s:%s/rest/db/execsql', [FThis.edtHost.Text, FThis.edtPort.Text]);
Params := TStringList.Create;
try
Params.Values['token'] := FAccessToken;
Params.Values['data'] := JsonObj.toJSON;
URL := URL + '?token=' + FThis.edtToken.Text // FAccessToken;
+ #38 + 'data=' + JsonObj.toJSON;
if FThis.chkNeedSign.Checked then
begin
Params.Values['sign_method'] := 'md5'; // hmac,md5
Params.Values['timestamp'] := GetTimestamp;
Params.Values['version'] := '2.0';
URL := URL + #38 + 'sign_method=' + 'md5' // hmac,md5
+ #38 + 'timestamp=' + Params.Values['timestamp']
+ #38 + 'version=' + '2.0'
+ #38 + 'sign=' + MakeSign(Params, FAppSecret);
end;
//Response := HttpClient.Post(URL, Params).ContentAsString;
Response := paxfunc.NetHttpGet(URL,'');
finally
FreeAndNil(Params);
FreeAndNil(JsonObj);
end;
if not CheckJSON(JsonObj, Response) then
Log('接收的數據有誤,不是合法的 JSON')
else
begin
try
Log(JsonObj.toJSON);
if JsonObj.asInteger['status'] <> STATUS_OK then
Log('服務端回覆:' + JsonObj.asText['message']);
finally
FreeAndNil(JsonObj);
end;
end;
FThis.pgcDataSet.ActivePageIndex := 1;
end;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
- btnStoreProc-OnClick事件
點選預存程序
標籤頁中的[執行]
按鈕,執行預存程序。
procedure TMyHandler.btnStoreProcClick;
var
URL,Response: string;
Params: TStringList;
JsonObj: TRtcRecord;
begin
//if not CheckLogin then
// Exit;
// 檢查 JSON 語法是否正確。
if not CheckJSON(JsonObj, FThis.mmoStoredProc.Lines.Text) then
begin
Log('JSON 語法有誤。');
Exit;
end;
FHaveDataSet := JsonObj.asText['method'] = 'open_proc';
URL := Format('http://%s:%s/rest/db/storedproc', [FThis.edtHost.Text, FThis.edtPort.Text]);
Params := TStringList.Create;
try
Params.Values['token'] := FAccessToken;
Params.Values['data'] := JsonObj.toJSON;
URL := URL + '?token=' + FThis.edtToken.Text // FAccessToken;
+ #38 + 'data=' + JsonObj.toJSON;
if FThis.chkNeedSign.Checked then
begin
Params.Values['sign_method'] := 'md5'; // hmac,md5
Params.Values['timestamp'] := GetTimestamp;
Params.Values['version'] := '2.0';
URL := URL + #38 + 'sign_method=' + 'md5' // hmac,md5
+ #38 + 'timestamp=' + Params.Values['timestamp']
+ #38 + 'version=' + '2.0'
+ #38 + 'sign=' + MakeSign(Params, FAppSecret);
end;
// 非同步提交請求
//AsyncHTTPClient.Post(URL, Params);
Response := paxfunc.NetHttpGet(URL,'');
showmessage(Response);
finally
FreeAndNil(Params);
FreeAndNil(JsonObj);
end;
end;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
- Button1-OnClick事件
設定使用自定義參數執行SQL。點選更新數據
標籤頁中的[執行2]
按鈕以執行操作。
procedure TMyHandler.Button1Click;
var
URL, Response: string;
Params: TStringList;
JsonObj: TRtcRecord;
jsonStr:String;
begin
//if not CheckLogin then
// Exit;
FHaveDataSet := False;
URL := Format('http://%s:%s/rest/db/execsql', [FThis.edtHost.Text, FThis.edtPort.Text]);
jsonStr := '{'+#13#10
+' "db_name": "FastERP",'+#13#10
+' "sql": "UPDATE Table_Test SET phone=:phone WHERE id=:id",'+#13#10
+' "params": ['+#13#10
+' {'+#13#10
+' "name": "phone",'+#13#10
+' "value": "1888888888" '+#13#10
+' },'+#13#10
+' {'+#13#10
+' "name": "id",'+#13#10
+' "value": "7FA504F4-F331-4200-9B37-00BA77F8CAB9" '+#13#10
+' }'+#13#10
+' ]'+#13#10
+'}';
FThis.mmoExecSQL.Lines.Text:= jsonStr;
Params := TStringList.Create;
try
Params.Values['token'] := FAccessToken;
Params.Values['data'] := jsonStr;
URL := URL + '?token=' + FThis.edtToken.Text // FAccessToken;
+ #38 + 'data=' + jsonStr;
if FThis.chkNeedSign.Checked then
begin
Params.Values['sign_method'] := 'md5'; // hmac,md5
Params.Values['timestamp'] := GetTimestamp;
Params.Values['version'] := '2.0';
URL := URL + #38 + 'sign_method=' + 'md5' // hmac,md5
+ #38 + 'timestamp=' + Params.Values['timestamp']
+ #38 + 'version=' + '2.0'
+ #38 + 'sign=' + MakeSign(Params, FAppSecret);
end;
//Response := HttpClient.Post(URL, Params).ContentAsString;
Response := paxfunc.NetHttpGet(URL,'');
finally
FreeAndNil(Params);
end;
if not CheckJSON(JsonObj, Response) then
Log('接收的數據有誤,不是合法的 JSON')
else
begin
try
Log(JsonObj.toJSON);
if JsonObj.asInteger['status'] <> STATUS_OK then
Log('服務端回覆:' + JsonObj.asText['message']);
finally
FreeAndNil(JsonObj);
end;
end;
FThis.pgcDataSet.ActivePageIndex := 1;
end;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
- Button2-OnClick事件
點選更新數據
標籤頁中的[批次插入]
按鈕以執行操作。
procedure TMyHandler.Button2Click;
var
URL, Response: string;
Params: TStringList;
JsonObj: TRtcRecord;
begin
//if not CheckLogin then
// Exit;
// 檢查 JSON 語法是否正確。
if not CheckJSON(JsonObj, FThis.mmoExecSQL.Lines.Text) then
begin
Log('JSON 語法有誤。');
Exit;
end;
FHaveDataSet := False;
URL := Format('http://%s:%s/rest/db/batch_insert', [FThis.edtHost.Text, FThis.edtPort.Text]);
Params := TStringList.Create;
try
Params.Values['token'] := FAccessToken;
Params.Values['data'] := JsonObj.toJSON;
URL := URL + '?token=' + FThis.edtToken.Text // FAccessToken;
+ #38 + 'data=' + JsonObj.toJSON;
if FThis.chkNeedSign.Checked then
begin
Params.Values['sign_method'] := 'md5'; // hmac,md5
Params.Values['timestamp'] := GetTimestamp;
Params.Values['version'] := '2.0';
URL := URL + #38 + 'sign_method=' + 'md5' // hmac,md5
+ #38 + 'timestamp=' + Params.Values['timestamp']
+ #38 + 'version=' + '2.0'
+ #38 + 'sign=' + MakeSign(Params, FAppSecret);
end;
//Response := HttpClient.Post(URL, Params).ContentAsString;
Response := paxfunc.NetHttpGet(URL,'');
finally
FreeAndNil(Params);
FreeAndNil(JsonObj);
end;
if not CheckJSON(JsonObj, Response) then
Log('接收的數據有誤,不是合法的 JSON')
else
begin
try
Log(JsonObj.toJSON);
if JsonObj.asInteger['status'] <> STATUS_OK then
Log('服務端回覆:' + JsonObj.asText['message']);
finally
FreeAndNil(JsonObj);
end;
end;
FThis.pgcDataSet.ActivePageIndex := 1;
end;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
- (17)btnLogout-OnClick事件
點選登錄
標籤頁中的[註銷]
按鈕,註銷登錄。
procedure TMyHandler.btnLogoutClick;
var
JsonObj: TRtcRecord;
URL, Response: string;
begin
//if not CheckLogin then
// Exit;
URL := Format('http://%s:%s/rest/user/logout?token=%s', [FThis.edtHost.Text, FThis.edtPort.Text, FAccessToken]);
Log(URL);
//Response := HttpClient.Get(URL).ContentAsString;
Response := paxfunc.NetHttpGet(URL,'');
if not CheckJSON(JsonObj, Response) then
Log('接收的數據有誤,不是合法的 JSON')
else
Log('服務端回覆:' + JsonObj.asText['message']);
end;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
- (11)imgVerifyCode-OnClick事件
點選驗證碼圖片切換驗證碼。
procedure TMyHandler.imgVerifyCodeClick;
begin
Login(True);
end;
2
3
4
# 4. 運行結果
使用滑鼠點選工具欄運行(Run),測試運行結果。
通過工具欄儲存,將程式儲存為 sdb 專案檔案。
在登錄框中輸入TARS所在的伺服器地址,確認使用者名稱與密碼,點選[登錄]
按鈕獲取Token,可執行接下來的頁面中顯示的查詢,插入以及執行預存程序等方法。