線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:3541
推到 Plurk!
推到 Facebook!

ADOQuery 的問題 ? (SQL Syntax) -- SQL 語法的問題 ?

答題得分者是:sryang
UB
一般會員


發表:18
回覆:19
積分:7
註冊:2007-02-19

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-08-29 18:50:01 IP:211.76.xxx.xxx 訂閱
各位老大 ~ 小弟有個問題 !! 下面的程式碼跑起來會有問題,他出現的錯誤大致如下 省略...you have an error on your SQL syntax; .... 省略 ... for the right syntax to use near '; insert into stock_name(stock_code,stock_name,stock_type)values("10112","詭異' at line 1'...省略 他說我的語法錯誤,可是我直接把 memo3 出來的字 Copy 起來然後貼到 資料庫管理程式(NaviCat,有點類似MySQL Control Center)然後跑起來並沒有問題啊 ~ 請各位大大幫我看一下,到底哪裡出錯了 !! 感激感激 ~ <textarea class="delphi" rows="10" cols="60" name="code"> form2.ADOQuery3.SQL.Clear; form2.ADOQuery3.SQL.Add('insert into stock_name(stock_code,stock_name,stock_type) values("10111","新的","B");'); form2.ADOQuery3.SQL.Add('insert into stock_name(stock_code,stock_name,stock_type) values("10112","詭異","B");'); form2.ADOQuery3.SQL.Add('insert into stock_name(stock_code,stock_name,stock_type) values("10113","三號","B");'); form2.ADOQuery3.SQL.Add('insert into stock_name(stock_code,stock_name,stock_type) values("10114","四號","B");'); form2.ADOQuery3.SQL.Add('insert into stock_name(stock_code,stock_name,stock_type) values("10115","五號","B");'); form2.ADOQuery3.SQL.Add('insert into stock_name(stock_code,stock_name,stock_type) values("10116","六號","B");'); form2.ADOQuery3.SQL.Add('insert into stock_name(stock_code,stock_name,stock_type) values("10117","新的號","B");'); form2.ADOQuery3.SQL.Add('insert into stock_name(stock_code,stock_name,stock_type) values("10118","最後一號","B");'); form2.Memo3.Lines := form2.ADOQuery3.SQL; form2.ADOQuery3.ExecSQL;</textarea> 另外可以簡單的說明一下 ADOQuery3.ExecSQL 和 ADOQuery3.Open 有什麼差異嘛 ~ UB 悉心請教 ~ ps. 小弟用的是MySQL 5.0.41
瘋狂火星人
一般會員


發表:1
回覆:29
積分:6
註冊:2005-06-17

發送簡訊給我
#2 引用回覆 回覆 發表時間:2007-08-29 19:00:59 IP:218.169.xxx.xxx 訂閱
<textarea class="delphi" rows="10" cols="60" name="code">請在此區域輸入程式碼 這是兩個單引號 form2.ADOQuery3.SQL.Add('insert into stock_name(stock_code,stock_name,stock_type) values(''10111'',''新的'',''B'');'); 這是一個雙引號 form2.ADOQuery3.SQL.Add('insert into stock_name(stock_code,stock_name,stock_type) values("10111","新的","B");'); </textarea>
試試用兩個單引號去包字串來執行看看。
MS_SQL裡面有差,MySQL比較少接觸,不確定有沒有差。
另外,也可以試試一行insert指令之後就執行一次Adoquery3.ExecSQL。

adoquery3.ExecSQL<==用在update、insert這類不會回傳資料集的SQL指令上。 adoquery3.Open<==用在會回傳資料集的SQL指令,例如select



===================引 用 UB 文 章===================
各位老大 ~ 小弟有個問題 !! 下面的程式碼跑起來會有問題,他出現的錯誤大致如下 省略...you have an error on your SQL syntax; .... 省略 ... for the right syntax to use near '; insert into stock_name(stock_code,stock_name,stock_type)values("10112","詭異' at line 1'...省略 他說我的語法錯誤,可是我直接把 memo3 出來的字 Copy 起來然後貼到 資料庫管理程式(NaviCat,有點類似MySQL Control Center)然後跑起來並沒有問題啊 ~ 請各位大大幫我看一下,到底哪裡出錯了 !! 感激感激 ~ <textarea class="delphi" rows="10" cols="60" name="code"> form2.ADOQuery3.SQL.Clear; form2.ADOQuery3.SQL.Add('insert into stock_name(stock_code,stock_name,stock_type) values("10111","新的","B");'); form2.ADOQuery3.SQL.Add('insert into stock_name(stock_code,stock_name,stock_type) values("10112","詭異","B");'); form2.ADOQuery3.SQL.Add('insert into stock_name(stock_code,stock_name,stock_type) values("10113","三號","B");'); form2.ADOQuery3.SQL.Add('insert into stock_name(stock_code,stock_name,stock_type) values("10114","四號","B");'); form2.ADOQuery3.SQL.Add('insert into stock_name(stock_code,stock_name,stock_type) values("10115","五號","B");'); form2.ADOQuery3.SQL.Add('insert into stock_name(stock_code,stock_name,stock_type) values("10116","六號","B");'); form2.ADOQuery3.SQL.Add('insert into stock_name(stock_code,stock_name,stock_type) values("10117","新的號","B");'); form2.ADOQuery3.SQL.Add('insert into stock_name(stock_code,stock_name,stock_type) values("10118","最後一號","B");'); form2.Memo3.Lines := form2.ADOQuery3.SQL; form2.ADOQuery3.ExecSQL;</textarea> 另外可以簡單的說明一下 ADOQuery3.ExecSQL 和 ADOQuery3.Open 有什麼差異嘛 ~ UB 悉心請教 ~ ps. 小弟用的是MySQL 5.0.41
編輯記錄
瘋狂火星人 重新編輯於 2007-08-29 19:05:25, 註解 無‧
瘋狂火星人 重新編輯於 2007-08-29 19:06:57, 註解 無‧
UB
一般會員


發表:18
回覆:19
積分:7
註冊:2007-02-19

發送簡訊給我
#3 引用回覆 回覆 發表時間:2007-08-29 20:55:22 IP:203.79.xxx.xxx 訂閱
To .. 瘋狂火星人
謝謝你的回覆....不過,看起來似乎不是這個問題 ~
我剛剛改成您說的方法,結果還是一樣,不曉得還有哪裡要注意的 !?

另外如果用一行insert指令之後就執行一次Adoquery3.ExecSQL
這樣子的話會把整個程式執行效率拖慢,因為這個要插入的資料很多,所以如果能夠跑一次SQL就搞定的話,速度會快很多 ~
編輯記錄
UB 重新編輯於 2007-08-29 20:57:57, 註解 無‧
瘋狂火星人
一般會員


發表:1
回覆:29
積分:6
註冊:2005-06-17

發送簡訊給我
#4 引用回覆 回覆 發表時間:2007-08-29 21:07:19 IP:218.169.xxx.xxx 訂閱
原來MySQL中單引號跟雙引號是一樣的......

話說~~既然要一次插入大量資料,用AdoTable來做批次更新會不會比較快點??
您參考看看~~

===================引 用 UB 文 章===================
To .. 瘋狂火星人
謝謝你的回覆....不過,看起來似乎不是這個問題 ~
我剛剛改成您說的方法,結果還是一樣,不曉得還有哪裡要注意的 !?

另外如果用一行insert指令之後就執行一次Adoquery3.ExecSQL
這樣子的話會把整個程式執行效率拖慢,因為這個要插入的資料很多,所以如果能夠跑一次SQL就搞定的話,速度會快很多 ~
sryang
尊榮會員


發表:39
回覆:762
積分:920
註冊:2002-06-27

發送簡訊給我
#5 引用回覆 回覆 發表時間:2007-08-29 22:31:08 IP:124.10.xxx.xxx 訂閱
MySQL 用 ` 把字串包起來比較妥當,不是單引號也不是雙引號,而是上排數字鍵 1 左邊的「`」

附帶一提,既然是執行不回傳資料的 SQL 命令,那麼建議使用 TADOCommand。這樣比較直接。

===================引 用 瘋狂火星人 文 章===================
原來MySQL中單引號跟雙引號是一樣的......

話說~~既然要一次插入大量資料,用AdoTable來做批次更新會不會比較快點??
您參考看看~~

插入大量資料用 ADOTable 效能很差的,不但要執行 SQL 命令插入資料,記憶體中還要保留一份
用 ADOCommand 搭配參數,並且配合交易及分批 commit (例如 1000 筆 commit 一次) 是最快的了
不使用交易的話,會變成每一筆都 commit,很慢
------
歡迎參訪 "腦殘賤貓的備忘錄" http://maolaoda.blogspot.com/
編輯記錄
sryang 重新編輯於 2007-08-29 22:36:45, 註解 無‧
UB
一般會員


發表:18
回覆:19
積分:7
註冊:2007-02-19

發送簡訊給我
#6 引用回覆 回覆 發表時間:2007-08-29 22:50:03 IP:203.79.xxx.xxx 訂閱
To sryang ...
我已經按照您的指示把他改成 ` , 這下子還是有錯誤,不過錯誤的位置改變了, 他說Syntax error 是 near '; insert into stock_name(stock_code,stock_name,stock_type) values(`10112`,`new2` at line 1'. ...略 , 也就是第一個 insert 的 ;

然後我把全部的 ; 拿掉後還是一樣,只不過 syntax error 是直接從第二個 insert 開始 !!

另外,小弟笨拙,ADOCommand 還沒有學過,可以給我一些參考資料,或者例子嘛! 我現在也會去Google找相關資料學習

// 我已經把ADOQuery 改成用 ADOCommand 了, 可是.... 結果還是一樣的 !!
想必是我的語法有問題,但是我把同樣的語法直接跑Mysql確是可以,這到底是.....!?
編輯記錄
UB 重新編輯於 2007-08-29 23:20:22, 註解 無‧
UB
一般會員


發表:18
回覆:19
積分:7
註冊:2007-02-19

發送簡訊給我
#7 引用回覆 回覆 發表時間:2007-08-29 23:23:33 IP:203.79.xxx.xxx 訂閱
突然想到,不曉得是不是ADOQuery Add 的時候在後面增加了 隱形的字元,例如斷行之類的而導致的問題!? 
不曉得各位大大有何方法可以解決 !?
瘋狂火星人
一般會員


發表:1
回覆:29
積分:6
註冊:2005-06-17

發送簡訊給我
#8 引用回覆 回覆 發表時間:2007-08-29 23:31:58 IP:218.169.xxx.xxx 訂閱
沒有實際用過AdoCommand,以下是根據Help裡面找到的方法加上
AdoConnection的BeginTrans和CommitTrans
能否運作還有勞您測試了~~
<textarea class="delphi" rows="10" cols="60" name="code"> AdoCommand1.CommandText:='insert into table (col1,col2,col3) values(:param1,:param2,:param3)'; AdoCommand1.CommandType:=cmdText; AdoConnection1.BeginTrans; AdoCommand1.Parameters.ParamByName('param1').values:='值1'; AdoCommand1.Parameters.ParamByName('param2').values:='值2'; AdoCommand1.Parameters.ParamByName('param3').values:='值3'; AdoCommand1.Execute; AdoCommand1.Parameters.ParamByName('param1').values:='值a'; AdoCommand1.Parameters.ParamByName('param2').values:='值b'; AdoCommand1.Parameters.ParamByName('param3').values:='值c'; AdoCommand1.Execute; AdoConnection1.CommitTrans; </textarea><br />

===================引 用 UB 文 章===================
To sryang...
我已經按照您的指示把他改成 ` , 這下子還是有錯誤,不過錯誤的位置改變了, 他說Syntax error 是 near '; insert into stock_name(stock_code,stock_name,stock_type) values(`10112`,`new2` at line 1'. ...略 , 也就是第一個 insert 的 ;

然後我把全部的 ; 拿掉後還是一樣,只不過 syntax error 是直接從第二個 insert 開始 !!

另外,小弟笨拙,ADOCommand 還沒有學過,可以給我一些參考資料,或者例子嘛! 我現在也會去Google找相關資料學習

// 我已經把ADOQuery 改成用 ADOCommand 了, 可是.... 結果還是一樣的 !!
想必是我的語法有問題,但是我把同樣的語法直接跑Mysql確是可以,這到底是.....!?
瘋狂火星人
一般會員


發表:1
回覆:29
積分:6
註冊:2005-06-17

發送簡訊給我
#9 引用回覆 回覆 發表時間:2007-08-29 23:39:16 IP:218.169.xxx.xxx 訂閱
除非您的SQL語法是從外部編輯器複製進來的??
如果複製到ENTER斷行或是TAB字元的話是有可能會這樣....



===================引 用 UB 文 章===================
突然想到,不曉得是不是ADOQuery Add 的時候在後面增加了 隱形的字元,例如斷行之類的而導致的問題!?
不曉得各位大大有何方法可以解決 !?
瘋狂火星人
一般會員


發表:1
回覆:29
積分:6
註冊:2005-06-17

發送簡訊給我
#10 引用回覆 回覆 發表時間:2007-08-29 23:42:24 IP:218.169.xxx.xxx 訂閱
話說~~~
印象中AdoTable可以將資料集存在本機端做離線編輯,然後再一次Update回資料庫。
還是說小弟觀念有誤呢??

===================引 用 sryang 文 章===================
MySQL 用 ` 把字串包起來比較妥當,不是單引號也不是雙引號,而是上排數字鍵 1 左邊的「`」

附帶一提,既然是執行不回傳資料的 SQL 命令,那麼建議使用 TADOCommand。這樣比較直接。

===================引 用 瘋狂火星人 文 章===================
原來MySQL中單引號跟雙引號是一樣的......

話說~~既然要一次插入大量資料,用AdoTable來做批次更新會不會比較快點??
您參考看看~~

插入大量資料用 ADOTable 效能很差的,不但要執行 SQL 命令插入資料,記憶體中還要保留一份
用 ADOCommand 搭配參數,並且配合交易及分批 commit (例如 1000 筆 commit 一次) 是最快的了
不使用交易的話,會變成每一筆都 commit,很慢
瘋狂火星人
一般會員


發表:1
回覆:29
積分:6
註冊:2005-06-17

發送簡訊給我
#11 引用回覆 回覆 發表時間:2007-08-29 23:54:24 IP:218.169.xxx.xxx 訂閱
話說~~~
印象中AdoTable可以將資料集存在本機端做離線編輯,然後再一次Update回資料庫。
還是說小弟觀念有誤呢??

===================引 用 sryang 文 章===================
MySQL 用 ` 把字串包起來比較妥當,不是單引號也不是雙引號,而是上排數字鍵 1 左邊的「`」

附帶一提,既然是執行不回傳資料的 SQL 命令,那麼建議使用 TADOCommand。這樣比較直接。

===================引 用 瘋狂火星人 文 章===================
原來MySQL中單引號跟雙引號是一樣的......

話說~~既然要一次插入大量資料,用AdoTable來做批次更新會不會比較快點??
您參考看看~~

插入大量資料用 ADOTable 效能很差的,不但要執行 SQL 命令插入資料,記憶體中還要保留一份
用 ADOCommand 搭配參數,並且配合交易及分批 commit (例如 1000 筆 commit 一次) 是最快的了
不使用交易的話,會變成每一筆都 commit,很慢
sryang
尊榮會員


發表:39
回覆:762
積分:920
註冊:2002-06-27

發送簡訊給我
#12 引用回覆 回覆 發表時間:2007-08-30 00:39:46 IP:124.10.xxx.xxx 訂閱
抱歉!講錯了,在 MySQL 中,「`」是用來包裹物件名稱的 (例如資料表名稱、欄位名稱),字串用單引號或雙引號來包裹都可以

依照我的測試結果,使用 MyODBC 3.51.18 以前的版本的狀況之下,是無法一次執行多個 SQL 的
所以請至 http://dev.mysql.com/get/Downloads/MyODBC3/mysql-connector-odbc-3.51.19-win32.msi/from/pick#mirrors
下載最新的 MyODBC 3.51.19,並先解除安裝舊版本,然後安裝新版本

安裝完之後,設定你使用的 ODBC 資料來源,在 Advanced 頁籤中的 Flag3 頁籤有一個「Allow multiple statements」,勾選這個
就可以支援以分號分隔的多條 SQL 敘述了
------
歡迎參訪 "腦殘賤貓的備忘錄" http://maolaoda.blogspot.com/
sryang
尊榮會員


發表:39
回覆:762
積分:920
註冊:2002-06-27

發送簡訊給我
#13 引用回覆 回覆 發表時間:2007-08-30 00:51:35 IP:124.10.xxx.xxx 訂閱
ADOTable 是可以先做離線編輯,再一次UPDATE 回資料庫
你有沒有試圖去追蹤過所謂的「一次 UPDATE 回資料庫」實際上做了什麼動作呢?
事實上,還是一條一條的 SQL。
如果沒有搭配交易的話,還是單筆 commit 呢!

既然都要執行 SQL 了,又何必耗費用戶端的記憶體,先把這些資料存入 ADOTable 呢?
------
歡迎參訪 "腦殘賤貓的備忘錄" http://maolaoda.blogspot.com/
UB
一般會員


發表:18
回覆:19
積分:7
註冊:2007-02-19

發送簡訊給我
#14 引用回覆 回覆 發表時間:2007-08-30 21:50:22 IP:203.79.xxx.xxx 訂閱
To sryang 大大 ~
我已經把版本從我原本的 3.51.17 改成 3.51.19 了, 我發現 3.51.19 版本的還要多加一個 use database_name 否則會出現 資料庫未選擇的錯誤, anyway 舊的問題還是存在, 我把 引號也改成 單引號了,出現的錯誤也是一模一樣 !!

另外我發現MySQL 的ODBC 好像有5版的,但是目前是Beta版本 !!
或許找個時間我在來試試看 5.0 版的 ~

我相當懷疑,這個問題沒有人遇到嘛 !?
因為一次update 多筆資料應該是滿常需要的,怎麼會感覺好像很少人遇到這樣的問題 ~
sryang
尊榮會員


發表:39
回覆:762
積分:920
註冊:2002-06-27

發送簡訊給我
#15 引用回覆 回覆 發表時間:2007-08-30 22:49:27 IP:124.10.xxx.xxx 訂閱
我測試的結果是 OK 的,提供我的設定給您參考
資料庫使用 InnoDB 引擎,utf8_general_ci 定序
stock_name 資料表的結構:
欄位名稱 型態 定序
stock_code varchar(20) utf8_general_ci
stock_name varchar(20) utf8_general_ci
stock_type varchar(20) utf8_general_ci

ODBC DSN 設定,指定以下項目
Login 頁籤
Data Source Name = DSN 名稱
Server
User
Password
Database = 資料庫名稱
Connect Options 頁籤
Character Set = big5
Advanced 頁籤
Flag3 中的 Allow multiple statements 打勾

我執行的 SQL 是這樣的:
insert into stock_name(stock_code,stock_name,stock_type) values("10111","新的","B");
insert into stock_name(stock_code,stock_name,stock_type) values("10112","詭異","B");
insert into stock_name(stock_code,stock_name,stock_type) values("10113","三號","B");
insert into stock_name(stock_code,stock_name,stock_type) values("10114","四號","B");
insert into stock_name(stock_code,stock_name,stock_type) values("10115","五號","B");
insert into stock_name(stock_code,stock_name,stock_type) values("10116","六號","B");
insert into stock_name(stock_code,stock_name,stock_type) values("10117","新的號","B");
insert into stock_name(stock_code,stock_name,stock_type) values("10118","最後一號","B");
------
歡迎參訪 "腦殘賤貓的備忘錄" http://maolaoda.blogspot.com/
UB
一般會員


發表:18
回覆:19
積分:7
註冊:2007-02-19

發送簡訊給我
#16 引用回覆 回覆 發表時間:2007-08-30 23:30:01 IP:203.79.xxx.xxx 訂閱
感謝 sryang 還有 火星人 兩位大大的幫忙, 小弟的問題終於解決了 !!
雖然沒有在作實驗下去證實,不過我覺的問題應該是出在 ODBC 的設定, 還好有 sryang 大大 把設定給我,相當感激 ~
我把可能導致問題的設定用紅色的放大出來了 ~

===================引 用 sryang 文 章===================
我測試的結果是 OK 的,提供我的設定給您參考
資料庫使用 InnoDB 引擎,utf8_general_ci 定序
stock_name 資料表的結構:
欄位名稱?? ?? ? 型態?? ?? ?? ??? 定序
stock_code ??? varchar(20)? ?? utf8_general_ci
stock_name ??? varchar(20) ??? utf8_general_ci
stock_type ??? varchar(20) ??? utf8_general_ci

ODBC DSN 設定,指定以下項目
Login 頁籤
?? Data Source Name = DSN 名稱
?? Server
?? User
?? Password
?? Database = 資料庫名稱
Connect Options 頁籤
?? Character Set = big5
Advanced 頁籤
Flag3 中的 Allow multiple statements 打勾

我執行的 SQL 是這樣的:
insert into stock_name(stock_code,stock_name,stock_type) values("10111","新的","B");
insert into stock_name(stock_code,stock_name,stock_type) values("10112","詭異","B");
insert into stock_name(stock_code,stock_name,stock_type) values("10113","三號","B");
insert into stock_name(stock_code,stock_name,stock_type) values("10114","四號","B");
insert into stock_name(stock_code,stock_name,stock_type) values("10115","五號","B");
insert into stock_name(stock_code,stock_name,stock_type) values("10116","六號","B");
insert into stock_name(stock_code,stock_name,stock_type) values("10117","新的號","B");
insert into stock_name(stock_code,stock_name,stock_type) values("10118","最後一號","B");
系統時間:2024-05-21 11:18:19
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!