問題描述:
我在access中設計了一個數據庫。
字段question,answer,note 開始時是"文本"類型最大字數我設置為250
插入數據時我發現250個字符不夠用。我又把它的類型給為‘備忘’(我用的是繁體系統可能和大家簡體的叫法不一樣,應該能看懂的)。
客戶端是我用delphi的memo控件。
我把mome中的text插入到 數據庫中
拋出錯誤如下:
1。無效的描述器索引。
2.無效的精確度數值。
請高人指點 謝謝。附請教一個orcle問題:
請看下面一段代碼:
select to_char(nvl(to_number(max(seq_no)),0)+1,'FM000') seq_no from OUT_PROD_ORDER_SEQ where year_no = :a1 and month_no=:a2
1。請問to_char 和to_number在使用時應該注意那些問題。
 FM000是表示什麼呢?
2。請教nvl用法。
先謝謝來到這裡各位。
問題解決了就結帖。

解决方案 »

  1.   

    1。無效的描述器索引。
    2.無效的精確度數值。
    ------------------
    是不是没主键啊
    Oracle没用过
      

  2.   

    1.memo字段最好用流插入/读出
    procedure TForm1.Button1Click(Sender: TObject);
    var
      s:TMemoryStream;
    begin
         s:=TMemoryStream.create;
         with ADOQuery1 do
         begin
            SQL.Text:='insert into test ([note]) values(:s)';
            Memo1.Lines.SaveToStream(s);
            Parameters[0].LoadFromStream(s,ftMemo);
            ExecSQL;  //将Memo1内容插入到Test表的note字段
            SQL.Text:='select note from test';
            Open;  //读出
            Last;   //取最后一条记录
            s.Position:=0;
            (FieldByName('note') as TMemoField).SaveToStream(s);
            s.Position:=0;
            Memo2.Lines.LoadFromStream(s);  //读到Memo2中
         end;
         s.Free;
    end;
      

  3.   

    to_char需要注意长度控制,999.789 ,to_char(999.789,'99999.99') 和to_char('999.789','99.00')是不一样的,to_number则没有那么多限制。nvl(x,1) 如果x为null,那么给x默认值为1. decode(x,null,1,x) 可以达到同样效果
      

  4.   

    拋出錯誤如下:
    1。無效的描述器索引。
    2.無效的精確度數值。这样的问题大多只有你自己调试解决,你可以设置一个断点,看看你传入的sql 内容是什么。以及看 看你的数据库结构是否正确。有时候不一定是程序的问题。
    你在用文本当作字段类型的时候,你的执行可以成功吗??
      

  5.   

    2.oracle的nvl函数是将空转为其它值的函数:
    to_number(max(seq_no)),0):如果max(seq_no)为NULL,它的值就为0,在oracle中NULL与0是完全不同的两个值
    to_char 中的FM为填充模式-前缀,FM000表示如果字长不足3位,前面加0
    to_numer是将字串或其它类型化为整型,它的参数必须是数字,如to_number('999')是可以的,而to_number('aaa')是非法的
    对于你的SQL来说,这个to_number没有必要,因为max返回的肯定为整型
      

  6.   

    謝謝各位!
    to:keiy
    謝謝你這麼熱情的幫忙。利用流的方法插入我待會試一試。
    在oracle中有一點我沒有說明。就是seq_no是字符類型的varchar2(3)。
    select to_char(nvl(to_number(max(seq_no)),0)+1,'FM000') seq_no from OUT_PROD_ORDER_SEQ where year_no = :a1 and month_no=:a2
    這段代碼的目的是選取當月中最大的編號,然後加一 生成一個新的序號。現在是序號已經達到999在插入時就出錯。必須增加一位 我解決的方法是增加一位 但是 這段代碼就有問題了
    因為在oracle中字符比較999>1000的。
    所以我改為
    to_char(nvl(max(to_number(seq_no)),0)+1,'FM0000')。這個問題我可是忙了一天啊。郁悶。
    這個應該是數據庫設計時候事務沒有考慮到 擴展性。提出來大家討論。to:wudi1982
    謝謝。呵呵
    當我插入很少的字符時不會出錯100個左右
    但是當我出入四五百的字符時就會出錯。
    應該說 程序是沒問題的。 我沒有用‘流讀入的方法’,難道是這裡錯了?
    我的數據庫字段開始時設計時文本類型的
    後來給為 ‘備忘類型’的 但是數據庫是空的沒有數據時我修改的。
      

  7.   

    to: keiy
    max返回值一定是整形嗎?
    如果我max(‘字符類型’)
    那麼返回類型 是什麼呢??
    我怎麼樣在plsql中查看max返回的類型。
      

  8.   

    是啊,max 不一定返回整型,但max('数字字串')可以返回整型(oracle会自动转换变量),如:
    select max('999')+1 from dual;
    结果为1000
    所以你的to_number可以不用,如果你的max返回是非数字串,一样出错,如果是数字串,在与整型运算时,它会自动转为整型
    返回类型,我从来没关注过(我说过oracle会自动转换,除非没法转),所以我不会
    另外,oracle的自动编号.可以用SEQUENCE来实现(当然要看你的具体需求). 还有,你的seq_no如果是number字段,比较999与1000就不会错了
      

  9.   

    to keiy
    是的
    如果 seq_no是數字類型就不會出錯了
    但是 數據庫設計成了 字符類型。
    數據庫都遠行好幾年了
    沒法改,在說了我也沒權限。
    oracle中的類型自動轉換和c或者delphi中一樣嗎?
    有沒有什麼規則?
      

  10.   

    delphi与C中应该没有类型自动转换一说的,如delphi是不能将一个字串!自动!转为一个整形的,而oracle可以
    如:
    select '999'+1 from dual;
    结果为
    1000
    包括日期类型,如果你的系统NLS_DAT设为yyyy-mm-dd,那在插入数据库时,你可直接将字串'2006-09-25'插入日期字段而不用转成日期类型
    只要转换不产生非法结果,oracle都会自动转(如'aaa'+1它就没法转了)
    当然,你用显式转换,可能更好些,