2010-12-16 11 views
0

Ich habe eine SQL Server-Datenbank in einem C# -Projekt.SQL Server-Datenbank löscht Datensätze nicht

Ich benutze eine Verbindungszeichenfolge, um es zu verbinden .. Ich kann die Methode ExecuteNonQuery verwenden, um Daten einzufügen, kein Problem dort.

Aber wenn ich lösche, löscht es nur für einen Moment, sobald ich die Anwendung neu starte, rollt es die Löschung zurück. Irgendwelche Ideen?

PS: Ich habe die Zeichenfolge in einer direkten Abfrage getestet, und es hat gut funktioniert.

public void executeNonQuery(string input) 
{ 
    db.Open(); 
    SqlCommand cmd = new SqlCommand(input, db); 
    cmd.ExecuteNonQuery(); 
    db.Close(); 
} 

EDIT: STREICHUNG Code:

private void buttonSletPost_Click(object sender, EventArgs e) 
    { 
     if(dataGridView1.GetCellCount(DataGridViewElementStates.Selected)>0){ 
      for (int i = 0;i < dataGridView1.GetCellCount(DataGridViewElementStates.Selected); i++) 
      { 
       String str1 = String.Format("WARNING about to DELETE:\n {0} \n BE CAREFULL NO TURNING BACK NOW!", Regnskab.getInstance().dbSelectPostID(dataGridView1.SelectedCells[i].Value.ToString())[0].ToString()); 
       if (MessageBox.Show(str1, "Confirm Deletion", MessageBoxButtons.YesNo) == DialogResult.Yes) 
       { 

        string str = String.Format("DELETE FROM PostTable WHERE PostID={0}", dataGridView1.SelectedCells[i].Value.ToString()); 
        Database.getInstance().executeNonQuery(str); 
        Console.WriteLine(str); 
       } 
      } 
     }else {MessageBox.Show("No cells selected");} 
    } 

Welche folgende Ausgabe geben wird:

DELETE FROM PostTable WHERE PostID=7 

Verbindungszeichenfolge in app.config:

<connectionStrings> 
    <add name="EndProject.Properties.Settings.DBtestConnectionString" connectionString="Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\DBtest.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True" providerName="System.Data.SqlClient" /> 


private Database() 
{ 
     string connStr = ConfigurationManager.ConnectionStrings["EndProject.Properties.Settings.DBtestConnectionString"].ConnectionString; 
     db = new SqlConnection(connStr); 
} 

Und dann öffne ich und schließe es, also ist die Verbindung nicht jedes Mal öffnen.

Um ehrlich zu sein:

ich nicht genau weiß, wo meine DB Informationen zu sehen, hier ein paar Informationen von Immobilien in VS2010.

Anbieter: .NET Framework-Datenanbieter für SQL Server

Typ: Microsoft SQL Server

Andrew 3.: Ich denke, sie vorübergehend gelöscht werden, weil ich die Informationen in meinem Datagridview neu geladen und von dort aus ist es weg . Aber dann, wenn ich die Anwendung schließe und starte es wieder, ist es wieder ...

Auch ich habe gerade mit VS2010 Server Explorer überprüft und habe eine "Show Data" nach dem Löschen (bevor ich es heruntergefahren) und es warn nicht gelöscht.

Aber ich bin jetzt völlig ahnungslos. :-(

+1

könnten Sie bitte den Code angeben, mit dem Sie die Tabelle (n) oder Datenbank (en) löschen? –

+1

Arbeiten Sie mit Visual Studio und überwachen, dass Sie "In Ausgabeverzeichnis kopieren" auf "Immer kopieren" oder "Wenn neuere Kopie" eingestellt haben? (Obwohl das Ihrer Aussage widerspricht, dass das Einfügen kein Problem ist - aber überprüfen Sie es trotzdem). – Olaf

+2

Ich würde gerne 1) sehen, wo Sie die Verbindung erstellen und entsorgen (ich hoffe, Sie speichern es nicht oder halten es für mehrere Befehle am Leben) 2) genau was SQL Sie verwenden 3) Was Sie denken, dass die Zeilen sind "momentan gelöscht" 4) Was lässt dich denken, dass sie 'zurückgerollt' sind? –

Antwort

0

Ok es war apperently mich, wer war auf dem Einfügen Teil ... Jemand schlug vor, dass ich wegen der Visual Studio-Datenbanken jedes Mal erstellt wurde, die Anwendung lief. So habe ich MS SQL 2008 R2 installiert.Erstellt eine neue DB mit demselben Layout. Changed die Verbindungszeichenfolge Und wuupti woo es scheint auf diesen Thread zu arbeiten, krank zurückkommen, wenn es später bricht .. Aber löschen + einfügen beide :-)

Vielen Dank an alle stark jetzt arbeiten, die versucht zu helfen !

3

Viele Anwendungen verwenden Transactions db-Verbindungen zu verwalten. SQL Server standardmäßig nicht, aber auch andere Faktoren in Ihrer Anwendung kann dies tun.

Auch macht es, wenn man wirklich tun dies , und Ihre Eingabe kommt von einer Benutzerschnittstelle, kann ich nicht warten, um Sie zu Little Bobby Tables

+0

Hehe, das könnte irgendwann ein Problem sein, danke, dass ich es bemerkt habe. Mehr Validierung auf dem Weg ;-) Kannst du mir sagen, welche anderen Faktoren in meiner Anwendung das können ... Und würde nicht Die Einfügungen werden auch rückgängig gemacht, wenn es sich um Transaktionen handelt, da ich dieselbe Methode verwende, um das zu tun? –

+0

Wir könnten Ihnen vielleicht sagen, wenn Sie die Informationen, die ich in meinem Kommentar angefordert habe, zu Ihrer Frage hinzufügen. Das ist wirklich nicht genug Code, um überhaupt eine Vermutung zu riskieren. Need More Input ... –

+0

Es ist jetzt da Und es ist nicht Transaktionen, ich habe das unten überprüft, indem Sie versuchen, dies zu tun. Und es sollte auch meine Einsätze zurückrollen, wenn es wäre. –

0

Das Verhalten, das Sie beschreiben, klingt wie Autocommit ist aus. Versuchen Sie Folgendes und sehen Sie, ob der Datensatz (s) gelöscht bleibt :

public void executeNonQuery(string input) 
{ 
     db.Open(); 
     using (var txn = db.BeginTransaction()) 
     { 
      SqlCommand cmd = new SqlCommand(input, db); 
      cmd.Transaction = txn; 
      cmd.ExecuteNonQuery(); 
      db.Close(); 
      txn.Commit(); 
     } 
} 
+0

Weitere Informationen: ExecuteNonQuery erfordert, dass der Befehl eine Transaktion ausführt, wenn sich die dem Befehl zugewiesene Verbindung in einer ausstehenden lokalen Transaktion befindet. Die Transaction-Eigenschaft des Befehls wurde nicht initialisiert. ------------------------------------------------- ------------------- Scheint, keine Transaktionen sind auf –

+0

cmd.Transaction = txn; –

0

Verwenden Sie den SQL Server Profiler, um eine Ablaufverfolgung auszuführen und die tatsächlichen T-SQL-Anweisungen zu erfassen, die in der Datenbank ausgeführt werden.

Dies ist die einfachste Lösung.

Verwandte Themen