TQuery之ParamByName,當改用ADOQuery時該改為何 |
尚未結案
|
Paicaso
中階會員 發表:140 回覆:124 積分:52 註冊:2002-09-04 發送簡訊給我 |
|
Paicaso
中階會員 發表:140 回覆:124 積分:52 註冊:2002-09-04 發送簡訊給我 |
原碼為
Query1.SQL.Clear;
SQL := 'INSERT INTO PRD ';
SQL := SQL + '( sk_no ,sk_...... )';
Query1.SQL.Text := SQL;
Query1.ParamByName('sk_no').AsString := L_STNO;
....
Query1為TQuery.
欲改為TQuery為ADOQuery
因ADOQuery並無ParamByName選項,故改成
如改成ADOQuery1.FieldByName('sk_no').AsString := L_STNO;
但會出現找不到st_no欄位之錯誤
|
Paicaso
中階會員 發表:140 回覆:124 積分:52 註冊:2002-09-04 發送簡訊給我 |
|
l630521
資深會員 發表:15 回覆:349 積分:372 註冊:2003-02-17 發送簡訊給我 |
|
cashxin2002
版主 發表:231 回覆:2555 積分:1937 註冊:2003-03-28 發送簡訊給我 |
|
Paicaso
中階會員 發表:140 回覆:124 積分:52 註冊:2002-09-04 發送簡訊給我 |
請問原本該Query為TQuery時正常,但改為ADOQuery時卻出現以下錯誤
Update執行時會出現找不到'ct_name'欄位
ps.ADO資料來源為SQLOLE Update時出現找不到'ct_name'欄位知錯誤.........................
Procedure TFMTrans.test_update(L_ctno,L_ctname:string);
var SQL : String;
Begin
QueryP.SQL.Clear;
SQL := 'Update CUST SET ';
SQL := SQL + ' ct_name =:ct_name';
SQL := SQL + 'Where ct_no = '''+L_ctno+''' ';
QueryP.SQL.Text := SQL;
//QueryP.Parameters.ParamByName('ct_name').Value := L_ctname;
QueryP.Parameters.ParamValues['ct_name'] := L_ctname;
try QueryP.ExecSQL; except ShowMessage('轉入失敗!'); end;
end; Insert執行無誤.............................................
Procedure TFMTrans.test_Insert(L_ctno,L_ctname : String);
var SQL : String;
Begin
QueryP.SQL.Clear;
SQL := 'INSERT INTO CUST ';
SQL := SQL + '( ct_no ,ct_name )';
SQL := SQL + ' Values ';
SQL := SQL + '( :ct_no ,:ct_name )';
QueryP.SQL.Text := SQL;
QueryP.Parameters.ParamByName('ct_no').Value := L_ctno;
QueryP.Parameters.ParamByName('ct_name').Value := L_ctname;
try QueryP.ExecSQL; except ShowMessage('轉入失敗!'); end;
end;
|
Paicaso
中階會員 發表:140 回覆:124 積分:52 註冊:2002-09-04 發送簡訊給我 |
我再測試了一下
Procedure TFMTrans.test_update(L_ctno,L_ctname:string);
var SQL : String;
Begin
QueryP.SQL.Clear;
SQL := 'Update CUST SET ';
SQL := SQL + ' ct_name =:ct_name';
SQL := SQL + 'Where ct_no = '''+L_ctno+''' ';
QueryP.SQL.Text := SQL;
1.會有找不到'ct_name'欄位之錯誤
//QueryP.Parameters.ParamByName('ct_name').Value := L_ctname;
2.會有找不到'ct_name'欄位之錯誤
//QueryP.Parameters.ParamValues['ct_name'] := L_ctname;
3.可以正確執行,但我覺得這非好方法,再修改程式或欄位時,請問有更好之方式?或上述二段哪裡有問題,因為在Insert一樣用Parameters.ParamByName卻可以執行
QueryP.Parameters[3].Value := L_ctname;
try QueryP.ExecSQL; except ShowMessage('轉入失敗!'); end;
end; QueryP.Parameters[4].Value := L_ctname;
|
cashxin2002
版主 發表:231 回覆:2555 積分:1937 註冊:2003-03-28 發送簡訊給我 |
|
Paicaso
中階會員 發表:140 回覆:124 積分:52 註冊:2002-09-04 發送簡訊給我 |
|
cashxin2002
版主 發表:231 回覆:2555 積分:1937 註冊:2003-03-28 發送簡訊給我 |
|
Paicaso
中階會員 發表:140 回覆:124 積分:52 註冊:2002-09-04 發送簡訊給我 |
真是感謝cashxin2002兄的指教
小弟之想用該方法實因要寫入之資料有相當多筆
又先前有遇過某些資料用
QueryP.SQL.Add('ct_name = ' L_ctname ' , ');
or
QueryP.SQL.Add('ct_name = ' AnsiQuotedStr(L_ctname,'''') ' , ');
時會有問題,所以才用SQL := SQL ' ct_name =:ct_name';
我不知是否有更佳之解決方式
請cashxin2002先進給予指教
thanks
|
cashxin2002
版主 發表:231 回覆:2555 積分:1937 註冊:2003-03-28 發送簡訊給我 |
|
Paicaso
中階會員 發表:140 回覆:124 積分:52 註冊:2002-09-04 發送簡訊給我 |
再次感謝版主的指教,我主要是要將SQL中某一資料表更新到Access之資料表中
1.開啟SQL資料表,並取出所需之欄位值,並全部使用ADOQuery
L_ctno := Trim(qypcust.FieldByName('ct_no').AsString); L_ctname := Trim(qypcust.FieldByName('ct_name').AsString);
.....不加敘述
2.開啟Access資料庫
qyBcust.SQL.Clear;
qyBcust.SQL.Add('SELECT * FROM Bcust ');
qyBcust.SQL.Add('WHERE ct_no = ''' L_ctno ''' ');
qyBcust.SQL.Add('Order by ct_no ');
qyBcust.CLOSE;
qyBcust.OPEN; If qyBcust.Eof = False then
Begin
test_Update(L_ctno,L_ctname.....不加敘述);更新
End Else Begin
test_Insert(L_ctno,L_ctname.....不加敘述);新增
.................................................
Procedure TFMTrans.test_update(L_ctno,L_ctname:string);
var SQL : String;
Begin
QueryP.SQL.Clear;
SQL := 'Update CUST SET ';
SQL := SQL ' ct_name =:ct_name'................;
SQL := SQL 'Where ct_no = ''' L_ctno ''' ';
QueryP.SQL.Text := SQL;
//QueryP.Parameters.ParamByName('ct_name').Value := L_ctname;
//QueryP.Parameters.ParamValues['ct_name'] := L_ctname; //有欄位比較清楚
QueryP.Parameters[3].Value := L_ctname; //這方法比較麻煩
..................
try QueryP.ExecSQL; except ShowMessage('轉入失敗!'); end;
end; Insert程序執行無誤.............................................
Procedure TFMTrans.test_Insert(L_ctno,L_ctname : String);
var SQL : String;
Begin
QueryP.SQL.Clear;
SQL := 'INSERT INTO CUST ';
SQL := SQL '( ct_no ,ct_name....... )';
SQL := SQL ' Values ';
SQL := SQL '( :ct_no ,:ct_name....... )';
QueryP.SQL.Text := SQL;
QueryP.Parameters.ParamByName('ct_no').Value := L_ctno;
QueryP.Parameters.ParamByName('ct_name').Value := L_ctname;
..........
try QueryP.ExecSQL; except ShowMessage('轉入失敗!'); end;
end;
|
cashxin2002
版主 發表:231 回覆:2555 積分:1937 註冊:2003-03-28 發送簡訊給我 |
引言: Procedure TFMTrans.test_update(L_ctno,L_ctname:string); var SQL : String; Begin QueryP.SQL.Clear; SQL := 'Update CUST SET '; SQL := SQL ' ct_name =:ct_name'................; SQL := SQL 'Where ct_no = ''' L_ctno ''' '; QueryP.SQL.Text := SQL; //QueryP.Parameters.ParamByName('ct_name').Value := L_ctname; //QueryP.Parameters.ParamValues['ct_name'] := L_ctname; //有欄位比較清楚 QueryP.Parameters[3].Value := L_ctname; //這方法比較麻煩 .................. try QueryP.ExecSQL; except ShowMessage('轉入失敗!'); end; end;從以上這段看﹐三種指定Param值的語法都沒有錯誤之處﹒ 剛才自己測試了一下﹐發現Param的部分在Set 欄位名 = 中也是可以使用﹐不好意思﹐之前有些誤導您了﹒ 請檢查以下兩部分﹕ SQL := SQL ' ct_name =:ct_name^'................; 請將上句中紅色部分^以空格代替 因為您的SQL組合起來之后就會變成ct_namewhere﹐ 而不是ct_name where﹒ 參考看看﹗ ===================== 努力,相信會獲得美麗! 忻晟
------
忻晟 |
solnone
中階會員 發表:2 回覆:97 積分:69 註冊:2003-05-06 發送簡訊給我 |
|
Paicaso
中階會員 發表:140 回覆:124 積分:52 註冊:2002-09-04 發送簡訊給我 |
|
Paicaso
中階會員 發表:140 回覆:124 積分:52 註冊:2002-09-04 發送簡訊給我 |
|
solnone
中階會員 發表:2 回覆:97 積分:69 註冊:2003-05-06 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |