ADOX, ODBC & TQuery question (Long)
From: Stacey R. Brodsky (sbrodsky68_at_^nospam^aol.com)
Date: 01/16/04
- Previous message: Pascal Schmidt-Volkmar: "stored procedure problem"
- Next in thread: Ignacio Vazquez: "Re: ADOX, ODBC & TQuery question (Long)"
- Reply: Ignacio Vazquez: "Re: ADOX, ODBC & TQuery question (Long)"
- Reply: M.Sameer: "Re: ADOX, ODBC & TQuery question (Long)"
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
Date: Fri, 16 Jan 2004 12:02:04 -0500
Hi All,
I have just started playing around with creating .mdb files at run-time, and
then connecting using ODBC.
I am using D5, Win2K...I have a TDatabase, TQuery & TDatasource in my data
module. I connect to the .mdb file using the following code :
const
ODBCDRIVERKEY = '\Software\ODBC\ODBC.INI';
DATASOURCES = ODBCDRIVERKEY + '\ODBC Data Sources';
CRROAMING_DSNNAME = 'CRRoamingData'; {Database Alias}
CRROAMING_FILENAME = 'CRROAMNG.MDB'; {Database Filename}
procedure TfrmFrontDesk.CreateODBCUserDSN(DSNName, FileName : string);
var
Reg : TRegistry;
JetKey : string;
begin
Reg := TRegistry.Create;
try
Reg.RootKey := HKEY_CURRENT_USER;
Reg.OpenKey(DATASOURCES,True);
Reg.WriteString(DSNName{DSNNAME},'Microsoft Access Driver (*.mdb)');
Reg.OpenKey(ODBCDRIVERKEY + '\' + DSNName{DSNNAME},True);
Reg.WriteString('DBQ', IBNetworkDataPath+FileName{GetMDBName});
Reg.WriteString('Driver',GetWindowsSystemFolder + '\odbcjt32.dll');
Reg.WriteString('FIL','MS Access;');
Reg.WriteString('UID','Admin');
Reg.WriteString('PWD','');
Reg.WriteInteger('SafeTransactions',0);
reg.WriteInteger('DriverId',25);
JetKey := ODBCDRIVERKEY + '\' + DSNName + '\Engines\Jet';
Reg.OpenKey(JetKey,True);
Reg.WriteString('ImplicitCommitSync','');
Reg.WriteInteger('MaxBufferSize',2048);
Reg.WriteInteger('PageTimeout',5);
Reg.WriteInteger('Threads',3);
Reg.WriteString('UserCommitSync','Yes');
finally
Reg.Free;
end;
end;
Now, if I run 'select * from roamingdata' via my TQuery, I get all of the
records back, and very quickly. But, if I try 'select * from roamingdata
where member_number = 27', it brings back no rows at all. And yes...there is
definitely a member_number 27.
Here is the creation of the .mdb file :
procedure TfrmMain.Button1Click(Sender: TObject);
var
Catalog : _Catalog;
Table : _Table;
BaseName : String;
DS : String;
ADOCommand : TADOCommand;
x : Integer;
FirstName, LastName : string;
FNameList, LNameList : TStringList;
FNameCnt, LNameCnt : Integer;
begin
if Trim(edtDatabaseName.Text) = '' then begin
MessageDlg('A database name must be supplied...please try again.',
mtWarning, [mbOK], 0);
Exit;
end;
// Name of the new database file
BaseName := edtDatabaseName.Text;
// Create dir if not exists
ForceDirectories(ExtractFilePath(BaseName));
// Create a Catalog Object
Catalog := CreateCOMObject(StringToGUID('ADOX.Catalog')) as _Catalog;
// Set the Connection String
DS := 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source='+BaseName;
// Check if we already have such a file and delete it
if FileExists(BaseName)
then DeleteFile(BaseName);
// Create new Access database
StatusPane.Caption := 'Creating...';
Application.ProcessMessages;
Catalog.Create(DS);
try
ADOCommand := TADOCommand.Create(nil);
FNameList := TStringList.Create;
LNameList := TStringList.Create;
with ADOCommand do begin
ConnectionString := DS;
try
ADOCommand.CommandText :=
'CREATE TABLE ROAMINGDATA ' +
' ( ' +
' UID CHAR(20) PRIMARY KEY, ' +
' ACCOUNT_NUMBER INTEGER NOT NULL, ' +
' MEMBER_NUMBER INTEGER NOT NULL, ' +
' FIRST_LAST CHAR(100), ' +
' FIRST_INIT_LAST_NAME CHAR(50), ' +
' HOME_PHONE CHAR(12), ' +
' HOME_PHONE_STRIPPED CHAR(7), ' +
' WORK_PHONE CHAR(12), ' +
' WORK_PHONE_STRIPPED CHAR(7), ' +
' MEMBERSHIP_TYPE CHAR(50), ' +
' ADDRESS_1 CHAR(100), ' +
' HOME_CLUB CHAR(3), ' +
' ALLOW_ENTRY BIT, ' + // Boolean
' ACCESS_MESSAGE MEMO, ' +
' ACCESS_COLOR INTEGER, ' +
' ACCESS_FONT_COLOR INTEGER, ' +
' BARCODE CHAR(12) ' +
' )';
ADOCommand.Execute;
// Create indices
ADOCommand.CommandText := 'CREATE INDEX IDX_ACCOUNT_NUMBER ON
ROAMINGDATA (ACCOUNT_NUMBER)';
ADOCommand.Execute;
ADOCommand.CommandText := 'CREATE INDEX IDX_MEMBER_NUMBER ON
ROAMINGDATA (MEMBER_NUMBER)';
ADOCommand.Execute;
ADOCommand.CommandText := 'CREATE INDEX IDX_FIRST_INIT_LAST_NAME ON
ROAMINGDATA (FIRST_INIT_LAST_NAME)';
ADOCommand.Execute;
ADOCommand.CommandText := 'CREATE INDEX IDX_HOME_PHONE_STRIPPED ON
ROAMINGDATA (HOME_PHONE_STRIPPED)';
ADOCommand.Execute;
ADOCommand.CommandText := 'CREATE INDEX IDX_WORK_PHONE_STRIPPED ON
ROAMINGDATA (WORK_PHONE_STRIPPED)';
ADOCommand.Execute;
ADOCommand.CommandText := 'CREATE INDEX IDX_BARCODE ON ROAMINGDATA
(BARCODE)';
ADOCommand.Execute;
StatusPane.Caption := 'Created!';
Application.ProcessMessages;
// Add records here
Randomize;
FNameList.LoadFromFile('c:\word lists\names\sb-first-names.txt');
LNameList.LoadFromFile('c:\word lists\names\sb-last-names.txt');
FNameCnt := FNameList.Count;
LNameCnt := LNameList.Count;
ProgressBar.TotalParts := REC_COUNT;
ProgressBar.PartsComplete := 0;
StatusPane.Caption := 'Inserting...';
Application.ProcessMessages;
for x := 1 to REC_COUNT do begin
ProgressBar.IncPartsByOne;
if ProgressBar.PartsComplete mod 10 = 0 then
Application.ProcessMessages;
FirstName := FNameList[Random(FNameCnt)];
LastName := LNameList[Random(LNameCnt)];
FirstName := StringReplace(FirstName, '''', '''''', [rfReplaceAll]);
LastName := StripToAlphaNumeric(LastName);
ADOCommand.CommandText :=
'INSERT INTO ROAMINGDATA '+
'( '+
'UID, '+
'ACCOUNT_NUMBER, '+
'MEMBER_NUMBER, '+
'MEMBERSHIP_TYPE, '+
'FIRST_LAST, '+
'FIRST_INIT_LAST_NAME, '+
'HOME_PHONE, '+
'HOME_PHONE_STRIPPED, '+
'WORK_PHONE, '+
'WORK_PHONE_STRIPPED, '+
'ADDRESS_1, '+
'HOME_CLUB, '+
'ALLOW_ENTRY, '+
'ACCESS_MESSAGE, '+
'ACCESS_COLOR, '+
'ACCESS_FONT_COLOR, '+
'BARCODE '+
') '+
'VALUES '+
'( '+
'''TSTBBRMNG'+IntToStr(x)+''', '+
IntToStr(x)+', '+ //ACCOUNT_NUMBER
IntToStr(x)+', '+ //MEMBER_NUMBER
'''GOLD MEMBERSHIP'', '+ //MEMBERSHIP_TYPE
''''+FirstName+' '+LastName+''', '+ //FIRST_LAST
''''+Uppercase(FirstName[1]+LastName)+''', '+ //FIRST_INIT_LAST_NAME
'''561-741-0961'', '+ //HOME_PHONE
'''7410961'', '+ //HOME_PHONE_STRIPPED
'''561-746-3392'', '+ //WORK_PHONE
'''7463392'', '+ //WORK_PHONE_STRIPPED
'''123 Main Street'', '+ //ADDRESS_1
'''TST'', '+ //HOME_CLUB
'0, '+ //ALLOW_ENTRY
'''Go ahead and let em in!'', '+ //ACCESS_MESSAGE
{IntToStr(clGreen)+}'1, '+ // ACCESS_COLOR
{IntToStr(clBlack)+}'0, '+// ACCESS_FONT_COLOR
'''TST1234567'''+
')';
{ShowMessage(ADOCommand.CommandText);}
ADOCommand.Execute;
end;
StatusPane.Caption := 'Completed!';
Application.ProcessMessages;
ShowMessage('Database and table successfully created!');
except
on E:Exception do begin
ShowMessage('Error in create table/indices : '+e.message);
Exit;
end;
end;
end;
finally
FreeAndNil(LNameList);
FreeAndNil(FNameList);
FreeAndNil(ADOCommand);
end;
end;
Can anyone tell me what I am doing wrong here??? If I go into access and
create a query selecting member_number = 27, it brings back the correct row.
Any suggestions are welcome.
Thanks In Advance,
Stacey R. Brodsky
- Previous message: Pascal Schmidt-Volkmar: "stored procedure problem"
- Next in thread: Ignacio Vazquez: "Re: ADOX, ODBC & TQuery question (Long)"
- Reply: Ignacio Vazquez: "Re: ADOX, ODBC & TQuery question (Long)"
- Reply: M.Sameer: "Re: ADOX, ODBC & TQuery question (Long)"
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]