Rene's FAQ Liste
Dank auch den Schreibern in die dcl*

Liste der FAQ Einträge "Datenbanken"

Indexverweis in dBase Tabelle löschen
Wie kann ich JPGs in meiner Tabelle ablegen und wieder auslesen
Zugriffsfehler: "... wird von einem anderen Benutzer bearbeitet ..."
Lists Tables from Access DataBase
Access Datenbank zur Laufzeit erstellen
ADOConnection in DLL bringt Fehler
MS SQL7 Fehler DB 'tempdb' kann nicht geöffnet werden - SUSPECT
Rechnen mit NULL Werten
Darstellung der aktuellen Kalenderwoche in SQL (MS-SQL7)
Anzeige der Benutzer und deren Rollen (MS-SQL7)


Indexverweis in dBase Tabelle löschen


 Markiere die Tabelle als 'ohne Index' indem Du byte 28 auf 0 setzt.
 
 procedure Tform1.RemoveMDXByte(dbfFile: String);
 const
   Value: Byte = 0;
 var
   F: File of byte;
 begin
   AssignFile(F, dbfFile);
   Reset(F);
   Seek(F, 28);
   Write(F, Value);
   CloseFile(F);
 end;

Seitenanfang

Wie kann ich JPGs in meiner Tabelle ablegen und wieder auslesen


 Schreibt ein JPEG-Bild aus einer Datei in ein Datenbankfeld:
 
 procedure TfmModellEditor.LoadJPEG(Field:TField;FileName:string);
 var JPEGImage:TJPEGImage;
     Stream:TStream;
 begin
   JPEGImage:=TJPEGImage.Create;
   try
     JPEGImage.LoadFromFile(FileName);
     Field.DataSet.Edit;
     Stream:=Field.DataSet.CreateBlobStream(Field,bmWrite);
   try
       JPEGImage.SaveToStream(Stream);
     finally
       Stream.Free;
     end;
   finally
     JPEGImage.Free;
   end;
 end;
 
 Lesen geht umgekehrt. Der Blobstream wird mit bmRead erzeugt, das JPEGImage mit LoadFromStream geladen und mit SaveToFile in eine Datei geschrieben.
 
 Statt der Dateien kann Du auch eine TGraphic als Quelle/Ziel benutzen und das Bild zum Beispiel mit Image1.Picture.Assign(JPEGImage) anzeigen.

Seitenanfang

Zugriffsfehler: "... wird von einem anderen Benutzer bearbeitet ..."


 Post aktualisiert nur den Cache. Also
 
 applyupdates
 commitupdate

Seitenanfang

Lists Tables from Access DataBase


 SELECT MSysObjects.Name
 FROM MSysObjects
 WHERE (((Left([MSysObjects].[name],4))<>"MSys")
   AND ((MSysObjects.Type)=1))
 ORDER BY MSysObjects.Name;

Seitenanfang

Access Datenbank zur Laufzeit erstellen:


 1. Über ODBC:
 =============
 
 function SQLConfigDataSource(
     hwndParent: HWND;
     fRequest: Word;
     lpszDriver: string;
     lpszAttributes: string): BOOLEAN; stdcall; external 'odbccp32.dll';
 
 // SQLConfigDataSource() options
 // ODBC_ADD_DSN = 1;
 // ODBC_CONFIG_DSN = 2;
 // ODBC_REMOVE_DSN = 3;
 // ODBC_ADD_SYS_DSN = 4;
 // ODBC_CONFIG_SYS_DSN = 5;
 // ODBC_REMOVE_SYS_DSN = 6;
 
  if SQLConfigDataSource(
     0,
     ODBC_ADD_DSN,
     'Microsoft Access Driver (*.mdb)',
     'CREATE_DB=c:\ATest.mdb General' )
  then ..ok.. else ..any_error..


 2. Über die KaDAO Tools aus der DSP:
 ====================================
 
 var s: string;
     ListBox1: TListBox;
 
  s := 'c:\palmdb.mdb';
  KADaoDatabase1.Database := s;
  if not FileExists( s ) then KADaoDatabase1.CreateAccessDatabase( s );
  KADaoDatabase1.Connected := TRUE;
  ListBox1.items.Assign( KADaoDatabase1.TableNames );
  KADaoDatabase1.Connected := FALSE;

Seitenanfang

ADOConnection in DLL bringt Fehler


 - Die Unit ActiveX aufnehmen in die USES-Klausel.
 - Bevor irgendwie auf das ADO-Object zugegriffen wird, CoInitializeEx(0,NIL) aufrufen
 - Am Ende der Operationen mit dem ADO-Object CoUnitinialize aufrufen.
 
Vielleicht reicht es nicht die COM-Schnittstelle zu initialisieren, weil du die OLE-Schnittstelle benutzt. In diesem Falle hilft ein OleInitialize(Nil), zum Beenden dann OleUninitialize.

Seitenanfang

MS SQL7 Fehler DB 'tempdb' kann nicht geöffnet werden - SUSPECT
SQL Server 7.0 SP1 dt. auf NT4SP6 startet mit Fehlermeldung:
Datenbank 'tempdb' kann nicht geöffnet werden. Sie wurde bei der Wiederherstellung als SUSPECT markiert.


 - umbennen des tempdb Files tempdb.mdf in tempdb.ldf
 - Starten des Serves mit SQLSERVR -c -f -T3608 -T4022
 - Öffnen einer ISQL Verbindung
 - Reset Status: update master..sysdatabases set status = 4 where name = 'tempdb'
 - Stoppen des SQL Servers (CTRL+C)
 - anschließnedes Starten recovert und legt tempdb wieder neu an
 - Tip: Option Protokoll am Prüfpunkt abschneiden aktivieren

Seitenanfang

Rechnen mit NULL Werten
Möchte man in SQL Anweisungen rechnen und eine Zeile enthält NULL statt einer Zahl (0,1,2..) ist das Ergebnis immer NULL.
Spezielle Funktion interpretieren die NULL wie eine numerische Null (0).


 MS SQL7: COALESCE(), Bsp.: SELECT COALESCE(SUM(DB), 0) FROM ctr_positionen
 Oracle8: nvl()
 MS Access: Nz()

Seitenanfang

Darstellung der aktuellen Kalenderwoche in SQL (MS-SQL7)
Die Funktion datepart(wk,getDate()) des MS SQL Servers zeigt die Kalenderwoche nicht nach der DIN 1355 an. Für Delphi gibt es u.a. in Simons Fundgrube eine Berechnungsvorschrift dafür. Damit können Planungstabellen mit KW Angaben korrekt gefüllt werden. Für eine Liste fehlt nur noch der Vergleich mit der aktuellen Kalenderwoche. Diese liefert der Einzeiler. Er kann als Sicht abgelegt werden und in beliebigen Abfragen und Sichten verwendet werden.
Wird getDate() durch einen Parameter ersetzt, eigent sich der Code auch für eine gespeicherte Prozedur zur Ermittlung der Werte.


 CREATE VIEW get_aktKWJahr AS
 
 -- case Statements zur Anpassung der Wochentage von Mo-So (MS SQL) nach Sa-So (Delphi)
 
 select
  akt_KWJahr = datepart(yy,(getdate()+(((8-case(datepart(dw,getdate())+1) when 8 then 1 else datepart(dw,getdate())+1 end)%7)-3))),
 
  akt_KWWoche = ((datediff(dy,convert(datetime,'01.01.'+convert(char(4),datepart(yy,(getdate()+(((8-case(datepart(dw,getdate())+1) when 8 then 1 else datepart(dw,getdate())+1 end)%7)-3))))),getdate())-3+((case(datepart(dw,convert(datetime,'01.01.'+convert(char(4),datepart(yy,(getdate()+(((8-case(datepart(dw,getdate())+1)when 8 then 1 else datepart(dw,getdate())+1 end)%7)-3))))))+1) when 8 then 1 else datepart(dw,convert(datetime,'01.01.'+convert(char(4),datepart(yy,(getdate()+(((8-case(datepart(dw,getdate())+1) when 8 then 1 else datepart(dw,getdate())+1 end)%7)-3))))))+1 end+1)%7))/7)+1

Seitenanfang

Anzeige der Benutzer und deren Rollen (MS-SQL7)
Es wird eine Liste erzeugt, die alle Nutzer und deren Rollen in der aktuelle Datenbank listet.
Wurde die Datenbank von MSSQL6.5 übernommen, so können versteckte Rollen über den Alias vorhanden sein. Auch diese werden in der Sicht berücksichtigt.
Als Sicht programmiert und über Username mit user_name() verknüpft kann man die Rolle(n) des aktiven Accounts ermitteln.


 SELECT g.name as Role, l.loginname as UserName, 'neu' as Status
 FROM sysmembers m, sysusers s, sysusers g, master.dbo.syslogins l
 WHERE s.uid = m.memberuid
   and g.uid = m.groupuid
   and m.memberuid > 1
   and s.suid = l.suid
 
 UNION
 
 SELECT x.name as Role, l.loginname as UserName, 'alt' as Status
 FROM sysusers x, sysusers s, master.dbo.syslogins l
 WHERE x.uid = s.altuid
   and x.uid > 1
   and s.suid = l.suid
 
 UNION
 
 SELECT s.name AS Role, l.loginname AS UserName, 'Alias' AS Status
 FROM sysusers s, master.dbo.syslogins l
 WHERE s.suid = l.suid
   and s.status = 2
   and rtrim(ltrim(lower(s.name))) <> rtrim(ltrim(lower(l.loginname)))
 
 ORDER BY Role, UserName

Seitenanfang