問題描述:
我在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用法。
先謝謝來到這裡各位。
問題解決了就結帖。
我在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用法。
先謝謝來到這裡各位。
問題解決了就結帖。
2.無效的精確度數值。
------------------
是不是没主键啊
Oracle没用过
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;
1。無效的描述器索引。
2.無效的精確度數值。这样的问题大多只有你自己调试解决,你可以设置一个断点,看看你传入的sql 内容是什么。以及看 看你的数据库结构是否正确。有时候不一定是程序的问题。
你在用文本当作字段类型的时候,你的执行可以成功吗??
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返回的肯定为整型
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個左右
但是當我出入四五百的字符時就會出錯。
應該說 程序是沒問題的。 我沒有用‘流讀入的方法’,難道是這裡錯了?
我的數據庫字段開始時設計時文本類型的
後來給為 ‘備忘類型’的 但是數據庫是空的沒有數據時我修改的。
max返回值一定是整形嗎?
如果我max(‘字符類型’)
那麼返回類型 是什麼呢??
我怎麼樣在plsql中查看max返回的類型。
select max('999')+1 from dual;
结果为1000
所以你的to_number可以不用,如果你的max返回是非数字串,一样出错,如果是数字串,在与整型运算时,它会自动转为整型
返回类型,我从来没关注过(我说过oracle会自动转换,除非没法转),所以我不会
另外,oracle的自动编号.可以用SEQUENCE来实现(当然要看你的具体需求). 还有,你的seq_no如果是number字段,比较999与1000就不会错了
是的
如果 seq_no是數字類型就不會出錯了
但是 數據庫設計成了 字符類型。
數據庫都遠行好幾年了
沒法改,在說了我也沒權限。
oracle中的類型自動轉換和c或者delphi中一樣嗎?
有沒有什麼規則?
如:
select '999'+1 from dual;
结果为
1000
包括日期类型,如果你的系统NLS_DAT设为yyyy-mm-dd,那在插入数据库时,你可直接将字串'2006-09-25'插入日期字段而不用转成日期类型
只要转换不产生非法结果,oracle都会自动转(如'aaa'+1它就没法转了)
当然,你用显式转换,可能更好些,