Hallo alle Zusammen,
ich versuche Datenbanken mit Visual Studio zu lesen.
Es klappt alles sehr gut nur mit eine Luxusproblem und zwar er ändert
der Datum der Datenbanken, obwohl er nur gelesen hat.
Wie kann das ändern im dem er das Datum nicht ändern sollte?
gibt es eine fertige Methode, der diese Änderung verhindern.
Ich habe im internet"SQL_MODE_READ_ONLY" was gefunden, aber das weiss es
nicht ob es brauchbar ist?
Danke für jeden Tips
als Beispiel wenn ich eine Datein (word, text) und nicht ändere dann
muss es auch die alte Datum der Dateien gleich unverändert bleiben, weil
es keine Änderung durchgefüht wurde.
Bei mir obwohl ich nur von der datenbanken nur lese ändert sich das
Datum der dateien,ob es geändert wurde was nicht wahr ist!!!!!
Peter II schrieb:> Welche Datenbank, welches Datum ändert sicht?
Wie PeterII schon geschrieben hat:
Meine Güte kannst du mal etwas konkretere Angaben machen.
Meinst du Oracle, DB/2, MySql, SQL Server oder etwa über das unsägliche
Access?
Wie programmierst du die Datenbank. Über native Treiberbibliotheken oder
über ODBC oder was?
Welche Programmiersprache? Basic C-sharp, C++, J++, ...
Hallo,
ich habe es probiert den Befehl "SQL_MODE_READ_ONLY", aber es ändert
isch nichts.
Die Datenbanken (mdb) ändern sich bei jede Öffnung, obwohl es nur
geöffnet waren und keine Änderungen durchgeführt worden.
Hat jemenden eine Idee, wo es daran liegen könnte?
Für jede Hilfe bin ich dankbar
Das dürfte ein grundlegendes Problem von Access sein. Möglicherweise
kannst Du im ODBC-Setup der Acess-Datenquelle ein "read-only"-Flag
setzen, also nicht in Deinem Programm, sondern da, wo Du die DSN für
Deine Access-Datei einrichtest.
simo schrieb:> Hat jemenden eine Idee, wo es daran liegen könnte?
nein, aber warum stört dich das? Du könntest mal verscuchen die
Datei-Ready-Only zu machen.
> ich habe es probiert den Befehl "SQL_MODE_READ_ONLY", aber es ändert> isch nichts.
was meinst du als Befehl? "SQL_MODE_READ_ONLY" ist maximal ein Paramete
aber kein befehl. Wo gibt du ihn denn überhaupt ein?
> aber kein befehl. Wo gibt du ihn denn überhaupt ein?
ich gebe den Parameter bei der Methode:
// Connect!
DB = SQLDriverConnect(conn_h, NULL, (SQLCHAR*) _dsn.c_str(),
SQL_NTS,
(SQLCHAR*) szConnectOutput,
_countof(szConnectOutput),
&nResult,
SQL_MODE_READ_ONLY);
Peter II schrieb:> nein, aber warum stört dich das?
Problem ist bei der User, dass er nicht weiss ob es in der Datenbanken
was geändert (aus versehen Z.B) wurde.
> Du könntest mal verscuchen die Datei-Ready-Only zu machen?
Ich versuche den ganzen Zeit, aber Ergebnis ist immer gleich
Ich könnte mir vorstellen, dass dieser Wechsel des Dateidatums durchaus
seine Gründe hat.
Während des Zugriffs, selbst wenn er nur lesend ist, muss die Datenbank
Schicht die betreffenden Records locken, damit nicht während des
Lesezugriffs ein anderer Schreibzugriff dazwischenkommt. Bei einer
filebasierten Lösung (also nicht mit einem dezidiertem Server) geht das
aber nur, wenn in der Datei selber der Lockschutz gemacht wird (also in
einem Byte in der Datei vermerkt wird, dass der Record momentan gelockt
ist). E Voila, schon hast du einen Schreibzugriff, obwohl du nur aus der
DB liest.
Immer drann denken: Eine DB hat auch das Problem, dass mehere Clients
gleichzeitig auf die Daten zugreifen können wollen und dass das die DB
nicht durcheinander bringen oder inkonsistente Ergebnisse liefern darf.
Alles was diese Clients gemeinsam haben ist, dass sie alle auf das
gleiche File zugreifen. Also kann jegliche dazu notwendige
Synchronisierung nur über diese Datei abgewickelt werden.
Karl Heinz Buchegger schrieb:> Während des Zugriffs, selbst wenn er nur lesend ist, muss die Datenbank> Schicht die betreffenden Records locken, damit nicht während des> Lesezugriffs ein anderer Schreibzugriff dazwischenkommt.
Wenn die komplette Datenbank im Nur-Lese-Betrieb "angefasst" wird, dann
sollte dieses Record-Locking entfallen, weil nicht erforderlich.
Und wie ich bereits schrieb, ist das eine Konfigurationsoption des
verwendeten ODBC-Treibers.
Hallo alle zusammen,
Um eine Dateien Schreibgeschützt zu gestalten ist wie folgenden
umzugehen:
.....
.....
CFileStatus fStatus;
const int flagReadOnly = 0x01;
printf("'Dateien ist Schreibgeschützt'...\n");
CFile::GetStatus(inputFileName, fStatus);
fStatus.m_attribute = fStatus.m_attribute | flagReadOnly;
CFile::SetStatus(inputFileName, fStatus);
........
euch noch einen schönen Tag
simo schrieb:> Um eine Dateien Schreibgeschützt zu gestalten ist wie folgenden> umzugehen:
Das ist schön, hier aber nicht hilfreich, da nicht mit Dateioperationen
auf die Datenbankdatei zugegriffen wird, sondern über eine
ODBC-Verbindung.
ja das stimmt aber geht es darum über die DB zugegeriffen (nur lesen)
und am Ende wird die DB schreibgeschutzt erstellt, damit der User weiss
es wurde nichts geändert. Wie gesagt es ist eine Luxus Prob muss man
nicht tun...
Sicher, das ist ein Luxusproblem, bloß helfen dabei Hinweise auf
CreateFile einfach überhaupt nicht, da --wie ich nicht das erste Mal
hier schrieb-- eine ODBC-Verbindung genutzt wird, und man beim
Einrichten dieser spezifischen ODBC-Verbindung konfigurieren kann, ob
nur Lesend auf die Datenbank zugegriffen werden soll.
Und wenn der Access-ODBC-Treiber auch dann der Ansicht sein sollte, das
Dateidatum ändern zu müssen, müsste man sich dessen Quelltext besorgen
und das Verhalten dort ändern. Wenn der Quelltext nicht besorgbar ist
--was bei einem MS-Produkt mehr als wahrscheinlich ist--, müsste man
einen eigenen Access-ODBC-Treiber entwickeln, was bei dem Luxusproblem
hier wirklich völlig illusorisch ist.
man könnte die ACCESS Datei auf auf ein ReadyOny Share oder Datenträger
legen, dann kann der Treiber das Datum nicht veränder. Die Frage ist ob
es dann überhaupt noch geht.
simo schrieb:> Problem ist bei der User, dass er nicht weiss ob es in der Datenbanken> was geändert (aus versehen Z.B) wurde.
Du mutest dem Nutzer also lieber zu, sich zu merken, welche Datei seine
Daten enthält und welches Datum diese Datei nach der letzten gewollten
Änderung hatte, statt dass Du die Datenbank einfach erweiterst und dort
die Änderungsdaten vermerkst? Das könntest Du dem Nutzer dann plakativ
präsentieren.
42m