Announcement

Collapse
No announcement yet.

Fehlermeldung beim MSSQL Server shutdown

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Fehlermeldung beim MSSQL Server shutdown

    Hallo

    Bei meiner Anwendung ADO D7/MSSQL habe ich dan Problem das beim runterfahren des Rechners mit dem Server weder Client- noch Serverseitig eine Meldung erscheint das hier potientiell Daten verloren gehen !!!
    Habe ich bei den Einstellungen des SQL Servers irgendwas vergessen.. Die Info Methode der Connect Komponente hilft mir jedenfalls hier auch nicht

  • #2
    Hallo,

    das Herunterfahren des Servers ist nicht in jedem Fall mit einem Datenverlust verbunden. Wenn das eigene Programm mit derart ungewöhnlichen Fällen rechnen muss und trotzdem seine Daten nach dem nächsten Hochfahren des Servers speichern soll, muss die Recordset-Datenmenge im <i>BatchOptimistic</i>-Modus betrieben werden (dieser Modus ist im Borland-Umfeld unter dem Namen "Briefcase-Modus" bekannter). In diesem Fall wird die Verbindung zum SQL Server nur dann kurzzeitig benötigt, wenn das Recordset mit den Daten gefüllt wird bzw. wenn alle vom Anwender an der lokalen Datenmenge vorgenommenen Änderungen über die Recordset-Methode <i>UpdateBatch</i> zurückgeschrieben werden sollen. Im <i>BatchOptimistic</i>-Modus darf sogar der Client-Rechner zwischendurch heruntergefahren werden, ohne das Daten verlorengehen (solange das Recordset seinen aktuellen Zustand über einen Aufruf in einer lokalen Datei speichert).

    Ein Beispiel könnte so aussehen:
    <pre>
    <font color="#003399"><i>{ ************************************************** *******************
    Autor : Andreas Kosch
    Compiler : Delphi 5 UpdatePack#2
    Betriebssystem : Windows 2000
    Datum : 19.09.2000
    Beschreibung : ADO BriefCase-Modell, Änderungen offline
    durchführen und erst später in der originalen
    SQL Server 2000-Datenbank einspielen
    ************************************************** ******************** }</i></font>

    <b>unit</b> ADOBriefCaseFrm;

    <b>interface</b>

    <b>uses</b>
    Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
    ComCtrls, ExtCtrls, DBCtrls, Db, Grids, DBGrids, ADODB, StdCtrls;

    <b>type</b>
    TForm1 = <b>class</b>(TForm)
    RadioGroup1: TRadioGroup;
    Label1: TLabel;
    StaticTextFile: TStaticText;
    ADOConnection1: TADOConnection;
    ADODataSet1: TADODataSet;
    DBGrid1: TDBGrid;
    DataSource1: TDataSource;
    ADODataSet1ID: TAutoIncField;
    ADODataSet1Name: TStringField;
    ADODataSet1Vorname: TStringField;
    ADODataSet1Ort: TStringField;
    ADODataSet1eMail: TStringField;
    DBNavigator1: TDBNavigator;
    StatusBar1: TStatusBar;
    ButtonUpdateBatch: TButton;
    ButtonCancelBatch: TButton;
    ButtonSaveToFile: TButton;
    <b>procedure</b> RadioGroup1Click(Sender: TObject);
    <b>procedure</b> ButtonUpdateBatchClick(Sender: TObject);
    <b>procedure</b> ButtonCancelBatchClick(Sender: TObject);
    <b>procedure</b> ButtonSaveToFileClick(Sender: TObject);
    <b>private</b>
    <font color="#003399"><i>{ Private-Deklarationen }</i></font>
    FOnline : Boolean;
    <b>public</b>
    <font color="#003399"><i>{ Public-Deklarationen }</i></font>
    <b>end</b>;

    <b>var</b>
    Form1: TForm1;

    <b>implementation</b>

    <font color="#003399"><i>{$R *.DFM}</i></font>

    <b>procedure</b> TForm1.RadioGroup1Click(Sender: TObject);
    <b>begin</b>
    FOnline := False;
    <b>case</b> RadioGroup1.ItemIndex <b>of</b>
    0 : <b>begin</b>
    StatusBar1.Panels[0].Text := <font color="#9933CC">''</font>;
    StatusBar1.Panels[1].Text := <font color="#9933CC">''</font>;
    ADODataSet1.Active := False;
    ADOConnection1.Connected := False;
    <b>end</b>;
    1 : <b>begin</b>
    ADODataSet1.Active := False;
    ADOConnection1.Connected := False;
    <b>with</b> ADODataSet1 <b>do</b>
    <b>begin</b>
    Connection := <b>nil</b>;
    LoadFromFile(StaticTextFile.Caption);
    Active := True;
    StatusBar1.Panels[0].Text := Format(<font color="#9933CC">'%d Datensätze'</font>,
    [RecordCount]);
    <b>end</b>;
    StatusBar1.Panels[1].Text := <font color="#9933CC">'Offline: '</font> + StaticTextFile.Caption;
    <b>end</b>;
    2 : <b>begin</b>
    ADOConnection1.Connected := True;
    <b>with</b> ADODataSet1 <b>do</b>
    <b>begin</b>
    Active := False;
    Connection := ADOConnection1;
    Active := True;
    Refresh;
    StatusBar1.Panels[0].Text := Format(<font color="#9933CC">'%d Datensätze'</font>,
    [RecordCount]);
    <b>end</b>;
    StatusBar1.Panels[1].Text := <font color="#9933CC">'Online SQL Server 2000'</font>;
    FOnline := True;
    <b>end</b>;
    <b>end</b>;
    <b>end</b>;

    <b>procedure</b> TForm1.ButtonSaveToFileClick(Sender: TObject);
    <b>begin</b>
    <b>if</b> ADODataSet1.Active <b>then</b>
    <b>begin</b>
    ADODataSet1.SaveToFile(StaticTextFile.Caption);
    StatusBar1.Panels[1].Text := <font color="#9933CC">'..in Datei gespeichert'</font>;
    <b>end</b>;
    <b>end</b>;

    <b>procedure</b> TForm1.ButtonUpdateBatchClick(Sender: TObject);
    <b>begin</b>
    <font color="#003399"><i>// Objektinspektor: ADODataSet1.MarshalOptions = moMarshalModifiedOnly</i></font>
    ADOConnection1.Connected := True;
    ADODataSet1.Connection := ADOConnection1;
    ADODataSet1.UpdateBatch;
    ADODataSet1.Connection := <b>nil</b>;
    ADOConnection1.Connected := False;
    ShowMessage(<font color="#9933CC">'Lokale Änderungen wurden in der Datenbank eingearbeitet.'</font>);
    <b>end</b>;

    <b>procedure</b> TForm1.ButtonCancelBatchClick(Sender: TObject);
    <b>begin</b>
    ADODataSet1.CancelBatch;
    <b>end</b>;

    <b>end</b>.
    </pre>
    DFM-Datei:
    <pre>
    <b>object</b> Form1: TForm1
    Left = 499
    Top = 222
    Width = 683
    Height = 382
    Caption = <font color="#9933CC">'ADO und das BriefCase-Modell mit einer SQL Server-Datenbank'</font>
    Color = clBtnFace
    Font.Charset = DEFAULT_CHARSET
    Font.Color = clWindowText
    Font.Height = -11
    Font.Name = <font color="#9933CC">'MS Sans Serif'</font>
    Font.Style = []
    OldCreateOrder = False
    PixelsPerInch = 96
    TextHeight = 13
    <b>object</b> Label1: TLabel
    Left = 8
    Top = 64
    Width = 63
    Height = 13
    Caption = <font color="#9933CC">'Lokale Datei:'</font>
    <b>end</b>
    <b>object</b> RadioGroup1: TRadioGroup
    Left = 8
    Top = 8
    Width = 537
    Height = 49
    Caption = <font color="#9933CC">'Datenzugriff'</font>
    Columns = 3
    ItemIndex = 0
    Items.Strings = (
    <font color="#9933CC">'Trennen'</font>
    <font color="#9933CC">'Lokale Datei '</font>#246<font color="#9933CC">'ffnen'</font>
    <font color="#9933CC">'SQL Server-Datenbank '</font>#246<font color="#9933CC">'ffnen'</font>)
    TabOrder = 0
    OnClick = RadioGroup1Click
    <b>end</b>
    <b>object</b> StaticTextFile: TStaticText
    Left = 80
    Top = 64
    Width = 129
    Height = 18
    AutoSize = False
    BorderStyle = sbsSunken
    Caption = <font color="#9933CC">'C:\Temp\ADO_BC.dat'</font>
    TabOrder = 1
    <b>end</b>
    <b>object</b> DBGrid1: TDBGrid
    Left = 8
    Top = 120
    Width = 545
    Height = 193
    DataSource = DataSource1
    TabOrder = 2
    TitleFont.Charset = DEFAULT_CHARSET
    TitleFont.Color = clWindowText
    TitleFont.Height = -11
    TitleFont.Name = <font color="#9933CC">'MS Sans Serif'</font>
    TitleFont.Style = []
    <b>end</b>
    <b>object</b> DBNavigator1: TDBNavigator
    Left = 8
    Top = 96
    Width = 540
    Height = 25
    DataSource = DataSource1
    TabOrder = 3
    <b>end</b>
    <b>object</b> StatusBar1: TStatusBar
    Left = 0
    Top = 329
    Width = 675
    Height = 19
    Panels = &lt;
    item
    Width = 150
    <b>end</b>
    item
    Width = 50
    <b>end</b>&gt;
    <b>end</b>
    <b>object</b> ButtonUpdateBatch: TButton
    Left = 392
    Top = 64
    Width = 75
    Height = 25
    Caption = <font color="#9933CC">'UpdateBatch'</font>
    TabOrder = 5
    OnClick = ButtonUpdateBatchClick
    <b>end</b>
    <b>object</b> ButtonCancelBatch: TButton
    Left = 472
    Top = 64
    Width = 75
    Height = 25
    Caption = <font color="#9933CC">'CancelBatch'</font>
    TabOrder = 6
    OnClick = ButtonCancelBatchClick
    <b>end</b>
    <b>object</b> ButtonSaveToFile: TButton
    Left = 216
    Top = 64
    Width = 75
    Height = 25
    Caption = <font color="#9933CC">'SaveToFile'</font>
    TabOrder = 7
    OnClick = ButtonSaveToFileClick
    <b>end</b>
    <b>object</b> ADOConnection1: TADOConnection
    ConnectionString =
    <font color="#9933CC">'Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security In'</font> +
    <font color="#9933CC">'fo=False;User ID=sa;Initial Catalog=OSSISOFT;Data Source=(local)'</font>
    KeepConnection = False
    LoginPrompt = False
    Provider = <font color="#9933CC">'SQLOLEDB.1'</font>
    Left = 296
    Top = 136
    <b>end</b>
    <b>object</b> ADODataSet1: TADODataSet
    Connection = ADOConnection1
    CursorType = ctStatic
    LockType = ltBatchOptimistic
    MarshalOptions = moMarshalModifiedOnly
    CommandText =
    <font color="#9933CC">'select ID, Name, Vorname, Ort, eMail from LONGFETCH'</font>#13#10<font color="#9933CC">'WHERE ID &lt; '</font> +
    <font color="#9933CC">'100'</font>
    Parameters = &lt;&gt;
    Left = 328
    Top = 136
    <b>object</b> ADODataSet1ID: TAutoIncField
    DisplayWidth = 5
    FieldName = <font color="#9933CC">'ID'</font>
    ReadOnly = True
    <b>end</b>
    <b>object</b> ADODataSet1Name: TStringField
    DisplayWidth = 20
    FieldName = <font color="#9933CC">'Name'</font>
    Size = 50
    <b>end</b>
    <b>object</b> ADODataSet1Vorname: TStringField
    DisplayWidth = 15
    FieldName = <font color="#9933CC">'Vorname'</font>
    Size = 25
    <b>end</b>
    <b>object</b> ADODataSet1Ort: TStringField
    DisplayWidth = 20
    FieldName = <font color="#9933CC">'Ort'</font>
    Size = 50
    <b>end</b>
    <b>object</b> ADODataSet1eMail: TStringField
    DisplayWidth = 20
    FieldName = <font color="#9933CC">'eMail'</font>
    Size = 25
    <b>end</b>
    <b>end</b>
    <b>object</b> DataSource1: TDataSource
    DataSet = ADODataSet1
    Left = 360
    Top = 136
    <b>end</b>
    <b>end</b>
    </pre&gt

    Comment


    • #3
      Danke Andreas für deine Antwort...
      Bei meinem Projekt handelt es sich aber um eine ganz normale Client/Server Anwendung bei der der Fall das der Server aus down geht nicht der Normalfall ist, aber durchaus im Bereich des möglichen ist... Daher suche ich irgendeine Funktion die diesen Fall zumindest den Client Usern mitteilt, damit sie wissen das ihre aktuelle Arbeit eventuell verloren gehen wird. Sie einen Administrator rufen können etc.

      Im Moment gibt mein System hier überhaupt keine Warnung was ich gerne noch ergänzen würde !!

      Hoffe das mir hier irgendwie jemand helfen kann. Dank

      Comment


      • #4
        Hallo,

        &gt;..aber durchaus im Bereich des möglichen ist..

        was passiert, wenn jemand das Netzwerk-Kabel oder den Netzstecker aus dem Switch zieht? Der Client erhält auch in diesem Fall die Fehlermeldung erst dann, wenn er das nächste Mal auf den Server zugreifen will

        Comment


        • #5
          Hallo,

          wäre es also angebracht einen manuellen Connect Test. ( Etwa eine Timer bassierte Read Abfrage des Clients an den Server alle 5 Sekunden ) hier einzubauen um die permanente Server Erreichbarkeit zu prüfen !?
          Wenn ansonsten der Fehler ja erst dann bemerkt würde wenn fertige Daten gespeichert werden sollen wären Daten potentiell ja schon verloren :-(

          Sorry bin in Bezug auf den SQL Server Neuling !? Hätte hier gedacht das hier Verbindungs Probleme einfach etwa über etwa einen TADOConnect Event ermittelt werden können...
          Aber da finde ich nichts brauchbares :-

          Comment


          • #6
            Hallo,

            &gt;..einfach etwa über etwa einen TADOConnect Event ermittelt werden können..

            die ADO-Objekte können nur das weiterreichen, was auf der Betriebssystem-Ebene erkannt wird. Und Win32 erkennt nur den vollständigen Ausfall der eigenen Netzwerk-Karte sofort, aber nicht den Ausfall einer einzelnen IP-Adresse eines anderen Rechners im Netzwerk.

            &gt;..wären Daten potentiell ja schon verloren ..

            Wie ich am Anfang bereits gesagt habe, kann das Programm den Zustand des Recordset-Objekts in diesem Fall immer noch in einer Datei speichern, um diesen nach dem Wieherherstellen der Verbindung aus der Datei einzulesen und die Datenbank zurückschreiben zu lassen. Die Eingaben des Anwenders gehen in diesem Fall nicht verloren

            Comment

            Working...
            X