Laden...
H
haarrrgh myCSharp.de - Member
Softwareentwickler Raum Köln Dabei seit 03.06.2008 208 Beiträge
Benutzerbeschreibung

Forenbeiträge von haarrrgh Ingesamt 208 Beiträge

28.10.2009 - 13:01 Uhr

...aber dazu muß er die DB auf dem PC erstmal trennen, sonst kann er die mdf & ldf nicht mehr kopieren.
Und nach dem Kopieren muß er die DB auf beiden Rechnern wieder anhängen, auf dem Server auch noch unter einem anderen Namen.

Ich würde einfach die Datensicherung (die er in Form einer .bak-Datei ja sowieso hat) per "Datenbank wiederherstellen" wiederherstellen. Ich glaube das ist einfacher.

28.10.2009 - 10:08 Uhr

Nicht mit einer bak-Datei.
bak-Dateien sind Backups, die kriegst Du im Management Studio nur mit "Datenbank wiederherstellen" zurück (ist im gleichen Kontextmenü wie Anfügen).

Der Vollständigkeit halber:
Anfügen ist dafür gedacht, um eine Datenbank die man vorher manuell getrennt hat (Rechtsklick auf DB --> Tasks --> Trennen) wieder anzufügen.
Das hat aber nichts mit einem Backup (.bak) zu tun!

14.10.2009 - 23:34 Uhr

Mein erstes Programm hab ich mit 15 oder so geschrieben (muß so 1995/96 gewesen sein - meinen ersten PC habe ich mir '95 von dem Geld gekauft das ich zur Konfirmation bekommen habe, da war ich 14).

Es war in Visual Basic 3 und es war ein Klon von Ports of Call.
Ich hatte keine Ahnung von gar nichts, nur ein relativ dünnes Buch "VB3 für Einsteiger" (oder so ähnlich).

Die simplen Masken hatte ich alle fertig (Schiffe kaufen, Schiffe beladen...), aber der Hauptbildschirm im originalen Ports of Call war eine Weltkarte auf der die gekauften Schiffe von A nach B gefahren sind.
Die Weltkarte habe ich noch mit Paint gemalt, aber dann hatte ich keinen blassen Schimmer wie ich es anstellen sollte, die Schiffe auf dieser Karte herumfahren zu lassen.
Da habe ich dann irgendwann aufgehört.

Als ich den Code Jahre später zufällig wiedergefunden habe, habe ich eins gemerkt: damals wußte ich offensichtlich nicht was Funktionen sind 🤔
Der komplette Code war direkt in den Eventhandlern der Buttons, und wenn ich einen 2 Bildschirme langen Codeteil im gleichen Button mehrmals brauchte, habe ich ihn auch mehrmals kopiert & eingefügt...

07.10.2009 - 08:51 Uhr

Ich verstehe den Sinn auch nicht.

200-1000 Datensätze sind nicht besonders viel (auch nicht für Access), von dem Standpunkt aus gesehen ist es nicht nötig dauernd neue DBs anzulegen.

Und wenn Dein Auftraggeber jemals irgendwelche Auswertungen über Reparaturen haben will (wie oft wurde Teil X im letzten Jahr repariert), dann wird die Erstellung dieser Auswertungen deutlich aufwendiger, auf je mehr einzelne Datenbanken die Daten verteilt sind.

01.10.2009 - 00:53 Uhr

Ups 😁
Ich habe mich auch sehr darüber gewundert daß Du IF EXISTS nicht kennst (bei den Sachen die Du hier sonst so postest).
Aber Deine Aussage

"Was meinst du denn mit "IF EXISTS"? Meinst du ein WHERE EXISTS?"

...kam für mich so rüber, als wüßtest Du es wirklich nicht.
Naja, kam mir ja direkt komisch vor...

30.09.2009 - 17:39 Uhr

Nur zur Sicherheit: ich bin nicht derjenige der die Ausgangsfrage gestellt hat.

Ich wollte nur IF EXISTS erklären (und ich habe auch nur der Kürze zuliebe "select *" geschrieben).

30.09.2009 - 16:51 Uhr

Mit IF EXISTS kann man überprüfen ob eine Abfrage etwas zurückliefert oder nicht:


if exists(select * from tabelle)
begin
     -- "tabelle" enthält mind. einen Datensatz
end

03.09.2009 - 09:10 Uhr

Die Namen aller Objekte stehen in Access in der versteckten Tabelle MSysObjects
(um die in Access anzuzeigen: Menü "Extras" --> "Optionen" --> Register "Ansicht" --> Häkchen bei "Systemobjekte" setzen).

Um die Namen aller Tabellen zu bekommen mußt Du folgende Abfrage machen:

select Name from MSysObjects where Type = 1

Dieses Beispiel ist für lokale Tabellen. Wenn Du stattdessen verknüpfte Tabellen (also wenn Du sie z.B. vom SQL-Server in die Access-DB eingebunden hast) mußt Du stattdessen nach Type = 4 filtern.

02.09.2009 - 09:18 Uhr
  1. Woher weiß ich, welche Ausgabe der MSDN 2008 ich habe, z.b. ob es die Dezember Ausgabe ist? Und wie aktualisiere ich meine lokale MSDN am besten, gibt es da irgendeine Updatefunktion? Konnte irgendwie keine finden.
    Vielen Dank!

Das würde mich auch interessieren.
Die Anmerkung mit der Online-Hilfe habe ich gelesen und auf meinem Desktop-PC nutze ich auch die Online-Hilfe, aber mit meinem Laptop bin ich ziemlich oft internetlos unterwegs, da hätte ich gerne die aktuellste Offline-Version drauf.

Hinweis: ich benutze VS 2008 Express, wenn das relevant sein sollte.

28.07.2009 - 00:58 Uhr

Hallo sinfoe,

das sind zwei verschiedene Paar Schuhe.

Dein Verständnis von Distinct ist richtig.

Und "Tab1." ist das gleiche wie "", aber eben nur von einer Tabelle statt von allen.

Entweder man kann es so schreiben, so werden alle Spalten aus beiden Tabellen geladen:

select * from Tab1 inner join Tab2 on Tab1.id = Tab2.id

Oder so, dann werden nur alle Spalten aus Tab1 geladen:

select Tab1.* from Tab1 inner join Tab2 on Tab1.id = Tab2.id

Wenn man das dann noch mit Distinct kombiniert, dann werden auch nur die Spalten aus Tab1 geladen, aber ohne Duplikate:

select distinct Tab1.* from Tab1 inner join Tab2 on Tab1.id = Tab2.id
24.07.2009 - 01:49 Uhr

Hallo V4yd,

wenn Du alle Werte einer bestimmten Spalte haben willst brauchst Du überhaupt nicht danach zu filtern.

Also, statt

SELECT * FROM Tabelle WHERE Col1= '1' AND Col2 LIKE '%' AND Col3 LIKE '%' AND Col4 LIKE '%' AND Col5 LIKE '%'

reicht auch

SELECT * FROM Tabelle WHERE Col1= '1'

Und statt

SELECT * FROM Tabelle WHERE Col1= '%' AND Col2 LIKE '%' AND Col3 LIKE '%' AND Col4 LIKE '%' AND Col5 LIKE '%'

reicht auch

SELECT * FROM Tabelle
21.07.2009 - 14:24 Uhr

Es wird wohl an der Sache mit Punkt und Komma liegen, wie Bernd schon gesagt hat. Auch in T-SQL.
CONVERT versteht Kommazahlen nämlich nur, wenn das Dezimaltrennzeichen ein Punkt ist.

Das kannst Du sehen wenn Du das mal im Management Studio testest:


select convert(float,'123.45')
select convert(float,'123,45')

Der erste Befehl funktioniert, aber der zweite nicht.

Wenn Deine Kommazahlen tatsächlich ein Komma als Trennzeichen haben, dann müßtest Du das vorher noch per REPLACE in einen Punkt ändern.
Also so:

select convert(float,replace('123,45',',','.'))

20.07.2009 - 13:40 Uhr

Dann mußt Du sie einmalig verkleinern, so wie Khalid gesagt hat.
Dann bleibt sie klein.

Die Umstellung des Wiederherstellungsmodells auf "Einfach" ist schon der richtige Weg. Es verkleinert die Datei aber nicht, sondern es sorgt dafür daß nicht mehr jede Transaktion darin gespeichert wird.
Wenn die Datei schon groß ist muß man sie deshalb einmalig manuell verkleinern.

09.07.2009 - 09:59 Uhr

Macht man mit JOIN auch Abfragen auf "ungleich"?

Vielleicht nicht "ungleich" in dem Sinn.
Hier geht es ja eher um "ist nicht in X enthalten".
Und dafür ist ein Left Join prädestiniert:

select tActors.*
from tActors left join tActorsMovies on tActors.ID = tActorsMovies.FK_Actor
where tActorsMovies.FK_Actor is null
order by tActors.ID

bzw. mit Aliasen weil ich schreibfaul bin:

select a.*
from tActors a left join tActorsMovies m on a.ID = m.FK_Actor
where m.FK_Actor is null
order by a.ID
08.07.2009 - 17:35 Uhr

param.Value = ids ;

Was steht denn in "ids"?

10.06.2009 - 13:24 Uhr

Die erste Möglichkeit ist auf jeden Fall die richtige.

Die zweite (mehrere IDs mit Komma getrennt in einem Feld) ist schlechtes Design.

Dein Argument gegen die erste Möglichkeit "die Tabelle wird riesig und die Geschwindigkeit geht in den Keller" ist eigentlich keins.
"Riesig" sind Tabellen mit Millionen Datensätzen. Bei den Größenordnungen um die es sich da bei Dir dreht sollte keine Datenbank irgendwelche Performance-Probleme bereiten, auch wenn ihr 10000 Verkäufer habt...

07.06.2009 - 11:27 Uhr

Genau, eine Abfrage reicht.

Trigger bzw. getrennte Tabelle beim Speichern mitaktualisieren lohnt den Aufwand nicht. Ich kenne SQLite nicht, aber unter MS SQL 2008 würde die Abfrage so aussehen:


select 
	Level,
	min(X) as MinX, 
	max(X) as MaxX, 
	min(Y) as MinY,
	max(Y) as MaxY
from 
	Tabelle
group by 
	Level
order by 
	Level

Da das SQL-Standard ist, wird's unter SQLite auch nicht anders aussehen.

03.06.2009 - 09:34 Uhr

Kommt drauf an, was das für ein Webspace ist.
Wenn Du den Webspace irgendwo gemietet hast, dann hast Du wahrscheinlich auch eine oder mehrere Datenbanken in dem Paket drin.
(und wie genau man dann auf die zugreift, das kommt wieder drauf an was das für eine Datenbank ist: MS SQL Server, MySQL...)

Aber Achtung: viele Anbieter von Webspace + Datenbanken haben die Datenbanken so konfiguriert daß man nur vom zugehörigen Webspace darauf zugreifen kann, aber nicht direkt von extern (also z.B. von Deinem Rechner zuhause).

In dem Fall wäre es eine Möglichkeit, von zuhause auf einen Webservice zuzugreifen der auf dem Webspace liegt, und der seinerseits auf die Datenbank zugreift.

28.05.2009 - 13:09 Uhr

Unter SQL Server mit:

select system_user

Das gibt den angemeldeten User im Format Domäne\User zurück.

17.05.2009 - 17:25 Uhr

Rein der Vollständigkeit halber:
Statt der Table-Variablen ginge auch eine temporäre Tabelle.
Im Gegensatz zur Table-Variablen wird die aber nicht im Speicher gehalten, sondern in die tempdb geschrieben, ist also wahrscheinlich einen Tick langsamer.

Dafür ist die Syntax "bequemer":

SELECT * INTO #temp FROM Test

Die Tabellenvariable muß man vorher erst wie eine normale Tabelle mit CREATE TABLE erzeugen/deklarieren.

Ich würde es aber auch mit einer CTE (Common Table Expression) lösen.

08.05.2009 - 00:11 Uhr

So aus dem Stegreif jetzt erstmal nicht. Wir fangen selber gerade erst mit Subversion an...ich habe den Visual SVN Server vor noch nicht mal einer Woche installiert 😁

Ich fand die Installation & Konfiguration des Servers aber so simpel...ich dachte eigentlich, da kann man nicht viel falsch machen.
Wir nutzen Windows-Authentifizierung...an Berechtigungen habe ich eigentlich auch nur für den Root-Ordner (also "Repositories" im SVN Server-Manager) Vollzugriff für die Gruppe "Entwickler" eingestellt und sonst nix.
Hat einwandfrei funktioniert...wenn man bei den einzelnen Repositories nix anderes einstellt, dann werden die Berechtigungen nach unten vererbt.

Hast Du mal den Troubleshooting-Teil in meinem ersten Link (s.o.) gelesen?

07.05.2009 - 23:40 Uhr

Hallo,

Visual SVN Server unterstützt wirklich nur http und https. svn wird explizit nicht unterstützt. Steht hier:
http://www.visualsvn.com/support/topic/00011/

Was das Verwenden der Active Directory-User betrifft: man kann bei der Installation von Visual SVN Server auswählen ob man Windows- oder Subversion-Authentifizierung benutzen will (für letztere muß man dann von Hand eigene User anlegen).
Ich vermute mal, eure Admins haben das auf Subversion-Auth. gestellt (bzw. einfach weitergeklickt...ich meine das wäre die Standardeinstellung gewesen).

Man kann das aber auch noch nachträglich umstellen, wie das geht steht hier:
http://www.visualsvn.com/server/doc/server-config/ (ungefähr in der Mitte, Überschrift "Access permissions management")

06.05.2009 - 16:13 Uhr

Genau das gleiche Problem hatte ich auch...im Subversion-Forum hat mir auch einer zum for-Befehl geraten.
Ich benutze jetzt folgende Batchdatei:


rem alte Backups loeschen
for /D %%H IN (C:\SvnBackup\*) DO rd /s /q %%H

rem alles sichern
for /D %%I IN (C:\Svn\*) DO "C:\Programme\VisualSVN Server\bin\svnadmin.exe" hotcopy %%I C:\SvnBackup\%%~nI --clean-logs

Achtung: ich glaube, es gab Probleme wenn eins der Repositories ein Leerzeichen im Namen hat.

05.05.2009 - 09:05 Uhr

Dafür gibt es Scope_Identity.
Das gibt die letzte ID des aktuellen Gültigkeitsbereichs zurück, d.h. wenn nach Dir ein anderer einen Insert macht und Du danach

select Scope_Identity()

...ausführst, kriegst Du trotzdem DEINE letzte ID zurück.

01.03.2009 - 12:53 Uhr

Hallo,

zum DB-Design:
Wenn man zu einem Dokument beliebig viele Stichwörter speichern kann würde ich die Stichwörter nicht zusammen in ein Feld in der Dokumenttabelle packen, sondern eine eigene Untertabelle anlegen in der pro Dokument n Datensätze mit Stichwörtern enthalten sein können.

Speziell zum Thema "Dateien in der DB speichern":
Darüber gibt es verschiedene Meinungen...manche sind dafür, manche dagegen.
Ich gehöre zu der "Dafür"-Fraktion, bei mir in der Firma haben wir ein riesiges Archiv (>300 GB) in dem wir hauptsächlich PDF-Dateien und Grafiken ablegen, und wir speichern die Daten auch in einer Datenbank (MS SQL 2005).
Zu meinen Erfahrungen damit hatte ich hier schonmal was geschrieben.

Ich würde auch die eigentlichen Daten (also den Blob) vom Rest trennen, haben wir bei uns auch so gemacht (steht auch in dem Link).

Disclaimer:
Ich spreche hier aber nur aus meinen Erfahrungen mit dem MS SQL Server 2005!
Ich kenne SQLite nicht, und ich kann nicht sagen ob man meine o.g. Aussagen so ohne weiteres auf SQLite übertragen kann.
Z.B. ist SQLite meines Wissens ja eine Embedded-Datenbank, und ich weiß nicht ob es da nicht ab einer bestimmten DB-Größe (die beim Speichern von Dokumenten wahrscheinlich relativ schnell erreicht ist) nicht irgendweche Performance-Probleme o.ä. geben kann, weil SQLite für sowas eigentlich gar nicht gedacht ist.
Sowas müssen die SQLite-Gurus hier beantworten 😁

28.02.2009 - 16:53 Uhr

Zu dem Thema gab es mal 2 ausführliche Artikel von Jürgen Gutsch, inkl. Links zu Anleitungen in der MSDN:

Große Dateien hochladen und in eine Datenbank schreiben
Große Dateien aus einer Datenbank lesen und zum Download bereitstellen.

26.02.2009 - 02:20 Uhr

Über das Tabellendesign hat Jelly ja schon was geschrieben.

Die Abfrage müßte eigentlich so klappen (ungetestet, weil gerade kein SQL Server zur Hand):


select i.ID, r1.Number as Kapazitaet, r2.Number as Verfuegbarkeit
from IdTabelle i
left join RessourcenTabelle r1 on i.ID = r1.IDDS and r1.IDFIELD = 'Kapazität'
left join RessourcenTabelle r2 on i.ID = r2.IDDS and r2.IDFIELD = 'Verfügbarkeit'

Der Trick ist, die Tabelle mit den Kapazitäts- und Verfügbarkeitsdaten (in meiner Abfrage "Ressourcentabelle") 2x unter verschiedenen Aliasen zu joinen - einmal nur mit den Kapazitäten und einmal nur mit den Verfügbarkeiten.

29.01.2009 - 00:21 Uhr

Er meint: wenn Du in der SP am Ende

select * from #Temptabelle

...machst, kannst Du das ganze Resultset im aufrufenden Programm weiterverarbeiten.

Also, Du rufst aus Deinem C#-Programm eine SP auf, machst am Ende der SP "select * from #Temptabelle" und kriegst in Deinem C#-Programm die ganze Temptabelle zurück und kannst sie dann z.B. als Dataset weiterverarbeiten.

29.01.2009 - 00:13 Uhr

So wie ich ihn verstehe will er das nur als Übung für sich selber nachprogrammieren und nicht verkaufen.
Dagegen können sie ja schlecht was machen 😁

21.01.2009 - 23:53 Uhr

Also, für eine einmalige Aktion (um die es sich hier offensichtlich handelt) würde ich mir gar nicht so viele Gedanken machen.

Einfach das machen was am schnellsten zu programmieren ist (in diesem Fall wie das Beispiel von vbprogger)...wenn es ein bißchen länger läuft, wen interessiert's?
Dann läßt man es halt abends laufen. Wenn keine User mehr arbeiten die man stören könnte, dann kann man auch ruhig mal jeden Datensatz einzeln updaten.
Und 18 min. für ein einmaliges Update sind jetzt auch nicht so viel.

Code optimieren den man danach nie mehr braucht ist mMn Zeitverschwendung.

15.01.2009 - 11:51 Uhr

Ich schließe mich meinen Vorrednern an - Etikettendrucker ansteuern geht mit direkten Druckerbefehlen am besten.
Wir setzen auch viele Zebra-Drucker ein (Modell LP 2844), und die Direktansteuerung funktioniert seit 6 Jahren ohne ein einziges Problem.

Wenn man 1x dahintergestiegen ist, dann ist es eigentlich auch ziemlich simpel.
Hier ist z.B. ein Wareneingangsetikett mit 3 Zeilen Text das wir bei uns in der Firma so einsetzen (wie gesagt, Zebra LP 2844):

O
N
D15
S1
Q609,24
q784
A700,250,1,5,4,4,N,"0815"
A420,075,1,5,3,3,N,"12.01.2009"
A150,075,1,4,2,2,N,"Sachbearbeiter"
P1

Das schicke ich einfach so an LPT 1.
Die meisten Drucker sind lokal angeschlossen, aber wir haben auch ein paar die übers Netzwerk angesteuert werden, und das ist auch nicht deutlich langsamer als lokal (aber bei uns ist das auch nicht so zeitkritisch, die Etiketten werden von Menschen manuell aufgeklebt).

Zum Format der Druckerbefehle:
Die eigentlichen Befehle um den Text zu drucken sind in Zeile 7-9 (Zeile 1-6 sind immer gleich und man muß nicht wissen was sie bedeuten)
Das ist eigentlich ziemlich simpel...die Zahlen die da stehen sind einfach die Koordinaten des Textes auf dem Etikett, Schrifthöhe, Schriftbreite usw.

Das ist zwar aufwendiger als Zusammenklicken in einem Reportgenerator, aber mit ein bißchen Übung und Windows Notepad kommt man ziemlich schnell zum Ziel: Koordinaten ändern, Testdruck, Koordinaten nochmal ändern, noch ein Testdruck usw. 😁

Das oben ist nur ein simples Beispiel, aber ich habe vor ein paar Jahren z.B. ein komplettes UPS-Etikett mit allen Barcodes usw. nur mit diesen Druckerbefehlen gebaut...das ist bei uns heute noch im Einsatz.

10.01.2009 - 20:23 Uhr

Also wenn ich später was in der PDF-Datei suche, durchsuche ich doch sicherlich nicht die PDF-Datei an sich, sondern die Spalten die ich beim INSERT mit gefüllt habe?!

Ja, du kannst beliebige Informationen in zusätzlichen Columns unterbringen. Ob du direkt den BLOB durchsuchen kannst, weiss ich nicht.

Das weiß ich auch nicht, habe ich noch nie ausprobiert.
Aber selbst wenn es geht, würde ich es nicht machen. Das kann eigentlich nur langsamer sein als ein indiziertes "normales" Feld.

Ansonsten würde ich, wie auch in meinem verlinkten Beitrag erklärt, den eigentlichen Blob von den Suchfeldern trennen, also in eine separate Tabelle packen.

@Joetempes: Und noch etwas zum Datentyp des Blob-Feldes, falls Du MS SQL Server verwendest.
Bei SQL Server 2008 --> Datentyp FILESTREAM
Zu älteren SQL Server-Versionen hat Khalid direkt unter meinem verlinkten Beitrag etwas geschrieben.

10.01.2009 - 18:34 Uhr

Wenn ja, ist das sinnvoll?

Darüber scheiden sich die Geister und Du wirst dazu in jedem Forum - so auch hier - leidenschaftliche Diskussionen finden.
Sehr kurz zusammengefaßt:

Vorteile:

  • wenn die Dateien einfach auf einem Laufwerk liegen und in der DB nur Indexdaten stehen, dann kann jemand (absichtlich oder aus Versehen) die Dateien löschen oder verschieben und das Programm findet sie nicht mehr- wenn sie in der Datenbank stehen, besteht diese Gefahr nicht
  • Datensicherung ist einfacher, Backup der DB und fertig. Ansonsten muß man zeitgleich Backups des Datei-Ordners und der Index-DB machen, hat ggf. trotzdem Inkonsistenzen wenn während des Backups jemand Dateien löscht oder hinzufügt usw.

Nachteile:

  • die Datenbank wird ziemlich schnell ziemlich groß. Das ist aber nur ein Problem wenn man beschränkten Speicherplatz hat. Performancetechnisch gibt es aber überhaupt keine Probleme wenn man die DB richtig designt (ich spreche aus Erfahrung, s.u.)

Und, wie Khalid schon gesagt hat - der SQL Server 2008-Datentyp FILESTREAM vereint das beste aus beiden Welten.

Wenn ja, was hab ich dann für Tabellen-Spalten, also ID und File mehr kann es doch da dann nicht geben?

Zum reinen Speichern reicht das aus.
Aber normalerweise möchtest Du in Deinem Programm ja auch irgendwelche Möglichkeiten zum Durchsuchen haben, also z.B. alle Dateien anzeigen lassen die zu einem bestimmten Auftrag gehören (oder bestimmte Typen, z.B. nur Rechnungen und Lieferscheine).
Also brauchst Du wahrscheinlich noch mehr Spalten nach denen Du dann filtern kannst, also z.B. Auftragsnummer, Dokumenttyp usw.

Hat sowas schon mal jemand gemacht?

Jawoll! Wir haben bei uns in der Firma ein Dokumentenarchiv im Einsatz, das genau das macht: PDF-Dateien und Grafiken in einer SQL Server 2005-DB ablegen.
Dazu hatte ich hier schonmal was geschrieben.
Der Beitrag ist zwar schon ein halbes Jahr alt, aber alles was da steht ist noch aktuell - außer daß die Tabelle jetzt 312 GB groß ist 😁

09.01.2009 - 09:00 Uhr

Parameter funktionieren in diesem Fall doch nicht, oder?
Er könnte zwar die WHERE-Bedingung mit Parametern statt Stringverknüpfung machen, aber bei dem Beispiel im Ausgangsposting ist ja auch der Tabellenname variabel.
Und das geht doch zumindest direkt auf dem SQL Server nicht (in ADO.NET bin ich mir nicht sicher, kann mir aber nicht vorstellen daß es da anders sein sollte).

18.12.2008 - 09:23 Uhr

Ich vermute mal: um es auf einem USB-Stick zu "installieren" und dann an jedem x-beliebigen Rechner direkt vom USB-Stick zu starten ohne da etwas installieren zu müssen.
Wenn man auf diese Weise schon an jedem fremden Rechner mit OpenOffice Birefe schreiben kann etc., dann wäre es ja auch nett wenn man auch ein bißchen programmieren könnte 😁

15.12.2008 - 08:40 Uhr

Die Delay Time entspricht nicht der Schedule Time des Restore-Jobs, d.h. es muss noch irgendwo der delay hinterlegt sein.
Gruß Micha

Ahhh...Du meinst dieses "Verzögern" hier, oder? (s. angehängte Grafik unten)

Damit habe ich mich ehrlich gesagt noch nie beschäftigt, habe es immer auf 5 min. stehenlassen.
Dann würde ich es auch so machen wir Xynratron gesagt hat:

Alle verbliebenen Logfiles einzeln wiederherstellen:

RESTORE LOG DBName 
FROM DISK = 'x:\backup\dateiname.trn'
WITH NORECOVERY

...und dann die DB vom Standby-Modus wieder online schalten:

RESTORE DATABASE DBName WITH RECOVERY
14.12.2008 - 22:14 Uhr

Hallo vbprogger,

Btw.: alle 30 Minuten und ohne Transactionlog zwischen durch halte ich für etwas riskant, vor allem bei einer SAP DB. Ich würde nicht so oft die DB sichern aber dafür in dichteren Abstand die Transactionlogs sichern.

Er macht ja nicht alle 30 min. Vollsicherungen der DB, sondern Logsicherungen.
Für das Logshipping braucht man theoretisch überhaupt keine regelmäßigen Sicherungen der DB (obwohl ich natürlich trotzdem welche mache 😄), sondern bei der Einrichtung wird EINMAL eine Vollsicherung auf dem Spiegelserver wiederhergestellt und danach werden nur noch automatisch Logsicherungen kopiert und wiederhergestellt.
Aber Du hast schon recht, 30 min. finde ich auch etwas selten. Bei uns ist die erlaubte Ausfallzeit nicht ganz so streng, trotzdem mache ich alle 15 min. die Logsicherungen.

Hallo Micha,

ich habe schon einige Zeit kein Log-Backup wiederhergestellt weil bei uns schon länger nix mehr abgeraucht ist, aber soweit ich mich erinnere, habe ich die Jobs die bei der Einrichtung des Logshippings angelegt worden sind einfach nochmal per Hand gestartet.
Bin mir eigentlich ziemlich sicher daß da kein Delay im Restore-Befehl selber ist (also nicht: "alles wiederherstellen was älter ist als X") sondern daß die Zeitverzögerung nur durch das zeitversetzte Kopieren und Wiederherstellen entsteht. Wenn man die Jobs nochmal per Hand startet müßten eigentlich jeweils alle vorhandenen Backups angepackt werden.

Also:

  1. auf dem Quellserver (sofern noch erreichbar) nochmal den Backup-Job starten --> dann ist alles gesichert was geht
  2. auf dem Spiegelserver nochmal den Kopieren-Job starten --> danach müßten ALLE vorhandenen Log-Backups in dem Backup-Ordner auf dem Zielserver sein
  3. (da bin ich mir jetzt aus dem Kopf nicht mehr ganz sicher, müßte im Büro nochmal in meine Doku schauen)
    Entweder die Backups manuell wiederherstellen (alle mit "with norecovery" und das letzte mit "with recovery") oder - wenn man auch die komplett wiederhergestellte DB per SQL-Befehl vom Standby- in den normalen Modus switchen kann, zum Wiederherstellen den Wiederherstellen-Job auf dem Spiegelserver starten.

Aber wie gesagt - bin mir jetzt gerade nur zu 95% sicher weil a) schon lange nicht mehr gemacht und b) alle Doku im Büro.

Bist Du Dir sicher daß zu dem Zeitpunkt wo Du die Wiederherstellung startest wirklich ALLE Log-Backups schon auf den Zielserver kopiert worden sind?

Unabhängig davon eine andere Sache die ich beim letzten Crash schmerzhaft erfahren mußte und die mir jetzt gerade in dem Zusammenhang einfällt:
Wenn die Spiegel-DB noch im Standby-Modus ist, **NIEMALS **abhängen!!!
Abgehängte DBs im Standby-Modus kann man nämlich nicht wieder anhängen...

01.12.2008 - 00:15 Uhr

In Access geht es so:

Dim strZeile As String

Open "c:\test.txt" For Input As #1
Line Input #1, strZeile
Close #1

Danach steht der Inhalt der 1. Zeile in der Variablen strZeile.

26.11.2008 - 19:42 Uhr

Oder direkt mit SQL:

select serverproperty('ProductVersion')

Das liefert die Versionsnummer in dieser Form zurück:

9.00.3042.00

Was die Zahl bedeutet hat Bernd ja schon geschrieben.

12.11.2008 - 17:27 Uhr

Ist es eigentlich zwingend nötig daß die Datenbank auf DEINEM Rechner ist?
Wenn es auch irgendein anderer Rechner sein kann (Hauptsache erreichbar) kannst Du dir doch für ein paar Euro im Monat ein Webspace-Paket mit einer Datenbank holen.

Dann greift keiner auf Deinen Heim-PC zu, Du kannst Dir den ganzen Aufwand mit Router, Dyndns-Account usw. sparen, den ganzen Administrationskram (Schutz vor bösen Hackern) machen Profis für Dich und die Verbindung ist garantiert auch schneller als Dein Heim-DSL-Anschluß.
Und Dein Rechner müßte nicht 24/7 eingeschaltet sein (Stromkosten!).

Wundert mich daß das noch kein anderer vorgeschlagen hat 😁

06.11.2008 - 11:55 Uhr

Ich bin mir nicht ganz sicher ob ich die Frage richtig verstanden habe.

Der Wert in der Spalte "titel_old" soll ausgegeben werden, und es soll nach der Spalte "profile" gesucht werden.

Daraus ergibt sich für mich der SQL-String den compr00t im Ausgangsposting schon genannt hat. Wenn ich z.B. nach "testprofile" suchen würde:

SELECT titel_old FROM csv_allocation WHERE profile = 'testprofile';

Wenn man nach sonst nichts filtert gibt die Abfrage sowieso alle DS zurück die diesen Wert in der Spalte "profile" haben, beim Filter nach "testprofile" also folgendes:

title
title
title
title
...

usw.

Wo ist jetzt das Problem?

Hat die Tabelle eigentlich gar keinen Schlüssel? Ich sehe da jede Menge völlig identische Datensätze (z.B. 6x "price" / "title" / "testprofile").

04.11.2008 - 14:39 Uhr

Die Datenbank ist MS SQL Server...zumindest benutzt er SqlDataReader, SqlConnection usw.

Und zu der Fehlermeldung: tja, wenn die Spalte "profile" vom Datentyp text ist, dann funktioniert DISTINCT nicht.

compr00t, andere Frage: ist das denn wirklich so richtig daß Du ein Feld vom Typ text (also Text mit unbegrenzter Länge!) in einer Dropdownliste anzeigen willst?
Wenn ich in meinen Tabellen ein Feld vom Typ text habe, dann gibt es in der gleichen Tabelle normalerweise noch mehr "kürzere" Felder (Zahlen, varchar etc.) und nach denen filtere ich um den Datensatz mit dem richtigen Text zu finden.

04.11.2008 - 13:37 Uhr

Das hat eigentlich nichts mit dem Datareader, sondern eher mit dem SQL-String zu tun 😁

Versuch's mal mit:

string queryString = "SELECT DISTINCT profile FROM csv_allocation ";

Durch das "DISTINCT" werden Duplikate rausgefiltert.

04.11.2008 - 09:14 Uhr

Man kann auch in Access sowohl mehrere Tabellen verknüpfen, als auch die Tabellen jeweils über mehr als eine Spalte verknüpfen.

Wenn man mehr als 2 Tabellen verknüpft muß man die Joins nur im Klammern schachteln.
Ein Beispiel:

select *
from (Tabelle1 t1 inner join Tabelle2 t2 on t1.Spalte1 = t2.Spalte1 and t1.Spalte2 = t2.Spalte2)
inner join Tabelle3 t3 on t3.Spalte1 = t1.Spalte1 and t3.Spalte2 = t2.Spalte2

Wenn Du viel mehr Datensätze bekommst als in den Tabellen drin sind, dann liegt das daran daß Du irgendwo in der Abfrage nicht genug Spalten spezifiziert hast anhand denen verknüpft werden soll.
In Deiner letzten Abfrage hat das was mit dem Komma zu tun, das ist nämlich eine alternative Syntax zu "Inner Join":

select *
from Tabelle1 t1, Tabelle2 t2
where t1.Spalte1 = t2.Spalte1

Die Spalten anhand denen gejoint wird stehen in der where-Bedingung. Bei dieser Syntax kann man die allerdings komplett weglassen (was bei Inner Join gar nicht geht), und dann werden ALLE Kombinationen aus den beiden Tabellen zurückgegeben, und eben nicht nur die bei denen die gejointen Spalten gleich sind. Du hast die Tabelle GewerkeKopf unter 2 verschiedenen Aliasen 2x geladen (gk und gp) und nicht nicht angegeben wie die beiden verknüpft werden sollen.
Versuch die Abfrage mal in die Syntax aus meinem ersten Beispiel umzubauen.

03.11.2008 - 16:04 Uhr

Es gibt auch genug Informationen im Internet, wenn man mal ein bißchen sucht - beim Wikipedia-Eintrag von Code 128 habe ich gerade einen Link mit einer ausführlichen Beschreibung gefunden:
http://grandzebu.net/index.php?page=/informatique/codbar-en/code128.htm

Mit Erklärung wie die Checksumme berechnet wird, mit dem Font zum Download und mit einem kleinen Programm zum Testen (ähnlich dem was ich in meinem letzten Beitrag beschrieben habe).
Sogar der Quellcode steht da direkt auf der Seite, allerdings in VB und mit französischen Kommentaren 😁

03.11.2008 - 15:49 Uhr

Naja, unabhängig davon ob Du den eigentlichen Barcode mit Fonts darstellst oder komplett selber zeichnest...Prüfsumme und Steuercodes mußt Du so oder so ermitteln.

Ich hatte damals ein Programm bei dem man einen Text eingeben, einen Barcode-Typ auswählen und auf einen Knopf drücken konnte, und dann hat das Programm sowohl den Barcode als auch den "Quelltext", also genau den Text inkl. Prüfsumme/Steuercodes ausgegeben den man dann nur noch in dem Font formatieren mußte. Das war mir damals eine große Hilfe zum Ausprobieren. Aber ich habe das Programm leider nicht mehr und weiß auch nicht wie es hieß...das ist 6 Jahre her.

03.11.2008 - 14:10 Uhr

Es gibt für alle gängigen Barcodes True Type-Schriftarten mit denen man die Barcodes einfach darstellen kann, google einfach mal nach "code 128 true type".

Je nach Barcode-Typ mußt Du noch Prüfsummen selber berechnen oder irgendwelche Steuerzeichen vor/hinter den Barcode setzen (ich glaube, bei Code 128 braucht man eine Prüfsumme).

Ich habe mir damals auch alle möglichen Barcode-Typen angeschaut bevor ich mich für einen entschieden habe.
Meine Entscheidung ist damals auf Codabar gefallen, weil ich da noch nicht mal eine Prüfsumme berechnen muß, man muß nur ein Steuerzeichen davor und dahinter setzen.
Die Barcodes nehmen zwar mehr Platz weg als bei anderen Barcode-Typen und man kann auch keine Buchstaben darstellen (was bei uns beides nicht stört), aber dafür ist die Handhabung total simpel, simpler geht's nicht mehr: wenn ich die Zahl 123 als Barcode haben möchte, schreibe ich "A123A" in ein Textfeld, formatiere das mit der Schriftart Codabar und fertig.

Bei Code 128 ist es wegen der Prüfsumme wahrscheinlich nicht ganz so simpel, aber trotzdem relativ wenig Aufwand verglichen mit Selberzeichnen.

22.10.2008 - 13:03 Uhr

Hallo Telefisch,

bigeddie hat in seinem Beispiel schon die richtige Syntax benutzt, aber vielleicht ist es Dir nicht aufgefallen, deshalb weise ich lieber nochmal ausdrücklich darauf hin:

Wenn Du nicht in alle Spalten etwas einfügen willst, dann mußt Du explizit angeben welcher Wert in welche Spalte soll:

insert into Tabelle (Spalte1, Spalte2) values (@WertFuerSpalte1, @WertFuerSpalte2)

Bei Deiner kleinen Testtabelle ist das egal, aber wenn Du bei Deiner richtigen Tabelle nur einen Teil der 70 Spalten füllen willst, dann kannst Du nicht einfach "insert into Tabelle values (...)" schreiben ohne zu sagen in welche Spalten die Werte sollen.

Dadurch kommt nämlich die Fehlermeldung "Anzahl der Abfragewerte und Zielfelder stimmt nicht überein".

20.10.2008 - 09:02 Uhr

Ich wollte etwas mehr verdeutlichen, dass es auch ohne SP und Temp-Table geht, fals die IT rumzickt. Einfach alles immer in einem einzigen Batch machen.

Stimmt, Du hast recht. Daran hatte ich gar nicht gedacht. Wenn ich solche Importaktionen unregelmäßig per Hand starten muß (also kein regelmäßiger Job, sondern nur identische Sachen die ab und zu wiederkehren) speichere ich mir das SQL-Script als .sql-Datei und starte sie im Management Studio per Hand.
Eigentlich mache ich da ja auch nichts anderes, nur halt nicht aus einem selbstgeschriebenen Programm heraus, sondern im Management Studio 😁

@Belzaharas:

Xynratrons Möglichkeit mit dem Merge-Befehl in SQL Server 2008 ist auch noch eine sehr gute Möglichkeit.
Du hast ganz oben geschrieben daß Du nicht weißt welche Version des SQL-Servers ihr einsetzt - das kannst Du herausfinden indem Du mal folgenden Befehl zum Server schickst:

select @@version

Dann bekommst Du einen einzigen Datensatz mit einer einzigen Spalte zurück, in der die Version des SQL-Servers in dieser Form steht:

Microsoft SQL Server 2005 - 9.00.3042.00 (Intel X86) Feb 9 2007 22:47:07 Copyright (c) 1988-2005 Microsoft Corporation Standard Edition on Windows NT 5.2 (Build 3790: Service Pack 2)

20.10.2008 - 08:40 Uhr

@Belzaharas:

Das mit der ID war ja nur ein Beispiel.
Wenn Deine Datensätze mehrere Spalten hat die verglichen werden müssen (also: ein einzufügender Datensatz gilt als "schon vorhanden" wenn bei einem existierenden alle diese Spalten identisch sind), dann kannst Du das theoretisch trotzdem so machen wie ich beschrieben habe, Du mußt mein Beispiel nur ein bißchen aufbohren:

a) alle zu vergleichenden Spalten müssen in die Temptabelle

b) bei den Joins müssen jeweils alle zu vergleichenden Spalten gejoint werden.
Also z.B. so:

delete t.* from #tmp t inner join EchtTabelle e on t.gpstime = e.gpstime and t.einheitenid = e.einheitenid and ...

@Xynratron:

Dein erstes Beispiel ist dann zwar immer noch pro einzufügendem Datensatz jeweils ein DB-Zugriff, aber es ist besser als Überprüfung und Einfügen jeweils einzeln zu machen (falls alle anderen Möglichkeiten bei ihm wg. Einschränkungen nicht umsetzbar sind).

Und Dein zweites Beispiel ist ja im Prinzip genau das was ich geschrieben habe 🙂