2009-08-13 19 views
0

Kann jemand mir helfen, den Fehler in diesem Programm zu identifizieren ADO.NET mit ...Was ist falsch an meinem ADO.NET-Code?

Code:

using System; 
using System.Collections.Generic; 
using System.Text; 
using System.Data; 
using System.Data.SqlClient; 
using System.Transactions; // the code is showing an error in this line 

class Program 
{ 
    static void Main(string[] args) 
    { 
    try 
    { 
     string connectString = "Initial Catalog=AdventureWorks; 
           Data Source=SQLSERVER01; 
           User id =user;password=password"; 
     SqlConnection con = new SqlConnection(); 
     con.ConnectionString = connectString; 

     con.Open(); 

     SqlTransaction tr = null; 
     tr = con.BeginTransaction(); 

     SqlCommand cmd = new SqlCommand("INSERT INTO sunny1(name, id, city, phone, pincode) VALUES ('sandy', 01441, 'abc', 'phone', 122001)", con, tr); 
     cmd.ExecuteNonQuery(); 
     tr.Commit(); 

     Console.WriteLine("transaction completed "); 
    } 
    catch (SqlException e) 
    { 
     tr.Rollback(); 
     Console.WriteLine("teansaction not completed " + e.Message); 
    } 
    catch (System.Exception ex) 
    { 
     Console.WriteLine("system error " + ex.Message); 
    } 
    finally 
    { 
     cn.Close(); 
    } 

    Console.ReadLine(); 
} 
} 

Der Code auch eine Fehlermeldung zeigt an einigen fehlenden Baugruppe zusammen.

+0

Sie benötigen mehr Informationen geben, sonst werden Sie keine hilfreichen Antworten bekommen – marcgg

+0

es irgendwelche spezifischen Grund für Alle Caps im Titel schreiben? – hlovdal

Antwort

4

Darüber hinaus, was Johannes antwortete, würde ich auch starten Sie setzen stark Ihr empfehlen SqlConnection und SqlCommand in using() Blöcken - das garantiert, dass sie am Ende ihrer Lebensdauer entsorgt werden und Bugs vermeiden.

Also statt

SqlConnection con = new SqlConnection(); 
    con.ConnectionString = connectString; 

    con.Open(); 

    SqlTransaction tr = null; 
    tr = con.BeginTransaction(); 

    SqlCommand cmd = new SqlCommand("INSERT INTO sunny1(name, id, city, phone, pincode) VALUES ('sandy', 01441, 'abc', 'phone', 122001)", con, tr); 
    cmd.ExecuteNonQuery(); 
    tr.Commit(); 

sollten Sie verwenden:

using(SqlConnection con = new SqlConnection(connectString)) 
    { 
     SqlTransaction tr = con.BeginTransaction(); 

     using(SqlCommand cmd = new SqlCommand("....", con, tr)) 
     { 
     con.Open(); 
     cmd.ExecuteNonQuery(); 
     tr.Commit(); 
     con.Close(); 
     }  
    }  

Denken Sie auch daran: immer Ihre Verbindung so spät wie möglich öffnen (keine Notwendigkeit, es zu öffnen, wenn Sie noch andere Objekte erstellen müssen - Es muss nur kurz vor dem ExecuteNonQuery() Anruf geöffnet sein und es so schnell wie möglich schließen (lass es nicht offen und warte auf den finally {} Block).

Marc

+0

Er disponiert bereits die Verbindung mit cn.Close() (was Dispose für SqlConnection entspricht) auch SqlCommand.Dispose() tut nichts in seinem Fall (nur wenn die Komponente in einer ISite ist) (aber in der Regel, wenn IDisposable ist implementiert, dann ist es besser, es zu nennen) –

+0

@Pop Catalin: Er ruft cn.Close(), aber die Verwendung von Block ist viel prägnanter und einfacher zu folgen. –

+0

@PopCatalin: Ja, er ist - aber er könnte es früher tun. So spät und so schnell wie möglich zu öffnen ist das Mantra. –

3

Sie haben eine Baugruppe Bezug auf System.Transactions hinzufügen, bevor Sie es in Ihrem Code verweisen können:

  1. Rechtsklick auf den „Referenzen“ Ordner in Ihrem Projekt
  2. Wählen Sie „Verweis hinzufügen ...“
  3. wählen Sie „System.Transactions“ aus der Liste der .NET-Assemblies
2

Sie haben die Codezeile zu entfernen:

using System.Transactions; 

Sie nichts von System.Transactions in Ihrem Code verwenden.

Oder wenn Sie die using-Anweisung beibehalten möchten, fügen Sie einen Verweis auf die System.Transactions-Assembly hinzu.

0

In diesem Beispiel ist es nicht erforderlich, einen einzelnen Befehl in eine Transaktion zu übernehmen. Statt dessen:

con.Open(); 

    SqlTransaction tr = null; 
    tr = con.BeginTransaction(); 

    SqlCommand cmd = new SqlCommand("INSERT INTO sunny1(name, id, city, phone, pincode) VALUES ('sandy', 01441, 'abc', 'phone', 122001)", con, tr); 
    cmd.ExecuteNonQuery(); 
    tr.Commit(); 

tun Sie das gleiche mit weniger Codezeilen:

con.Open(); 

    SqlCommand cmd = new SqlCommand("INSERT INTO sunny1(name, id, city, phone, pincode) VALUES ('sandy', 01441, 'abc', 'phone', 122001)", con); 
    cmd.ExecuteNonQuery(); 
Verwandte Themen