使用ADO連接Paradox的一些問題! |
尚未結案
|
fabch2
一般會員 ![]() ![]() 發表:2 回覆:2 積分:0 註冊:2005-01-02 發送簡訊給我 |
當建立資料表時:
create table mytable(
cnumber integer,
cdata char(32),
primary key (cnumber)
);
出現以下錯誤訊息:
[Microsoft] [ODBC Paradox Driver]'Index_7C7CDDA2_C431_11D7' is not a valid name. Make sure that it does not include invalid characters or punctuation and that it is not too long. 若不在 create table 時建立primary key 就可以成功;
但是新增資料時又出現錯誤:
Insert into mytable (cnumber, cdata)
VALUES (0,'test')
錯誤訊息:
[Microsoft][ODBC Paradox Driver]運作必須使用更新查詢 當使用 database desktop 工具加上 primary key 新增資料就可以正常了;
不知有沒有不使用 database desktop 等額外工具解決此問題的方法。
|
RobertLi
一般會員 ![]() ![]() 發表:1 回覆:31 積分:21 註冊:2002-09-01 發送簡訊給我 |
以ADO聯接Paradox7.X可以直接用OLEDB Provider。除非是PostgreSQL/MySQL等非用ODBC不可之環境,還是以不用ODBC而直接用OLEDB Provider較好 在MSSQL時CreateTable及Primary寫在一起很好,但用ADO丟SQL-DDL時這兩個要分開來,否則是會有錯的。但如用BDE-Query去丟反而可以寫在一起。這是我的經驗。 分開寫如
Create Table Table_Name ( ) ;
Alter table Table_Name
add Constraint Table_Name_PX
primary key ( ... ) ; 發表人 - robertli 於 2005/01/02 23:57:00
|
RobertLi
一般會員 ![]() ![]() 發表:1 回覆:31 積分:21 註冊:2002-09-01 發送簡訊給我 |
|
RobertLi
一般會員 ![]() ![]() 發表:1 回覆:31 積分:21 註冊:2002-09-01 發送簡訊給我 |
|
P.D.
版主 ![]() ![]() ![]() ![]() ![]() ![]() 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
引言: ==>不知有沒有不使用 database desktop 等額外工具解決此問題的方法。 將這兩個SQL-DLL用AdoCommand包起來丟到Paradox去作就可以了。如果你是用paradox 利用下列方式會穩很多 建立檔案 procedure CreateNew; var newTable: TTable; begin newTable:= TTable.Create(self); newTable.DatabaseName:= ExtractFilePath(tFile); // tFile是要建立的新檔(含路徑) newTable.TableType:= ttParadox; newTable.TableName:= ExtractFileName(tFile); with newTable.FieldDefs do begin Add('cnumber',ftfloat, 0, False); Add('cdata',ftstring, 32, False); end; newTable.CreateTable; newTable.Free; end; 建立索引 procedure TTable.AddIndex(const Name, Fields: string; Options: TIndexOptions; const DescFields: string); var IndexDesc: IDXDesc; LocaleSave: TLocale; begin FieldDefs.Update; if Active then begin EncodeIndexDesc(IndexDesc, Name, Fields, Options, DescFields); CheckBrowseMode; CursorPosChanged; Check(DbiAddIndex(DBHandle, Handle, nil, nil, IndexDesc, nil)); end else begin LocaleSave := SetTempLocale(False); try EncodeIndexDesc(IndexDesc, Name, Fields, Options, DescFields); finally RestoreLocale(LocaleSave); end; SetDBFlag(dbfTable, True); try Check(DbiAddIndex(DBHandle, nil, NativeTableName, GetTableTypeName, IndexDesc, nil)); finally SetDBFlag(dbfTable, False); end; end; IndexDefs.Updated := False; end; 實例 procedure ... var myTable: TTable begin myTable.Close; myTable.DatabaseName:= ExtractFilePath(tFile); // tFile是剛建立好的檔案含路徑 myTable.TableType:= ttParadox; myTable.TableName:= ExtractFileName(tFile); // 例如 Test.db myTable.Exclusive:= True; myTable.AddIndex('Test.px','cnumber',[ixPrimary,ixUnique]); |
fabch2
一般會員 ![]() ![]() 發表:2 回覆:2 積分:0 註冊:2005-01-02 發送簡訊給我 |
小弟使用的 OLE DB Provider(s) 是
Microsoft OLE DB Provider for ODBC Drivers
不知 RobertLi 兄是否指的是這個,
這是網路上看來的實在也不知道該選哪個好。
ConnectionString := Provider=MSDASQL.1;Persist Security Info=False;Extended Properties="CollatingSequence=ASCII;DefaultDir=C:\;Driver={Microsoft Paradox Driver (*.db )};DriverId=538;FIL=Paradox 5.X;MaxBufferSize=2048;MaxScanRows=8;PageTimeout=5;ParadoxNetPath=C:\WINNT\system32;ParadoxNetStyle=4.x;ParadoxUserName=admin;SafeTransactions=0;Threads=3;UID=admin;UserCommitSync=Yes;" 其他測試如下:
全部都會出現類似 [Microsoft] [ODBC Paradox Driver]'Index_7C7CDDA2_C431_11D7' is not a valid name. 的錯誤 如果使用 TTable 或 TQuery 元件則沒問題且沒有一定要設定 primary key 的限制,
但是還是想知道使用 ADO 的做法。 procedure TForm1.BitBtn1Click(Sender: TObject);
var
sSQL : String;
begin
sSQL := ' create table mytable( '
' cnumber integer, '
' cdata char(32) '
' ); ';
ADOQuery1.SQL.Text := sSQL;
ADOQuery1.ExecSQL;
end; procedure TForm1.BitBtn2Click(Sender: TObject);
var
sSQL : String;
begin
sSQL := ' Alter table mytable '
' add Constraint mytable_PX '
' primary key (cnumber) ';
ADOQuery2.SQL.Text := sSQL;
ADOQuery2.ExecSQL;
end; procedure TForm1.BitBtn3Click(Sender: TObject);
var
sSQL : String;
begin
sSQL := ' create table mytable( '
' cnumber integer, '
' cdata char(32), '
' primary key (cnumber) '
' ); ';
ADOCommand1.CommandText := sSQL;
ADOCommand1.Execute;
end; procedure TForm1.BitBtn4Click(Sender: TObject);
var
sSQL : String;
begin
sSQL := ' create table mytable( '
' cnumber integer, '
' cdata char(32) '
' ); '
' Alter table mytable '
' add Constraint mytable_PX '
' primary key (cnumber) ';
ADOCommand1.CommandText := sSQL;
ADOCommand1.Execute;
end; procedure TForm1.BitBtn5Click(Sender: TObject);
var
sSQL : String;
begin
sSQL := ' Alter table mytable '
' add Constraint mytable_PX '
' primary key (cnumber) ';
ADOCommand1.CommandText := sSQL;
ADOCommand1.Execute;
end;
|
RobertLi
一般會員 ![]() ![]() 發表:1 回覆:31 積分:21 註冊:2002-09-01 發送簡訊給我 |
Paradox 7.X聯接ADO
1.Provider==>MS Jet OLE DB Provider
2.All==>extended properties為Paradox 7.X
3.Connection Data Source為你的paradox所在的目錄 不要用odbc,直接用OLE DBProvider。
我有將BDE Paradox/MSSQL舊系統改用為ADO Paradox/Access/MSSQL/PG的經驗。將碰壁經驗分享一下。 PK是最好要有的,在MSSQL,在ADO,沒PK是不行的。 因為沒傳回資料集,不必用AdoQuery,用AdoCommand就好了。用你的Btn4-Code就好了。 在Ado-MSSQL你將CraeteTable及PK寫在一起,沒問題。在BDE-Paradox也可以,可是在ADO-Paradox就必須分開才行。就是你的Btn4-Code,就可以了。 在Access時各表的PK可以同名﹝即PrimaryKey﹞,可是在Paradox/MSSQL就不可同名。 講到工具,當然你可以用各個資料庫提供的工具來作DDL/DML,不過反正是SQL,而且各家SQL大部份類似,小弟到是建議你自己寫個工具來作這些動作較好。替客戶作維護或是作系統升級與資料庫轉移都很方便。
|
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |