Avatar billede weeelo Nybegynder
19. november 2008 - 19:27 Der er 28 kommentarer og
1 løsning

Insert i SQL Database

Hej eksperter,

Jeg har nedenstående insert, som kører fint igennem, men når jeg tjekker i databasen, så er der ikke tilføjet noget.

            int pId = FindPersonId(p);
            String SQLStatement = "INSERT INTO Appointment "
                + "(Title, Description, StartDate, EndDate, PersonId) "
                + "VALUES ('"
                + a._title + "', '"
                + a._description + "', '"
                + a._start.ToString() + "', '"
                + a._end.ToString() + "', "
                + pId + ");";

            SqlCommand SQLCommand = new SqlCommand(SQLStatement, SQLConnection);
            if (SQLCommand.Connection != null)
            {
                SQLCommand.ExecuteNonQuery();
                Console.WriteLine("Opdaterer...");
            }
            else
            {
                Console.WriteLine("Opdterer ikke...");
            }

Hvad gør jeg forkert?
Avatar billede arne_v Ekspert
19. november 2008 - 19:34 #1
Skriver den "Opdaterer..." ?
Avatar billede weeelo Nybegynder
19. november 2008 - 19:40 #2
Jeps.
Avatar billede weeelo Nybegynder
19. november 2008 - 19:44 #3
DateTime.ToString() kalder dog formatet dd-mm-yyyy hh:mm:ss, hvor databasen benytter yyyy-mm-dd hh:mm:ss.

Derfor har jeg lige prøvet at lave en helt specifik og korrekt string, men uden hjælp!

Jeg har desuden udskrevet SQLStatement til konsollen og kopieret den ind i den manuelle query-browser i VS2008 og der gemte den fint i databasen.

Jeg er en anelse forvirret her.
Avatar billede weeelo Nybegynder
19. november 2008 - 19:45 #4
Desuden har jeg prøvet nedenstående efter en del søgen på nettet:

String SQLStatement = "INSERT INTO Appointment "
                + "(Title, Description, StartDate, EndDate, PersonId) "
                + "VALUES (@title, @description, @start, @end, @person);";
            Console.WriteLine(SQLStatement);
            SqlCommand SQLCommand = new SqlCommand(SQLStatement, SQLConnection);
            SQLCommand.Parameters.AddWithValue("@title", a._title);
            SQLCommand.Parameters.AddWithValue("@description", a._description);
            SQLCommand.Parameters.AddWithValue("@start", a._start.ToString());
            SQLCommand.Parameters.AddWithValue("@end", a._end.ToString());
            SQLCommand.Parameters.AddWithValue("@person", pId);
            SQLCommand.ExecuteNonQuery();
Avatar billede arne_v Ekspert
19. november 2008 - 19:48 #5
Transaktioner og manglende commit ?
Avatar billede weeelo Nybegynder
19. november 2008 - 19:56 #6
Ja, det er formegentlig det der er galt. Hvordan fungerer det?

    SqlTransaction transaction = null;
    transaction = SQLConnection.BeginTransaction();
    SQLCommand.Transaction = transaction;

Alá det?
Avatar billede weeelo Nybegynder
19. november 2008 - 19:58 #7
Avatar billede arne_v Ekspert
19. november 2008 - 19:59 #8
Du skal kalde Commit for at faa rettelserne ned i databasen !
Avatar billede weeelo Nybegynder
19. november 2008 - 20:00 #9
SqlTransaction transaction = SQLConnection.BeginTransaction();
SQLCommand.Transaction = transaction;
transaction.Commit();

Ja, så det her burde være nok?
Avatar billede arne_v Ekspert
19. november 2008 - 20:03 #10
transaction.Commit();

skal ned under din SQLCommand.ExecuteNonQuery() !
Avatar billede weeelo Nybegynder
19. november 2008 - 20:05 #11
int pId = FindPersonId(p);
            String SQLStatement = "INSERT INTO Appointment "
                + "(Title, Description, StartDate, EndDate, PersonId) "
                + "VALUES ('"
                + a._title + "', '"
                + a._description + "', '"
                + a._start.ToString() + "', '"
                + a._end.ToString() + "', "
                + pId + ");";

            SqlCommand SQLCommand = new SqlCommand(SQLStatement, SQLConnection);
            if (SQLCommand.Connection != null)
            {
                SQLCommand.ExecuteNonQuery();
                Console.WriteLine("Opdaterer...");
            }
            else
            {
                Console.WriteLine("Opdterer ikke...");
            }

            SqlTransaction transaction = SQLConnection.BeginTransaction();
            SQLCommand.Transaction = transaction;
            transaction.Commit();

Stadig ingen ny række i min tabel.
Avatar billede arne_v Ekspert
19. november 2008 - 20:23 #12
SqlTransaction transaction = SQLConnection.BeginTransaction();
            SQLCommand.Transaction = transaction;
   
// her laver du insert

            transaction.Commit();
Avatar billede weeelo Nybegynder
19. november 2008 - 21:13 #13
int pId = FindPersonId(p);
            String SQLStatement = "INSERT INTO Appointment "
                + "(Title, Description, StartDate, EndDate, PersonId) "
                + "VALUES ('"
                + a._title + "', '"
                + a._description + "', '"
                + a._start.ToString() + "', '"
                + a._end.ToString() + "', "
                + pId + ");";

            SqlCommand SQLCommand = new SqlCommand(SQLStatement, SQLConnection);
            SqlTransaction transaction = SQLConnection.BeginTransaction();
            SQLCommand.Transaction = transaction;

            if (SQLCommand.Connection != null)
            {
                SQLCommand.ExecuteNonQuery();
                Console.WriteLine("Opdaterer...");
            }
            else
            {
                Console.WriteLine("Opdterer ikke...");
            }

            transaction.Commit();

And still not working.
Avatar billede arne_v Ekspert
19. november 2008 - 21:18 #14
Hvis ikke du havde SQLConnection.BeginTransaction() foer, saa behoever du ikke tilfoeje Commit().

Har du checket at det ryger i den rigtige database og at du kigger det rigtige sted ?
Avatar billede weeelo Nybegynder
19. november 2008 - 21:24 #15
"Hvis ikke du havde SQLConnection.BeginTransaction() foer, saa behoever du ikke tilfoeje Commit()." - den er jeg ikke helt med på?

Jeg er ret sikker på at det er den rigtige database, for jeg kan sagtens hente data ud fra den. Jeg har uploadet mit project, hvis du har lyst til at kigge på det?

www.ginsaturdays.dk/Calendar.zip
Avatar billede arne_v Ekspert
20. november 2008 - 04:07 #16
Jeg mener at hvis man slet ikke angiver noget med transaktion, så vil SQLServer auto committe
efter hver statement.
Avatar billede arne_v Ekspert
20. november 2008 - 04:23 #17
Jeg kan ikke lige få dit program til at køre hos mig.

Hvilket output får du hos dig ?
Avatar billede weeelo Nybegynder
20. november 2008 - 09:25 #18
Ok, så vil det jo faktisk sige at det burde virke med det første jeg postede. Nu har jeg kørt den igen uden at lave en transaction.

Mit output ser således ud:

PersistentStorage created...
Opdaterer...
Søren's id = 1
Søren
Tryk på en vilkårlig tast for at fortsætte . . .
Avatar billede arne_v Ekspert
20. november 2008 - 15:02 #19
Det virker altsaa som om den bliver indsat. Tror du ikke at du indsaetter i en anden database end
i den du kigger i bagefter ?
Avatar billede weeelo Nybegynder
20. november 2008 - 15:22 #20
Det virker også som om den smider den ind, da SQLCommand.ExecuteNonQuery(); returnerer 1.

Det ville virke underligt, hvis jeg kigger i den forkerte. For jeg laver jo udtræk fra den samme database, og når jeg sammenligner det udtræk med det jeg kan se i databasen, passer det fint.

Det jeg gør når jeg kigger i databasen er følgende:

1. Åbner database.mdf, som derefter åbner "Server Explorer" vinduet
2. Herefter åbner jeg "Tables" i træstrukturen og højreklikker på Appointment, hvor jeg vælger "Show Table Data".

Det virker meget underligt. Jeg har lige prøvet en anden tabel, hvor jeg har en unik primær nøgle som id, og 1 allerede er indsat. Da jeg prøvede at indsætte 1 igen, fejlede den:

Unhandled Exception: System.Data.SqlClient.SqlException: Violation of PRIMARY KEY constraint 'PK_Person'. Cannot insert duplicate key in object 'dbo.Person'. The statement has been terminated.

Det må jo betyde at jeg kigger i den rigtige database. Jeg finder det virkelig underligt!
Avatar billede weeelo Nybegynder
20. november 2008 - 16:20 #21
Ok, en ny opdagelse. Jeg har ændret programmet, så når jeg kører det indsætter jeg 3 forskellige appointments og derefter henter jeg alle appointments fra tabellen og printer dem i min konsol. Der bliver de også printet, så den insert'er dem faktisk rigtigt!

Problemet er bare, at når jeg starter programmet igen, så er de ikke gemt i databasen, hvilket jo er ret essentielt for en database :)
Avatar billede arne_v Ekspert
20. november 2008 - 16:25 #22
Bliver database kopieret fra dit udvikling sdir til et koersels dir, naar du koerer
programmet ?

(saaledes at du opdaterer en kopi)
Avatar billede weeelo Nybegynder
20. november 2008 - 16:33 #23
Okay, endelig! Du har ret.

Da jeg først lavede min connectionString ville den ikke compile pga. "Unregocnized escape sequence", så jeg google hurtigt og en løsning var at sætte @ foran, sådan her:

String connectionString = @"Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\Database.mdf;Integrated Security=True;User Instance=True";

Det må dog betyde at jeg blot kopierer databasen, da jeg nu har fjernet det og istedet escape't sådan her: \\

Nu virker det! Tusind tak for hjælpen. Smid et svar, så får du pointene.
Avatar billede weeelo Nybegynder
20. november 2008 - 16:37 #24
Nej, vent. Nu bliver jeg i tvivl. Når jeg kører programmet to gange lige efter hinanden ser det ud til at det virker, men jeg kan stadig ikke se noget i databasen :(
Avatar billede arne_v Ekspert
20. november 2008 - 16:40 #25
@ har kun betydning for hvordan \ opfatttes af C# i strengen.

Men proev og angiv en fuld sti og ikke den |DataDirectory| !
Avatar billede weeelo Nybegynder
20. november 2008 - 16:44 #26
Ja, det virkede endeligt. Nu opdaterer den i databasen. SUPER!

Men hvad i alverden refererer DataDirectory så til?
Avatar billede weeelo Nybegynder
20. november 2008 - 16:51 #27
Og hvorfor har jeg kunne læse fra den, når jeg ikke har kunne skrive til den?
Avatar billede arne_v Ekspert
20. november 2008 - 17:03 #28
Jeg tror at VS kopierer naar den koerer og DataDirectory saa refererer til kopien, du
opdaterer saa kopien og laeser de opdaterede data, naar dit program saa er faerdig med at koere kigger du i originalen og saa mangler opdateringen.

Og et svar fra mig.
Avatar billede weeelo Nybegynder
20. november 2008 - 19:56 #29
Super! Mange tak for hjælpen.
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