Avatar billede signori Nybegynder
02. august 2006 - 18:41 Der 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;
        }
Avatar billede Syska Mester
02. august 2006 - 18:43 #1
timestamp? altså som en Datetime i databasen?

Så er det vel bare at

Datatime date = reader.GetDatetime(4);
Avatar billede signori Nybegynder
02. august 2006 - 18:48 #2
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.
Avatar billede Syska Mester
02. august 2006 - 19:00 #3
Det kan en Datetime vel også ......

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 .....

// ouT
Avatar billede arne_v Ekspert
02. august 2006 - 19:15 #4
1)

De 8 bytes kan meget nemt indeholde non printable chars og derfor se tom ud.

Maa jeg foreslaa at du tester med f.eks. Convert.ToBase64String(result)
fremfor din s for loop
Avatar billede arne_v Ekspert
02. august 2006 - 19:17 #5
while (reader.Read())
                {
                    reader.GetBytes(3, 0, result, 0, 8);
                }

ville jeg lave som:

                if (reader.Read())
                {
                    reader.GetBytes(3, 0, result, 0, 8);
                }
                else
                {
                    throw BigException(oid + " eksisterer ikke");
                }
Avatar billede arne_v Ekspert
02. august 2006 - 19:17 #6
indsaet lige selv det new som jeg glemte
Avatar billede signori Nybegynder
02. august 2006 - 19:35 #7
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.....
Avatar billede Syska Mester
02. august 2006 - 19:42 #8
1 første kan du godt.

pass til det 2
Avatar billede arne_v Ekspert
02. august 2006 - 19:56 #9
re 1)

yes

re 2)

1 og 2 er ikke valide variabel navne

du behoover ikke de temporaere variable

du kan lave en retur ved false
Avatar billede arne_v Ekspert
02. august 2006 - 19:57 #10
bool compareArray(byte[] a, byte[] b)
{
  for(int i = 0; i<8 ; i++)
  {
    if(!a[i].compareTo(b[i]))
    {
      return false;
    }
  }
  return true;
}

utestet !!
Avatar billede signori Nybegynder
02. august 2006 - 20:16 #11
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?
Avatar billede arne_v Ekspert
02. august 2006 - 20:25 #12
if(!a[i].compareTo(b[i]))

=>

if(a[i]!=b[i]))
Avatar billede signori Nybegynder
02. august 2006 - 20:33 #13
ok.....er det bare så simpelt. Smider du lige et svar.
Avatar billede arne_v Ekspert
02. august 2006 - 20:37 #14
gerne
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester