全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1065
推到 Plurk!
推到 Facebook!

請教數據類型問題

尚未結案
Link_Chen
一般會員


發表:25
回覆:22
積分:9
註冊:2004-03-30

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-01-21 09:50:16 IP:61.177.xxx.xxx 未訂閱
各位大大, 本人碰到一個數據類型長度的問題,請教各位. 我宣告了一個全局變量,類型為String;但是在賦值的時候有可能長度會到1300,可是String的最大長度是256,所以只要該變量賦值長度超過256就會被 Show成亂碼,我試過把變量類型改成了WideString,但是問題還是存在,請問有什麼辦法能解決?
huwk
資深會員


發表:26
回覆:340
積分:323
註冊:2002-04-03

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-01-21 10:08:33 IP:61.222.xxx.xxx 未訂閱
String的限制度不是256! 除非你下了 {$H} 您要不要先trytry看.是不是你從db中取出就己經是亂碼了? 例如存到文字檔中,再用notepad去開! 或是塞到memo中查看
------
熊的學習 http://huwk.blogspot.com
Link_Chen
一般會員


發表:25
回覆:22
積分:9
註冊:2004-03-30

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-01-21 10:22:23 IP:61.177.xxx.xxx 未訂閱
Dear huwk, 我把相關部分的程式碼貼出來,可能會更清楚點. public SqlComd: String; //首先我宣告了一個全局變量. ... procedure TdlgComputerEdit.BitBtn1Click(Sender: TObject); begin SqlComd := ''; If CheckBox1.checked = true then SqlComd := SqlComd ' Select ''' wwDBEdit1.text ''' , MatClass, ''' JsComboBox2.text ''' , MatName, getdate(), 1 From ELE_Master(nolock) Where MatCode = ''' JsComboBox2.text ''' Union '; If CheckBox2.checked = true then SqlComd := SqlComd ' Select ''' wwDBEdit1.text ''' , MatClass, ''' JsComboBox3.text ''' , MatName, getdate(), 1 From ELE_Master(nolock) Where MatCode = ''' JsComboBox3.text ''' Union '; If CheckBox3.checked = true then SqlComd := SqlComd ' Select ''' wwDBEdit1.text ''' , MatClass, ''' JsComboBox4.text ''' , MatName, getdate(), ''' Edit1.text ''' From ELE_Master(nolock) Where MatCode = ''' JsComboBox4.text ''' Union '; SqlComd := SqlComd ' Select ''' 'WWW' ''' ,''' 'WW' ''' , ''' 'WWWWWW' ''' , ''' 'WWW' ''' , getdate(), 1'; ReNewEP(SqlComd); end; procedure TdlgComputerEdit.ReNewEP(ItemId: String); begin with qryRenewFix do begin close; ParamByName('SqlComd').AsString := ItemId; open; BrowseData(tblDetail, True); end; end; 以上是程式的相關部分,其實我的目的就是根據使用者選擇的情況給SqlComd這個變量 賦值,然後再帶給qryRenewFix這支程序作為條件使用. 現在目前的情況是:當我只滿足CheckBox1.checked = true 的時候,SqlComd是能取到 值的(這個時候SqlComd的長度沒到256),但是當我同時滿足CheckBox1.checked = true 和CheckBox2.checked = true的時候,SqlComd就被抓成了亂碼(這個時候實際SqlComd 的長度超過了256).
huwk
資深會員


發表:26
回覆:340
積分:323
註冊:2002-04-03

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-01-21 11:14:57 IP:211.21.xxx.xxx 未訂閱
1.你要不要search看你的專案中是否有用到{$h-},你可以search h- 2.你要不要試著直接show出來 If CheckBox2.checked = true then showmessage( sSqlComd ' Select ''' wwDBEdit1.text ''' , MatClass, ''' JsComboBox3.text ''' , MatName, getdate(), 1 From ELE_Master(nolock) Where MatCode = ''' JsComboBox3.text ''' Union ' );
------
熊的學習 http://huwk.blogspot.com
Link_Chen
一般會員


發表:25
回覆:22
積分:9
註冊:2004-03-30

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-01-21 13:02:59 IP:61.177.xxx.xxx 未訂閱
huwk,        我檢查過了程序裡沒有用到{$h-}     用showmessage,結果也是對的.我最蹤了一下,到程序的最後 procedure TdlgComputerEdit.ReNewEP(ItemId: String); begin with qryRenewFix do begin close; ParamByName('SqlComd').AsString := ItemId;//到這裡ItemId的值還是正確的 open; //到這裡,就出錯了.錯誤提示是'XX'附近語法不正確,XX是亂碼 BrowseData(tblDetail, True); end; end;
huwk
資深會員


發表:26
回覆:340
積分:323
註冊:2002-04-03

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-01-21 13:51:13 IP:61.222.xxx.xxx 未訂閱
1.請問你qryRenewFix是什麼元件? 可以列出來嗎? 2.你使用的db是什麼?
------
熊的學習 http://huwk.blogspot.com
Link_Chen
一般會員


發表:25
回覆:22
積分:9
註冊:2004-03-30

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-01-21 14:33:57 IP:61.177.xxx.xxx 未訂閱
Huwk, 我用的是SQL SERVER 2000 Delphi 7 qryRenewFix是BDE(DBTables)下的Query元件.
huwk
資深會員


發表:26
回覆:340
積分:323
註冊:2002-04-03

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-01-21 16:50:38 IP:211.21.xxx.xxx 未訂閱
^^ 試著讓你的sql換行..+ #13#10 不要讓你的語法過長!    例如 If CheckBox2.checked = true then SqlComd := SqlComd +#13#10+ ' Select ''' + wwDBEdit1.text '''+#13#10 , MatClass, ''' + JsComboBox3.text + ''' , MatName, getdate(), 1 From ELE_Master(nolock) Where MatCode = ''' + JsComboBox3.text + ''' Union ';    
引言: Huwk, 我用的是SQL SERVER 2000 Delphi 7 qryRenewFix是BDE(DBTables)下的Query元件.
------
熊的學習 http://huwk.blogspot.com
deity
尊榮會員


發表:90
回覆:876
積分:678
註冊:2003-05-09

發送簡訊給我
#9 引用回覆 回覆 發表時間:2005-01-21 16:51:40 IP:218.15.xxx.xxx 未訂閱
插个花:
public
  SqlComd: String;  //首先我宣告了一個全局變量.
     ...
procedure TdlgComputerEdit.BitBtn1Click(Sender: TObject);
begin
  SqlComd := '';
  If CheckBox1.checked = true then
     SqlComd := SqlComd   'Select " '   wwDBEdit1.text  ' " , MatClass, " '   JsComboBox2.text   ' " , MatName, getdate(), 1 From ELE_Master(nolock) Where MatCode = " '   JsComboBox2.text   ' " Union ';
  If CheckBox2.checked = true then
     SqlComd := SqlComd   ' Select " '   wwDBEdit1.text  ' " , MatClass, " '   JsComboBox3.text   ' " , MatName, getdate(), 1 From ELE_Master(nolock) Where MatCode = " '   JsComboBox3.text  ' " Union ';
  If CheckBox3.checked = true then
     SqlComd := SqlComd   ' Select " '   wwDBEdit1.text  ' " , MatClass, " '   JsComboBox4.text   ' " , MatName, getdate(), " '   Edit1.text  ' " From ELE_Master(nolock) Where MatCode = " '   JsComboBox4.text  ' " Union ';
  SqlComd := SqlComd   ' Select "' ' WWW ' '" ,'''   'WW'  ''' , '''  'WWWWWW'   ''' , '''  'WWW'   ''' , getdate(), 1 From ELE_Master(nolock)'; //加上此句,另这里的WW,WWWWWW,WWW是字段名还是变量?是字段名,写法如下:
SqlComd := SqlComd   ' Select  WWW,WW ,WWWWWW ,WWW, getdate(), 1 From ELE_Master(nolock)';不是的话如上写法      ReNewEP(SqlComd);
end;
以上注意" '的标法
procedure TdlgComputerEdit.ReNewEP(ItemId: String);
begin
  with qryRenewFix do
  begin
     close;
     ParamByName('SqlComd').AsString := ItemId; 
//参数赋值,而您上面没用到参数,看您上面应该是一个查询语句来的吧,是不是应该写为如下:
     sql.text:=SqlComd;
     showmessage(sql.text); //看看语句对否
     open;
     BrowseData(tblDetail, True);
  end;
end;
end;
至于参数的用法,简单参考如下:
  with query1 do 
    begin
      close;
      sql.Clear;
      sql.Add('select * from table1 where field1=:AParam');
      ParamByName('AParam').asstring:=Edit1.text;
      open; 
    end;
纯粹猜测,如有不对,请见谅 另需>[>] ..>[/>] <>~~~静心养德~~~ 發表人 -
Link_Chen
一般會員


發表:25
回覆:22
積分:9
註冊:2004-03-30

發送簡訊給我
#10 引用回覆 回覆 發表時間:2005-01-25 09:14:44 IP:61.177.xxx.xxx 未訂閱
huwk, 痛苦啊,加了換行也還是那樣. deity, 我的參數在BitBtn1Click得最後透過ReNewEP(SqlComd)給了,而且我也試過在ReNewEP中先用showmessage看了SqlComd的資料是正確的,所以因該不是參數給法的問題.
deity
尊榮會員


發表:90
回覆:876
積分:678
註冊:2003-05-09

發送簡訊給我
#11 引用回覆 回覆 發表時間:2005-01-25 10:55:04 IP:218.15.xxx.xxx 未訂閱
引言: huwk, 痛苦啊,加了換行也還是那樣. deity, 我的參數在BitBtn1Click得最後透過ReNewEP(SqlComd)給了,而且我也試過在ReNewEP中先用showmessage看了SqlComd的資料是正確的,所以因該不是參數給法的問題. 我想请问Link_Chen兄,您在qryRenewFix 下open之前,showmessage(qryRenewFix.sql.text);得出的值是多少,可以pos上来吗? 也即:
procedure TdlgComputerEdit.ReNewEP(ItemId: String);
begin
  with qryRenewFix do
  begin
    close;
    //这里不觉缺点什么的吗?
    ParamByName('SqlComd').AsString := ItemId;
    open;        showmessage(sql.text);//此处的值是多少,可否ps上来        BrowseData(tblDetail, True);
  end;
end;
~~~静心养德~~~ 發表人 - deity 於 2005/01/25 11:00:42 發表人 - deity 於 2005/01/25 11:04:46
stone0924
一般會員


發表:3
回覆:17
積分:14
註冊:2002-08-13

發送簡訊給我
#12 引用回覆 回覆 發表時間:2005-01-25 12:54:14 IP:211.21.xxx.xxx 未訂閱
with qryRenewFix do begin close; ParamByName('SqlComd').AsString := ItemId; try it: --->parambyname('sqlcomd').asmemo:=itemid; open; BrowseData(tblDetail, True); end;
Link_Chen
一般會員


發表:25
回覆:22
積分:9
註冊:2004-03-30

發送簡訊給我
#13 引用回覆 回覆 發表時間:2005-01-25 13:51:27 IP:61.177.xxx.xxx 未訂閱
deity,    showmessage(sql.text);如果加在OPEN後面,目前是看不到值是多少,因為OPEN的是否就出錯了,所以走不到這裏.    我把它加在OPEN之前,得到的信息是:exec ELE_ReNewFix :SqlComd  程式如下:
procedure TdlgComputerEdit.ReNewEP(ItemId: String);
begin
  with qryRenewFix do
  begin
    close;
    //这里不觉缺点什么的吗?
    ParamByName('SqlComd').AsString := ItemId;
    showmessage(sql.text);
    open;
    BrowseData(tblDetail, True);
  end;
end;
stone0924, 我用了你的方法,還是錯.但是錯誤不是亂碼了,是'WWWWWW'附近語法不正確. 但是我如果只符合一個條件,去組合最後的Select 'WWW'...語句(也就是SqlComd最後的值只有兩段Select語句做Union)語法就是對的,而符合兩個條件再去組合最後的Select 'WWW'...語句(也就是SqlComd最後的值有三段Select語句做Union)語法就錯誤,所以我還是覺得是最後抓取SqlComd這個變量時候長度上除了問題. PS,在後台我追蹤到 ParamByName('SqlComd').AsString := ItemId; 這句的時候,ItemId的值還是完整.(3段select語句)
deity
尊榮會員


發表:90
回覆:876
積分:678
註冊:2003-05-09

發送簡訊給我
#14 引用回覆 回覆 發表時間:2005-01-25 15:13:36 IP:218.15.xxx.xxx 未訂閱
Link_Chen您好: 小弟笔误< >是写在 >小弟才学蔬浅~< > 不过如您单单两个>.Value := ItemId; 或将代码发上求助区,这样处理起来会更方便 <>~~~静心养德~~~
系統時間:2024-06-18 11:35:00
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!