線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1905
推到 Plurk!
推到 Facebook!

改了資料庫欄位型態後程式連不上資料庫。

答題得分者是:smallfox
tokiama
一般會員


發表:34
回覆:60
積分:23
註冊:2009-04-19

發送簡訊給我
#1 引用回覆 回覆 發表時間:2010-11-07 15:57:25 IP:125.231.xxx.xxx 訂閱
在這裡問一下大家。

如果程式寫好後,發現資料庫的某欄位資料型態錯誤,然後把資料庫欄位改過,程式寫入的值型態也改過。

有沒有人發生程式一啟動就說資料型態不合的問題?

我是連Access。
編輯記錄
tokiama 重新編輯於 2010-11-07 01:58:03, 註解 無‧
老大仔
尊榮會員


發表:78
回覆:837
積分:1088
註冊:2006-07-06

發送簡訊給我
#2 引用回覆 回覆 發表時間:2010-11-08 08:58:59 IP:59.120.xxx.xxx 未訂閱
請把code貼上來
好讓大家知道哪裡有問題
另外~
可以把錯誤訊息詳細的說出來嗎???


===================引 用 tokiama 文 章===================
在這裡問一下大家。

如果程式寫好後,發現資料庫的某欄位資料型態錯誤,然後把資料庫欄位改過,程式寫入的值型態也改過。

有沒有人發生程式一啟動就說資料型態不合的問題?

我是連Access。
tokiama
一般會員


發表:34
回覆:60
積分:23
註冊:2009-04-19

發送簡訊給我
#3 引用回覆 回覆 發表時間:2010-11-08 13:06:08 IP:120.107.xxx.xxx 訂閱
一啟動程式就錯誤的訊息




會發生這問題的起因,程式沒改,只改資料型態,把紅圈圈的地方改成數字型態。


連線方式是在程式中設定。
ADOTable1.ConnectionString:=

'Provider=Microsoft.Jet.OLEDB.4.0;'

'Data Source=' GetCurrentDir '\日記帳.mdb;'

'Persist Security Info=False';

ADOTable1.TableName:='日記帳';

DataSource1.DataSet:=ADOTable1;

DBGrid1.DataSource:=DataSource1;

ADOTable1.Open;

===================引 用 老大仔 文 章===================
請把code貼上來
好讓大家知道哪裡有問題
另外~
可以把錯誤訊息詳細的說出來嗎???
編輯記錄
tokiama 重新編輯於 2010-11-07 22:12:42, 註解 格式走樣讓人看不懂‧
tokiama 重新編輯於 2010-11-07 22:13:44, 註解 無‧
tokiama 重新編輯於 2010-11-07 22:18:21, 註解 圖片顯示不正常‧
老大仔
尊榮會員


發表:78
回覆:837
積分:1088
註冊:2006-07-06

發送簡訊給我
#4 引用回覆 回覆 發表時間:2010-11-08 13:58:52 IP:59.120.xxx.xxx 未訂閱
程式不是錯在Application.Run;
是錯在你那個Form中是否有用到支出欄位
並且應該是程式碼在抓資料時
您的型態不符才對



===================引 用 tokiama 文 章===================
一啟動程式就錯誤的訊息




會發生這問題的起因,程式沒改,只改資料型態,把紅圈圈的地方改成數字型態。


連線方式是在程式中設定。
ADOTable1.ConnectionString:=

'Provider=Microsoft.Jet.OLEDB.4.0;'

'Data Source=' GetCurrentDir '\日記帳.mdb;'

'Persist Security Info=False';

ADOTable1.TableName:='日記帳';

DataSource1.DataSet:=ADOTable1;

DBGrid1.DataSource:=DataSource1;

ADOTable1.Open;

===================引 用 老大仔 文 章===================
請把code貼上來
好讓大家知道哪裡有問題
另外~
可以把錯誤訊息詳細的說出來嗎???
tokiama
一般會員


發表:34
回覆:60
積分:23
註冊:2009-04-19

發送簡訊給我
#5 引用回覆 回覆 發表時間:2010-11-08 15:05:20 IP:120.107.xxx.xxx 訂閱
之後想一想...也做了測試,那個出錯是在 ADOTable Open 之後才出問題。

在這之前就只有設定連線的方式跟把資料撈到 DBGrid 上。

把資料顯示在 DBGrid 上,因資料庫是 Integer 而 DBGrid 上面是只能放字串,這是出錯的原因?

目前只想到這個,我連上資料庫後讓資料顯示在 DBGrid 上時,要怎麼讓顯示時先轉型態啊?

===================引 用 老大仔 文 章===================
程式不是錯在Application.Run;
是錯在你那個Form中是否有用到支出欄位
並且應該是程式碼在抓資料時
您的型態不符才對
老大仔
尊榮會員


發表:78
回覆:837
積分:1088
註冊:2006-07-06

發送簡訊給我
#6 引用回覆 回覆 發表時間:2010-11-08 15:11:55 IP:59.120.xxx.xxx 未訂閱
DBGrid並不會因為資料庫裡的欄位是數字就會錯掉
既然是Open之後才錯的
那麼是不是應該先檢查該段程式碼??
不管是Open前
還是Open後
都應檢查


===================引 用 tokiama 文 章===================
之後想一想...也做了測試,那個出錯是在 ADOTable Open 之後才出問題。

在這之前就只有設定連線的方式跟把資料撈到 DBGrid 上。

把資料顯示在 DBGrid 上,因資料庫是 Integer 而 DBGrid 上面是只能放字串,這是出錯的原因?

目前只想到這個,我連上資料庫後讓資料顯示在 DBGrid 上時,要怎麼讓顯示時先轉型態啊?

===================引 用 老大仔 文 章===================
程式不是錯在Application.Run;
是錯在你那個Form中是否有用到支出欄位
並且應該是程式碼在抓資料時
您的型態不符才對
tokiama
一般會員


發表:34
回覆:60
積分:23
註冊:2009-04-19

發送簡訊給我
#7 引用回覆 回覆 發表時間:2010-11-08 15:30:01 IP:120.107.xxx.xxx 訂閱
procedure TDiaryAccountsForm.FormCreate(Sender: TObject);
var i:integer;
begin
for i:=0 to DiaryAccountsForm.ControlCount-1 do
if DiaryAccountsForm.Controls[i] is TEdit then
(DiaryAccountsForm.Controls[i] as TEdit).Text := '';
ShortDateFormat:='yyyy-MM-dd'; //設定日期顯示格式為yyyy-MM-dd
MonthCalendar1.Date:=Now;
DateTimePicker1.Date:=Now;
DateTimePicker2.Date:=Now;
Edit4.Text:='0';
Edit5.Text:='0';
Memo1.Lines.Clear;
Edit1.Enabled:=False; Edit2.Enabled:=False;
Edit1.Text:=DateToStr(MonthCalendar1.Date);
Button3.Enabled:=False;
//--------------------------------------------------------------------資料庫連線
ConnectionPath:=
'Provider=Microsoft.Jet.OLEDB.4.0;'
'Data Source=' GetCurrentDir '\日記帳.mdb;'
'Persist Security Info=False';
//資料庫連線路徑設定↑↑↑
ADOTable1.ConnectionString:=ConnectionPath;
ADOQuery1.ConnectionString:=ConnectionPath;
ADOTable1.TableName:='日記帳';
DataSource1.DataSet:=ADOTable1;
DBGrid1.DataSource:=DataSource1;
ADOTable1.Open;
//------------------------------------------------------------------------------
ADOTable1.Filtered:=True; //篩選功能開啟
ADOTable1.Filter:='日期 = ''' DateToStr(MonthCalendar1.Date) '''';
//篩選指令→ 欄位名 = 條件字串 PS:字串須用''包起來↑↑↑
Edit2.Text:=IntToStr(ADOTable1.RecordCount 1); //ADOTable.RecordCount 計算資料筆數用屬性
end;
分隔線==============================================================================================
FormCreate 是所有程式最先執行比 initialization 慢的對吧?

在這之前就沒有其他使用到支出這欄位的東西了。

之後地方有先註解起來去執行過了,還是支出欄位型態不對。

===================引 用 老大仔 文 章===================
DBGrid並不會因為資料庫裡的欄位是數字就會錯掉
既然是Open之後才錯的
那麼是不是應該先檢查該段程式碼??
不管是Open前
還是Open後
都應檢查
編輯記錄
tokiama 重新編輯於 2010-11-08 00:32:11, 註解 程式碼顯示有問題‧
老大仔
尊榮會員


發表:78
回覆:837
積分:1088
註冊:2006-07-06

發送簡訊給我
#8 引用回覆 回覆 發表時間:2010-11-09 11:11:40 IP:59.120.xxx.xxx 未訂閱
請檢查ADOTable中是否有Field??
有的話請先清空再使用


===================引 用 tokiama 文 章===================
procedure TDiaryAccountsForm.FormCreate(Sender: TObject);
var i:integer;
begin
for i:=0 to DiaryAccountsForm.ControlCount-1 do
if DiaryAccountsForm.Controls[i] is TEdit then
(DiaryAccountsForm.Controls[i] as TEdit).Text := '';
ShortDateFormat:='yyyy-MM-dd'; //設定日期顯示格式為yyyy-MM-dd
MonthCalendar1.Date:=Now;
DateTimePicker1.Date:=Now;
DateTimePicker2.Date:=Now;
Edit4.Text:='0';
Edit5.Text:='0';
Memo1.Lines.Clear;
Edit1.Enabled:=False; Edit2.Enabled:=False;
Edit1.Text:=DateToStr(MonthCalendar1.Date);
Button3.Enabled:=False;
//--------------------------------------------------------------------資料庫連線
ConnectionPath:=
'Provider=Microsoft.Jet.OLEDB.4.0;'
'Data Source=' GetCurrentDir '\日記帳.mdb;'
'Persist Security Info=False';
//資料庫連線路徑設定↑↑↑
ADOTable1.ConnectionString:=ConnectionPath;
ADOQuery1.ConnectionString:=ConnectionPath;
ADOTable1.TableName:='日記帳';
DataSource1.DataSet:=ADOTable1;
DBGrid1.DataSource:=DataSource1;
ADOTable1.Open;
//------------------------------------------------------------------------------
ADOTable1.Filtered:=True; //篩選功能開啟
ADOTable1.Filter:='日期 = ''' DateToStr(MonthCalendar1.Date) '''';
//篩選指令→ 欄位名 = 條件字串 PS:字串須用''包起來↑↑↑
Edit2.Text:=IntToStr(ADOTable1.RecordCount 1); //ADOTable.RecordCount 計算資料筆數用屬性
end;
分隔線==============================================================================================
FormCreate 是所有程式最先執行比 initialization 慢的對吧?

在這之前就沒有其他使用到支出這欄位的東西了。

之後地方有先註解起來去執行過了,還是支出欄位型態不對。


tokiama
一般會員


發表:34
回覆:60
積分:23
註冊:2009-04-19

發送簡訊給我
#9 引用回覆 回覆 發表時間:2010-11-09 20:57:31 IP:125.231.xxx.xxx 訂閱
有,在寫入資料的時候有用到。

清空?ADOTable.Field.Clear這個東西嗎?

我在ADOTable.Open前打了ADOTable.Field.Clear它改跳另一個錯誤訊息。

compiler時不會錯,可是執行時就會跳錯誤。

===================引 用 老大仔 文 章===================
請檢查ADOTable中是否有Field??
有的話請先清空再使用
smallfox
高階會員


發表:2
回覆:113
積分:128
註冊:2003-02-19

發送簡訊給我
#10 引用回覆 回覆 發表時間:2010-11-09 23:37:05 IP:211.74.xxx.xxx 訂閱
你對 ADOTable1 這個元件點兩下, 看看是否定義了 TField,
若有的話, 請檢查 "支出" 這個欄位在屬性表上是否是

支出: TStringField

or

支出: TWideStringField

若是, 把它移除, 再重新拉進來就可以了 ....
tokiama
一般會員


發表:34
回覆:60
積分:23
註冊:2009-04-19

發送簡訊給我
#11 引用回覆 回覆 發表時間:2010-11-10 07:57:49 IP:125.231.xxx.xxx 訂閱
可以了!謝謝,也很感謝一直在教不才的我的老大仔。

但是移除後沒再拉一次跟我打了ADOTable1.Field.Clear一樣會出現錯誤訊息。

TField可以用打的輸入嗎?

===================引 用 smallfox 文 章===================
你對 ADOTable1 這個元件點兩下, 看看是否定義了 TField,
若有的話, 請檢查 "支出" 這個欄位在屬性表上是否是

支出: TStringField

or

支出: TWideStringField

若是, 把它移除, 再重新拉進來就可以了 ....
老大仔
尊榮會員


發表:78
回覆:837
積分:1088
註冊:2006-07-06

發送簡訊給我
#12 引用回覆 回覆 發表時間:2010-11-10 08:37:58 IP:59.120.xxx.xxx 未訂閱
感謝您表達了我的意思~
===================引 用 smallfox 文 章===================
你對 ADOTable1 這個元件點兩下, 看看是否定義了 TField,
若有的話, 請檢查 "支出" 這個欄位在屬性表上是否是

支出: TStringField

or

支出: TWideStringField

若是, 把它移除, 再重新拉進來就可以了 ....
老大仔
尊榮會員


發表:78
回覆:837
積分:1088
註冊:2006-07-06

發送簡訊給我
#13 引用回覆 回覆 發表時間:2010-11-10 08:39:15 IP:59.120.xxx.xxx 未訂閱
當然可以

錯誤訊息?那就得看是怎樣的錯誤訊息啊
你給的資訊太少了...

===================引 用 tokiama 文 章===================
可以了!謝謝,也很感謝一直在教不才的我的老大仔。

但是移除後沒再拉一次跟我打了ADOTable1.Field.Clear一樣會出現錯誤訊息。

TField可以用打的輸入嗎?

===================引 用 smallfox 文 章===================
你對 ADOTable1 這個元件點兩下, 看看是否定義了 TField,
若有的話, 請檢查 "支出" 這個欄位在屬性表上是否是

支出: TStringField

or

支出: TWideStringField

若是, 把它移除, 再重新拉進來就可以了 ....
smallfox
高階會員


發表:2
回覆:113
積分:128
註冊:2003-02-19

發送簡訊給我
#14 引用回覆 回覆 發表時間:2010-11-11 23:31:40 IP:211.74.xxx.xxx 訂閱
移除掉沒再拉進來, 執行後就會出現錯誤訊息, 可能是在程式碼或元件設定中有用到:
"支出" 這樣的欄位名稱, 因為沒拉進來, 當然不會出現在程式碼定義
之內,
編譯自然不會出錯, 但執行時要用到, 程式就出現錯誤訊息了 ...

如老大仔所言, TField當然可以動態產生, 只是要多寫程式碼, 不太方便,

通常會在設計時期就將所需的TField拉進來.

(老大仔, 不好意思, 搶了你的榮光 !!)



===================引 用 tokiama 文 章===================
可以了!謝謝,也很感謝一直在教不才的我的老大仔。

但是移除後沒再拉一次跟我打了ADOTable1.Field.Clear一樣會出現錯誤訊息。

TField可以用打的輸入嗎?

===================引 用 smallfox 文 章===================
你對 ADOTable1 這個元件點兩下, 看看是否定義了 TField,
若有的話, 請檢查 "支出" 這個欄位在屬性表上是否是

支出: TStringField

or

支出: TWideStringField

若是, 把它移除, 再重新拉進來就可以了 ....

系統時間:2024-05-03 9:04:28
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!