04. marts 2004 - 11:39Der 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;
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å?
Denne side indeholder artikler med forskellige perspektiver på Identity & Access Management i private og offentlige organisationer. Artiklerne behandler aktuelle IAM-emner og leveres af producenter, rådgivere og implementeringspartnere.
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?
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."
"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.
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!
Ja, kunne jeg godt forstå :) Men visual studio ser ikke ud til at fatte linien typeof(dbReader.GetValue(0));
Synes godt om
Ny brugerNybegynder
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.