2016-04-16 9 views
1

Ich arbeite mit gespeicherten Prozeduren zum ersten Mal. Ich stehe vor der schwierigen Zeit, ein Problem dahinter zu finden. Wenn ich gespeicherte Prozedur von PhpMyAdmin manuell ausführen, funktioniert es gut. Aber wenn ich es mit C# -Programm benutze. Es zeigt einen Fehler an.Gespeicherte MySQL-Prozedur: Funktioniert manuell & nicht mit C#

Stored Procedure:

CREATE DEFINER=`root`@`localhost` PROCEDURE `Save`(INOUT `id` INT, IN `cId` INT, IN `date` DATE, IN `randomNum` INT, IN `debitAmount` VARCHAR(20), IN `descr` VARCHAR(255)) 
NO SQL 

BEGIN 
INSERT INTO dc (status, dcDate, clientId) VALUES ('1', date, cId); 
SET id = last_insert_id(); 

INSERT INTO bill (dcId, clientId, billDate, referenceNo) VALUES (
    id, 
    clientId, 
    date, 
    randomNum 
); 

INSERT INTO ledger (clientId, debit, ledgerDate, description, dcId, referenceNo) 
VALUES (
    cId, 
    debitAmount, 
    date, 
    descr, 
    id, 
    randomNum 
); 


SELECT @id; 

END 

Wenn ich ausführen dieses Verfahren mit diesen Parametern:

var reader = connection.StoredProcedureInOut("Save", new String[] { "0", theDate, clientId, randomNumber.ToString(), totalDebit.ToString(), description }, new String[] { "id", "date", "cId","randomNum", "debitAmount", "descr" });    

Definition ist:

public MySqlDataReader StoredProcedureInOut(String procedureName, String[] values, String[] keys) 
    { 
     openConnection(); 
     MySqlDataReader reader; 
     try 
     { 
      MySqlCommand cmd = new MySqlCommand(procedureName, connection); 
      cmd.CommandType = CommandType.StoredProcedure; 
      for (int i = 0; i < values.Length; i++) 
      { 
       cmd.Parameters.AddWithValue("@" + keys[i], values[i]); 

      } 
      reader = cmd.ExecuteReader(); 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.Message); 
      reader = null; 
     } 
     return reader; 
    } 

ich diese Meldung:

+2

Versuchen Sie, den ersten Parameter als Ausgabeparameter festzulegen. Werfen Sie einen Blick auf diese Antwort zum Beispiel [Abrufen von SQL Server-Ausgabevariablen in C#] (http://stackoverflow.com/questions/8389192/retrieving-sql-server-output-variables-in-c-sharp) –

Antwort

0

das Problem gelöst, indem Sie den Code wie folgt zu ändern:

var reader = connection.StoredProcedureInOut("Save", new String[] {theDate, clientId, randomNumber.ToString(), totalDebit.ToString(), description }, new String[] {"date", "cId","randomNum", "debitAmount", "descr" }, new String[] {"id"});    

Definition:

public String[] StoredProcedureInOut(String procedureName, String[] values, String[] keys, String[] outputParameters) 
    { 
     openConnection(); 
     String[] newlyInsertedID = new String[outputParameters.Length]; 
     try 
     { 
      MySqlCommand cmd = new MySqlCommand(procedureName, connection); 
      cmd.CommandType = CommandType.StoredProcedure; 

      for (int i = 0; i < outputParameters.Length; i++) 
      { 
       cmd.Parameters.AddWithValue("@" + outputParameters[i], "0"); 
       var parameterName = "@"+outputParameters[i]; 
       cmd.Parameters[parameterName].Direction = ParameterDirection.Output; 
      } 

      for (int i = 0; i < values.Length; i++) 
      { 
       cmd.Parameters.AddWithValue("@" + keys[i], values[i]); 
       var parameterName = "@" + keys[i]; 
       cmd.Parameters[parameterName].Direction = ParameterDirection.Input; 
      } 
      //reader = cmd.ExecuteReader(); 
      cmd.ExecuteNonQuery(); 
      for(int i = 0; i < outputParameters.Length; i++) 
      { 
       var parameterName = "@"+outputParameters[i]; 

       newlyInsertedID[i] = cmd.Parameters[parameterName].Value.ToString(); 
      } 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.Message); 
      //reader = null; 
     } 
     closeConnection(); 
     return newlyInsertedID; 
    } 

Sache, die in dem Code fehlte war Richtung. Außerdem ist dies ein generischer Code, der für alle Arten von Out/InOut gespeicherten Prozeduren ausgeführt werden kann.

Hoffe, das ist hilfreich.

Verwandte Themen