2012-04-01 9 views
0

Ich versuche, eine Methode zu erstellen, in der mysql UPDATE, DELETE oder INSERT-Abfrage ausführen kann. Die Methode muss funktionieren, wenn ich mit einem INSERT die last_insert_id() frage oder nicht stelle. Unten ist der Code, den ich im Moment haben:C# mysql eine Rückkehr last_insert_id

public int executeUID(MySqlCommand msCommand) 
{ 
    try 
    { 
    this.Open(); 

    msCommand.Connection = this.msCon; 

    return int.Parse(msCommand.ExecuteScalar().ToString()); 
    } 
    catch (MySqlException ex) 
    { 
    throw ex; 
    } 
    finally 
    { 
    this.Close(); 
    } 
} 

Das Problem dabei ist, dass, wenn ich eine INSERT-Abfrage verwenden, die eine last_insert_id() das Verfahren stark arbeitet zurückgibt. Aber wenn die Abfrage nicht last_insert_id() das Verfahren fehlschlägt. Wie kann ich diese Methode zum Funktionieren bringen?

+0

Sie * sagen, dass die Methode Störungen * : Warum? Was erwartest du von dieser Methode? Wenn Ihre Abfrage eine Auswahl oder etwas anderes ist, was soll die Methode zurückgeben? – Marco

+0

versuchen Sie, die durch die Transaktion betroffenen Zeilen zu erhalten? –

+0

Können Sie ein Beispiel für eine funktionierende Abfrage und ein Beispiel für eine Abfrage, die nicht funktioniert, anzeigen? Im Falle von _malfunctions_ erhalten Sie eine Ausnahme? Und wenn ja, was ist die Fehlermeldung? – Steve

Antwort

0

Warum nicht OUTPUT-Parameter verwenden, es wird die zuletzt eingefügte ID zurückgegeben. Wenn Sie wissen, wann LastInsertID erzeugen kann, dann können Sie einen weiteren Parameter an die Methode übergeben, um zu sagen, dass sie insertID zurückliest, basierend auf diesem Parameter können Sie so etwas tun.

public int executeUID(MySqlCommand msCommand, bool Mode) //Mode==true means insertandRetriveLastID, false means =dont retrive last insertedit 
{ 
    try 
    { 
    this.Open(); 

    msCommand.Connection = this.msCon; 

    if(Mode) //for getting last inserted id 
    { 
     SqlParameter outParams= new SqlParameter("@ID", SqlDbType.Int); 
     outParams.Direction = ParameterDirection.Output; 
     msCommand.Parameters.Add(outParams) 
     msCommand.ExecuteNonQuery(); 
     var outputValue = cmd.Parameters["@ID"].Value; 
    } 
    else //if no inserted id is not there 
    { 
     return msComand.ExecuteNonQuery(); // it will return No of Rows Affected. 
    } 

    } 
    catch (MySqlException ex) 
    { 
    throw ex; 
    } 
    finally 
    { 
    this.Close(); 
    } 
} 

PS: Sie müssen tune es einige für eine bessere Effizienz, wie ich einige grundlegende Ideen gab, wie wir es mit Out-Parameter tun

+0

Ja, das sollte funktionieren. Aus der Perspektive eines sauberen Codes ist es jedoch eine sehr schlechte Praxis. Eine Methode sollte nur eine Sache machen, was hier nicht der Fall ist. Die richtige Lösung wäre es, dies in zwei neue Methoden zu teilen, nicht ein bool hinzufügen, um zwischen den Modi zu wechseln ...... – walther

+0

Ich möchte, dass mein Code so sauber wie möglich ist. Also gibt es keine Methode, die mehrere Dinge macht – Bernhard

Verwandte Themen