用ParamByName有什么利弊 |
缺席
|
ntjrr
高階會員 發表:240 回覆:312 積分:110 註冊:2005-04-24 發送簡訊給我 |
ado.sql.add(' and the_date =''' + formatdatetime(yyyy-m-d',date) + '''');
与 ado.sql.add(' and the_date =:date1'); ado.Parameters.ParamByName('Date1').Value:=formatdatetime(yyyy-m-d',date) 一种是不带参数,一种带参数,哪种好一点?我在SQL数据库的情况下,发现一个问题,就是在子查询里面带参数条件查询,如果条件是中文内容的话查询是会出错的,但在ACCESS数据库下未发现任何问题,在SQL数据库不是包含子查询的情况下也不会出错。
------
我的编程起步于ktop,我将永远支持ktop |
P.D.
版主 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
|
max5020
資深會員 發表:30 回覆:277 積分:321 註冊:2003-06-04 發送簡訊給我 |
|
mypigbaby
高階會員 發表:11 回覆:168 積分:155 註冊:2006-07-20 發送簡訊給我 |
豬寶寶個人的經驗
ParamByName最大的好處是程式易讀跟不必擔心形態轉換的問題 但是相較於直接放sql進去理論上會比較慢 再如果是中文有問題的話 可能要請您用注意看看 中文裡面是不是有' 這類符號 這個可能會造成delphi的誤判 直到d 2007. 還是不支援unicode =.= ===================引 用 ntjrr 文 章=================== ado.sql.add(' and the_date =''' formatdatetime(yyyy-m-d',date) ''''); 与 ado.sql.add(' and the_date =:date1'); ado.Parameters.ParamByName('Date1').Value:=formatdatetime(yyyy-m-d',date) 一种是不带参数,一种带参数,哪种好一点?我在SQL数据库的情况下,发现一个问题,就是在子查询里面带参数条件查询,如果条件是中文内容的话查询是会出错的,但在ACCESS数据库下未发现任何问题,在SQL数据库不是包含子查询的情况下也不会出错。 |
ntjrr
高階會員 發表:240 回覆:312 積分:110 註冊:2005-04-24 發送簡訊給我 |
感谢各位大大的指点,我将实际出错的代码贴一下:
ADOQuery1.SQL.Add('select 功能号,功能名 from tb_A'); ADOQuery1.SQL.Add('where 功能号 not in (select 功能号 from tb_B where 用户名=:帐号)'); ADOQuery1.Parameters.ParamByName('帐号').Value:=ComboBox1.Text; 当用户名是张三(中文姓名)时查询结果是不对的,用户名是zs(拼音或英文时)时查询是正确的。 如果不用参数,直接 where用户名=''' combobox.text '''' ,时无论是中文还是英文的查询都是正确的。 我只遇到在上面这一特定情况下才有这问题,其它时候用参数查询,未测到任何问题。
------
我的编程起步于ktop,我将永远支持ktop |
Stallion
版主 發表:52 回覆:1600 積分:1995 註冊:2004-09-15 發送簡訊給我 |
try this,
ADOQuery1.SQL.Add('where 功能号 not in (select 功能号 from tb_B where 用户名=[:帐号])'); ===================引 用 ntjrr 文 章=================== 感谢各位大大的指点,我将实际出错的代码贴一下: ADOQuery1.SQL.Add('select 功能号,功能名 from tb_A'); ADOQuery1.SQL.Add('where 功能号 not in (select 功能号 from tb_B where 用户名=:帐号)'); ADOQuery1.Parameters.ParamByName('帐号').Value:=ComboBox1.Text; 当用户名是张三(中文姓名)时查询结果是不对的,用户名是zs(拼音或英文时)时查询是正确的。 如果不用参数,直接 where用户名=''' combobox.text '''' ,时无论是中文还是英文的查询都是正确的。 我只遇到在上面这一特定情况下才有这问题,其它时候用参数查询,未测到任何问题。 |
ntjrr
高階會員 發表:240 回覆:312 積分:110 註冊:2005-04-24 發送簡訊給我 |
|
Stallion
版主 發表:52 回覆:1600 積分:1995 註冊:2004-09-15 發送簡訊給我 |
|
ntjrr
高階會員 發表:240 回覆:312 積分:110 註冊:2005-04-24 發送簡訊給我 |
|
P.D.
版主 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
其實我在各種場合經常要說明, Delphi是一套Single Byte(外國語)的軟體, 雖然可以支援Double Byte的結構, 但在Field, var, procedure .. 等等實在不建議使用雙語的型態(如中文), 因為你不知道有那些中文的HigByte 會與Delphi內定的部份衝突,
所以還是以英文做為各種參數之用才是比較ok的, 還有你的引題, 個人覺得不太舒服, 是因為你最後表達你真正想問的東西, 這與parambyname 與直接下的優劣無關, 建議 你下回有問題直接表達出來, 利用這樣的引語由於我們不知前因後果, 回答時很容易導入錯誤的資訊, 謝謝! ===================引 用 ntjrr 文 章=================== 我现在已经着手将所有字段都改成英文的了,但要过几天我才能测试好,到时我来结案,看是不是这个原因 |
ntjrr
高階會員 發表:240 回覆:312 積分:110 註冊:2005-04-24 發送簡訊給我 |
个人觉得这次提问还是没有结束,因为我确实要问的是用参数的利弊,并且取了一个用参数查不到正确结果的例子,但得到Stallion版大的指点,他觉得这不是参数的利弊,而是中文字段和英文字段的问题。所以我还得改为英文测试,如果试了对的,说明用不用参数都不会出错,(并且顺便知道了数据库用中文字段的坏处)。在别处论坛中也得到了很多高手的指点,总结了一下,用参数的好处是参数经过了检查,安全性高,不容易受到攻击。用参数的坏处说特别在日期格式时,容易查询错误,说一般不用参数,但经过我的测试,我发现在多种日期格式下,用不用参数都能查到正确的答案。这些我都想在此得到更多的大大的验证和指点。
------
我的编程起步于ktop,我将永远支持ktop
編輯記錄
ntjrr 重新編輯於 2008-03-13 08:10:16, 註解 無‧
|
P.D.
版主 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
|
ntjrr
高階會員 發表:240 回覆:312 積分:110 註冊:2005-04-24 發送簡訊給我 |
|
ntjrr
高階會員 發表:240 回覆:312 積分:110 註冊:2005-04-24 發送簡訊給我 |
|
ntjrr
高階會員 發表:240 回覆:312 積分:110 註冊:2005-04-24 發送簡訊給我 |
我把代码贴全了:
ado.Close; ado.SQL.Clear; ado.SQL.Add('select gnh,gnm from tb_a'); ado.SQL.Add('where gnh not in (select gnh from tb_b where yhm=:yhm)'); ado.Parameters.ParamByName('yhm').Value:=ComboBox1.Text; ado.Open; 在SQL中ComboBox1.Text中名称为张三,那数据就错,名称为zs,数据就对,在ACCESS中无论叫什么数据都对。 如果写成where yhm=''' combobox1.text ''';那么什么情况下都对。 我再细说一下什么叫对,什么叫错,会不会我自己数据看错了,那其实不可能,因为这个其实就是一个增加权限的代码,如果张三没权限,那么上面代码中会显示所有的功能号和功能名出来,但现在的情况是,给了张三所有权限,再次点增加权限时还是会出来所有权限,但如果给ZS相同的操作,就不会出错。
------
我的编程起步于ktop,我将永远支持ktop |
P.D.
版主 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
|
ntjrr
高階會員 發表:240 回覆:312 積分:110 註冊:2005-04-24 發送簡訊給我 |
|
P.D.
版主 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |