Avatar billede tomjelen Nybegynder
04. marts 2004 - 11:39 Der er 10 kommentarer og
1 løsning

Søgning efter et "Image" i en MS-SQL DB

Jeg skal lave en metode der gemmer noget data ned i to tabeller, den ene tabel har nogle oplysninger om en bug og et felt der angiver et ID til hvilken række mit billede ligger i en anden tabel, som bare består af det ID og selve billedet gemt som Image typen.

Så min tankegang var at jeg først lægger billedet ned via:
cmd = new OleDbCommand(
        "INSERT INTO tblBugAttachments("+
        "BugAttachment) "+
        "VALUES(?)",conn);
cmd.Parameters.Add("@BugAttachment", OleDbType.VarBinary, attach.Length).Value = attach;
cmd.ExecuteNonQuery();

AttachmentID'et bliver auto-genereret, men det skal nu bruges over i den anden table hvor jeg lægger resten af min bug info. Så tænkte jeg at jeg bare går ind og finder det ID der passer med det billed som jeg lige har indsat, så jeg bare kan putte det ID ind i min anden SQL-sætning. Dette troede jeg at jeg kunne gøre på denne måde:

cmd = new OleDbCommand("SELECT tblBugAttachments.BugAttachmentID FROM tblBugAttachments WHERE tblBugAttachments.BugAttachment=?",conn);
cmd.Parameters.Add("@BugAttachment", OleDbType.VarBinary, attach.Length).Value = attach;

OleDbDataReader dbReader = null;
dbReader=cmd.ExecuteReader();

Men får denne besked når jeg gør dette:
SQL query error:
The text, ntext, and image data types cannot be compared or sorted, except when using IS NULL or LIKE operator.

Er der en løsning så jeg kan få fat i mit AttachmentID, eller er der en bedre måde at gøre det på?
Avatar billede arne_v Ekspert
04. marts 2004 - 17:46 #1
Det er MS SQLServer og ID er en IDENTITY kolonne ?

Så kan du hente den sidste autognererede key med:

SELECT @@IDENTITY
Avatar billede tomjelen Nybegynder
05. marts 2004 - 14:26 #2
Jo, MS-SQLServer. Og det ser ud til at virke fint, men der er vel bare det problem at jeg skal sørge for at der ikke er andre tilgange til metoden imens jeg gør dette, så resultatet af @@IDENTITY ikke bliver større ind hvad den skulle være. Kan dette gøres på denne måde?

public static Object synchronizeVariable = "locking variable";

public void setNewBug(blah blah)
{
  lock( synchronizeVariable )
  {
    //indsæt i attachment i første table
    cmd.CommandText = @"SELECT @@IDENTITY";
    dbReader = cmd.ExecuteReader();
    //indsæt i næste table, med det ID jeg fik ud
  }
}

Og nu hvor jeg kom ind på denne tanke med lock, burde jeg så ikke bruge det i alle metoder der ændre noget i databasen?
Avatar billede tomjelen Nybegynder
05. marts 2004 - 14:47 #3
Lige et sidste spørgsmål, så giver jeg dig points hehe.

Jeg har følgende nu:

cmd.CommandText = @"SELECT @@IDENTITY";
dbReader = cmd.ExecuteReader();
dbReader.Read();
Console.WriteLine(dbReader.GetValue(0));//test
int bugAttachID = (int)dbReader.GetValue(0);
dbReader.Close();

Jeg kan se på consol udskriften at mit ID er det rigtige, men af en eller anden grund kan jeg ikke caste det over til en integer som jeg forsøger der, får denne fejl: "InvalidCastException: Specified cast is not valid."
Avatar billede arne_v Ekspert
05. marts 2004 - 18:41 #4
@@IDENTITY er per connection, så du behøver ikke bekymre dig om flere samtidige brugere.

Ingen grund til lock.
Avatar billede arne_v Ekspert
05. marts 2004 - 18:43 #5
Prøv:

int bugAttachID = dbReader.GetInt32(0);
Avatar billede tomjelen Nybegynder
08. marts 2004 - 10:49 #6
"int bugAttachID = dbReader.GetInt32(0);" giver en lidt anderledes exception:

"Error: System.InvalidCastException: The data value could not be converted for reasons other than sign mismatch or data overflow. For example, the data was corrupted in the data store but the row was still retrievable."

Med hensyn til lock bør jeg stadig bruge det ved alle metoder der ændre noget i databasen ikke? Jeg synes at huske noget synchronize noget fra java i samme situation.
Avatar billede arne_v Ekspert
08. marts 2004 - 11:03 #7
Det er jo spændende hvad type det er.

Prøv at udskrive typen med:

Console.WriteLIne(typeof(dbReader.GetValue(0)));
Avatar billede arne_v Ekspert
08. marts 2004 - 11:05 #8
Eller allround metoden:

int bugAttachID = Convert.ToInt32(dbReader.GetValue(0));
Avatar billede tomjelen Nybegynder
08. marts 2004 - 11:19 #9
Kanon, det sidste virker. Men tror ikke lige jeg fatter typeof(), linien som du skrev (med rettet "i") får compileren til at brokke sig over nogle parantes syntax fejl, er ligeså snart jeg bruger GetValue(0) at jeg får syntaks fejl.
Men det andet virker så jeg er glad nu!
Avatar billede arne_v Ekspert
08. marts 2004 - 11:23 #10
Jeg ville forsøge at få den til at udskrive hvilken type der faktisk
blev returneret.

Men når den anden virker så fint.
Avatar billede tomjelen Nybegynder
08. marts 2004 - 11:26 #11
Ja, kunne jeg godt forstå :)
Men visual studio ser ikke ud til at fatte linien typeof(dbReader.GetValue(0));
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