2017-12-22 10 views
0

Ich habe eine Timestamp-Spalte in meiner Datenbank, die als Zeilenversion verwendet wird. Zu dem Zeitpunkt, zu dem Daten aus der Datenbank gezogen werden, erhalten wir auch eine Zeilenumsetzung, die in Byte [] umgewandelt wurde. Bis zu diesem Zeitpunkt funktioniert alles wie erwartet.how to byte [] zu timestamp

Zum Zeitpunkt der Datenaktualisierung würde ich gerne (in einer gespeicherten Prozedur) überprüfen, ob die Zeilenversion die gleiche ist oder nicht, also eine, die vom Code übergeben wird, mit einer, die in der Datenbank gespeichert ist . Wenn das anders ist, werde ich das Update abbrechen, ansonsten aktualisiert es die Daten.

Jetzt ist mein Problem, wie Byte [] an eine gespeicherte Prozedur übergeben. Der Parametertyp in der gespeicherten Prozedur ist der Zeitstempel.

Hinweis: Ich mache alle db-Operationen in C# mit Enterprise-Bibliothek. Ich kann die gespeicherte Prozedur oder die Datentypen nicht ändern. Es ist eingeschränkt.

+0

Was ist Ihr Byte-Zeitstempelformat? Oder, wie wird der Zeitstempel zu Byte [] an erster Stelle? Vielleicht ist es [diese] (https://stackoverflow.com/questions/10107625/6-bytes-timestamp-to-datetime)? – john

+0

Die Zeitstempel-Syntax ist veraltet. Diese Funktion wird in einer zukünftigen Version von Microsoft SQL Server entfernt. Vermeiden Sie die Verwendung dieser Funktion in neuen Entwicklungsarbeiten, und planen Sie, Anwendungen zu ändern, die diese Funktion derzeit verwenden. https://docs.microsoft.com/en-us/sql/t-sql/data-types/rowversion-transact-sql – Aaron

+0

@john Ich bekomme datarow, von dem ich row_version in Byte-Array wie folgt konvertieren: dr ["row_version "] == DBNull.Value? neues Byte [1]: (byte []) dr ["row_version"]; – user2645738

Antwort

-1

Siehe Code unten:

  DateTime now = DateTime.Now; 
      long bNow = now.ToBinary(); 
      byte[] arrayNow = BitConverter.GetBytes(bNow); 

      long getLong = BitConverter.ToInt64(arrayNow, 0); 

      DateTime getNow = DateTime.FromBinary(getLong); 

      Console.WriteLine(getNow.ToLongTimeString()); 
      Console.ReadLine(); 
+0

Ich denke du hast meine Frage falsch beantwortet. Wenn es so leid tut. Ich wollte nur wissen, was sollte der Datentyp sein, wenn ich die gespeicherte Prozedur aufrufen? Welcher Enterprise-Bibliotheksparametertyp wird dem Zeitstempel des SQL-Servers zugeordnet? – user2645738

+0

Wenn es sich um einen Zeitstempel in der Datenbank handelt, müssen Sie den DateTime-Typ verwenden. – jdweng

+0

Nein, wir können nicht. Bitte sehen Sie unten Lösung, die für mich funktioniert. – user2645738

0

Im Folgenden Code funktioniert wie

erwartet
public static TestMethod(....,byte[] rowVersion) 
{ 
    ......... 
    dbConnection_.AddInParameter(dbcommand, "@row_version", DbType.Binary,rowVersion); 
    ........... 
} 

Above-Code wird Enterprise-Bibliothek. Ich denke, das wird jemandem helfen.

Danke euch allen, die versucht haben, hier zu helfen. Prost..!