02. august 2006 - 18:41Der er
13 kommentarer og 1 løsning
Hvordan kan jeg aflæse/sammenligne et timestamp
Hej,
jeg arbejder med C# og MS SQL Express. Jeg har en tabel med 4 kolonner, hvor den 4. kolonne er et timestamp. Jeg vil gerne kunne hente dette timestamp ind i min applikation, således at jeg kan sammenligne timestamp i databasen med objektets timestamp når et objekt skal opdateres i databasen. Jeg har lavet nedenstående metode, men min string er bare tom når jeg udskriver denne. Jeg gør sikkert et eller andet forkert....men hvad??
public byte[] getTimeStamp(int oid) { byte[] result = new byte[8]; SqlCommand stampCommand = sqlConn.CreateCommand(); SqlDataReader reader; stampCommand.CommandText = "SELECT * FROM sticker WHERE OID = "+oid; try { sqlConn.Open(); reader = stampCommand.ExecuteReader(); while (reader.Read()) { reader.GetBytes(3, 0, result, 0, 8); } sqlConn.Close(); } catch (Exception e) { MessageBox.Show("getTimeStamp FAILED : " + e.ToString()); sqlConn.Close(); } string s = ""; for (int i = 0; i < result.Length; i++) { s+= (char)result[i]; } MessageBox.Show("Timestamp: " + s); return result; }
nej, ikke some datetime, men typen timestamp - der ikke har noget med datatime at gøre, men som blot er en 8 byte værdi, der kan bruges i fbm. at styre samtidigheds problematikken i en distrubueret applikation.
Plejer at have et felt der hedder "Modified" med en værdi hvornår den sidste er blevet rettet i, og så hvis de 2 ikke matcher opdatere den ikke .....
Men ved du om din byte inde nogle noget? prøv System.Diagnostics.Debug.WriteLine inde i din for() loop, og se hvad de 8 byte indeholde... lidt svært at vide hvor det måske går galt .....
Arne V > det fungerer fint. Jeg prøvede selv at skrive ud til console istedet, og her fik jeg ligeledes noget mere brugbart. Tak for hjælpen.
Jeg har lige 2 tillægsspørgsmål. Kan jeg ikke bruge executeScalar istedet for at trække timestamp værdien ud. Det vil være lidt pænere. Så vidt jeg kan se skal der bare ændres lidt på min select - SELECT stamp FROM sticker WHERE OID = XX
Andet spørgsmål er....hvordan sammenligner jeg 2 byte arrays? Det får jeg jo behov for når jeg vil opdatere mit objekt i databasen. Er det via en for løkke eller findes der en funktion. Equals metoden tjekker vel bare om 2 referencer peger på samme objekt, og kigger ikke på indholdet. Vil nedenstående virke:
bool compareArray(byte[] a, byte[] b) { bool result = true; char 1, 2; for(int i = 0; i<8 ; i++) { 1 = a[i]; 2 = b[i]; if(!1.compareTo(2)) { result = false; } } return result; }
Ovenstående burde nok ved nærmere eftertanke være en while løkke.....
arne_v > byte[] har ikke en compareTo metode. Derfor valgte jeg at bruge temp variable. Alternativt kan jeg vel skrive (char)a[i].compareTo((char)b[i]) men umiddelbart kan jeg ikke se at man kan komme uden om char og teste direkte på byte arrayet, idet der ikke eksisterer en compareTo. Måske tager jeg fejl?
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.