ADOQuery 的問題 ? (SQL Syntax) -- SQL 語法的問題 ? |
答題得分者是:sryang
|
UB
一般會員 發表:18 回覆:19 積分:7 註冊:2007-02-19 發送簡訊給我 |
各位老大 ~ 小弟有個問題 !! 下面的程式碼跑起來會有問題,他出現的錯誤大致如下 省略...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 發送簡訊給我 |
<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 |
UB
一般會員 發表:18 回覆:19 積分:7 註冊:2007-02-19 發送簡訊給我 |
|
瘋狂火星人
一般會員 發表:1 回覆:29 積分:6 註冊:2005-06-17 發送簡訊給我 |
|
sryang
尊榮會員 發表:39 回覆:762 積分:920 註冊:2002-06-27 發送簡訊給我 |
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 發送簡訊給我 |
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 發送簡訊給我 |
|
瘋狂火星人
一般會員 發表:1 回覆:29 積分:6 註冊:2005-06-17 發送簡訊給我 |
沒有實際用過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 發送簡訊給我 |
|
瘋狂火星人
一般會員 發表:1 回覆:29 積分:6 註冊:2005-06-17 發送簡訊給我 |
話說~~~
印象中AdoTable可以將資料集存在本機端做離線編輯,然後再一次Update回資料庫。 還是說小弟觀念有誤呢?? ===================引 用 sryang 文 章=================== MySQL 用 ` 把字串包起來比較妥當,不是單引號也不是雙引號,而是上排數字鍵 1 左邊的「`」 附帶一提,既然是執行不回傳資料的 SQL 命令,那麼建議使用 TADOCommand。這樣比較直接。 ===================引 用 瘋狂火星人 文 章=================== 原來MySQL中單引號跟雙引號是一樣的...... 話說~~既然要一次插入大量資料,用AdoTable來做批次更新會不會比較快點?? 您參考看看~~ 插入大量資料用 ADOTable 效能很差的,不但要執行 SQL 命令插入資料,記憶體中還要保留一份 用 ADOCommand 搭配參數,並且配合交易及分批 commit (例如 1000 筆 commit 一次) 是最快的了 不使用交易的話,會變成每一筆都 commit,很慢 |
瘋狂火星人
一般會員 發表:1 回覆:29 積分:6 註冊:2005-06-17 發送簡訊給我 |
話說~~~
印象中AdoTable可以將資料集存在本機端做離線編輯,然後再一次Update回資料庫。 還是說小弟觀念有誤呢?? ===================引 用 sryang 文 章=================== MySQL 用 ` 把字串包起來比較妥當,不是單引號也不是雙引號,而是上排數字鍵 1 左邊的「`」 附帶一提,既然是執行不回傳資料的 SQL 命令,那麼建議使用 TADOCommand。這樣比較直接。 ===================引 用 瘋狂火星人 文 章=================== 原來MySQL中單引號跟雙引號是一樣的...... 話說~~既然要一次插入大量資料,用AdoTable來做批次更新會不會比較快點?? 您參考看看~~ 插入大量資料用 ADOTable 效能很差的,不但要執行 SQL 命令插入資料,記憶體中還要保留一份 用 ADOCommand 搭配參數,並且配合交易及分批 commit (例如 1000 筆 commit 一次) 是最快的了 不使用交易的話,會變成每一筆都 commit,很慢 |
sryang
尊榮會員 發表:39 回覆:762 積分:920 註冊:2002-06-27 發送簡訊給我 |
抱歉!講錯了,在 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 發送簡訊給我 |
|
UB
一般會員 發表:18 回覆:19 積分:7 註冊:2007-02-19 發送簡訊給我 |
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 發送簡訊給我 |
我測試的結果是 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 發送簡訊給我 |
感謝 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"); |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |