2016-08-01 12 views
3

Ich habe ungefähr 7 Stunden damit verbracht, dies durch Versuch und Irrtum herauszufinden. Alle Online-Beispiele, die ich gesehen habe, funktionieren entweder nicht oder nicht oder zeigen nur die Hälfte von dem, wonach ich suche.Nach einem legitimen Beispiel für den Aufruf der gespeicherten Prozedur fragen C#: MYSQL

Hier ist was ich frage: 1. Ein Beispiel für eine einfache gespeicherte Prozedur in MYSQL mit einem IN-Parameter und einem OUT-Parameter. 2. Ein Beispiel für ein FUNCTIONING (wirklich wichtig, weil online Beispiele nicht funktioniert manchmal ...) Aufruf von Visual Studio mit C#. Entweder funktioniert ein Textaufruf oder eine gespeicherte Prozedur. 3. AddWithValue ist veraltet. 4. Ich würde gerne sehen, dass der Out-Parameter tatsächlich funktioniert.

Wenn dies mit MYSQL und Visual Studio unmöglich ist, wäre das auch schön zu wissen.

MYSQL-Dokumentation ist für dieses bestimmte Beispiel nicht gründlich genug. Und pls, kein Visual Studio oder C# Hass.

Vielen Dank im Voraus! :)

EDIT:

Dies ist, was ich haben es geschafft, so weit zu tun, und es funktioniert nicht !!!

MYSQL Seite, HeidiSQL mit:

CREATE DEFINER=`root`@`localhost` PROCEDURE `login`(IN `stuff` VARCHAR(50), IN `pass` VARCHAR(50), OUT `param3` INT) 
    LANGUAGE SQL 
    NOT DETERMINISTIC 
    CONTAINS SQL 
    SQL SECURITY DEFINER 
    COMMENT '' 
BEGIN 

    set param3 = 0; 
    set param3 = (select count(*) from users where username=stuff and userpassword=pass); 
    select @param3; 

END 

Und in C# Seite versuche ich, diese Parameter zu erhalten OUT. Nun, das ist nach mehreren Iterationen, wo ich das, was die Funktion einmal war, entkernt habe und es auf zwei Punkte herunterkippt: 1. Die OUT-Parameter funktionieren nicht, und 2. Obwohl Visual Studio IN-Parameter übergibt, lehnt SQL ab um sie zu erkennen.

protected void Login_Authenticate(object sender, AuthenticateEventArgs e) 
    { 
     using (MySqlConnection con = new MySqlConnection(strcon)) 
     { 
      con.Open(); 

      MySqlCommand com = new MySqlCommand("CALL login(@stuff, @pass, @param3);", con); 
      com.CommandType = CommandType.Text; 
      com.Parameters.Add("@stuff", MySqlDbType.VarChar); 
      com.Parameters["@stuff"].Value = Login.UserName; 
      com.Parameters.Add("@pass", MySqlDbType.VarChar); 
      com.Parameters["@pass"].Value = Login.Password; 

      try 
      { 
       obj = com.ExecuteScalar(); 
       objparam = com.Parameters["param3"].Value; 
       if (Convert.ToInt32(obj) != 0) 
       { 
        Response.Redirect("Welcome.aspx"); 
       } 
       else 
       { 
        Login.PasswordRequiredErrorMessage = "invalid user name and password"; 
       } 
      } 
      catch (Exception ex) 
      { 
       Console.WriteLine(ex.Message); 
      } 

      con.Close(); 
     } 
    } 
+1

Beginnen Sie mit einem [Bearbeiten], während Ihr Q im Begriff ist zu schließen. Zeige den * nächsten *, den du dir ausgedacht hast. – Drew

+1

Ich habe bearbeitet, um meine aktuelle Iteration von dem zu zeigen, was nicht funktioniert. Dies ist das nächste, das mir einfällt. –

+0

Danke, dass Sie gezeigt haben, was Sie versucht haben. Diese spezielle Frage ist schwierig als Lösung zusammenzustellen. Beachten Sie, dass der MySQL .NET Connector kürzlich die Funktionalität hinzugefügt hat, um 'OUT' Parameter zu handhaben. Wie lange her weiß ich es nicht. Also benutze ich zur Zeit den neuesten Connector 'Version 6.9.9.0'. – Drew

Antwort

1

Sie sollten einen Verweis auf den Parameter

var param3 = new MySqlParameter(); 
param3.Direction = ParameterDirection.Output; 
param3.DbType = // whatever the dbtype for int is or whatever you need. 
param3.ParameterName = "param3"; 

com.Parameters.Add(param3); 

im try-Block einrichten, legen

var result = com.ExecuteReader(); // or com.ExecuteScalar(); 

, nachdem Sie das ausführen, Ihre Parameter der Wert bevölkert haben sollte und Sie sollte in der Lage sein, auch die SP-Ergebnisse zu lesen (select).

Lesen der Ergebnisse des SP kann als Leser oder Skalar erfolgen.

// execute reader 
while (result.Read()) { 
    int value = result.GetInt32(0)); 
} /* read returned values in result */ 

// execute scalar 
int value; 
if (int.TryParse($"{result}", out value)) { 
    /* do something with value */ 
} 

/****************************************** ******/

Dieser Block sollte Sie, wo Sie

 const string strcon = "whatevs"; 

     using (MySqlConnection con = new MySqlConnection(strcon)) 
     { 
      const string sql = "login"; 

      MySqlCommand com = new MySqlCommand(sql, con); 
      com.CommandType = CommandType.StoredProcedure; 

      var stuffParam = new MySqlParameter("stuff", stuffValue); 
      var passParam = new MySqlParameter("pass", passValue); 
      var param3Param = new MySqlParameter(); 
      param3Param.ParameterName = "param3"; 
      param3Param.DbType = DbType.Int32; 
      param3Param.Direction = ParameterDirection.Output; 

      com.Parameters.Add(stuffParam); 
      com.Parameters.Add(passParam); 
      com.Parameters.Add(param3Param); 

      try 
      { 
       var scalarResult = com.ExecuteScalar(); 

       // because you used select @param3 in your sp. 
       int value; 
       if (int.TryParse($"{scalarResult}", out value)) 
       { 
        //do something with value 
       } 

       //// because you used select @param3 in your sp. 
       //var readerResult = com.ExecuteReader(); 

       //if (readerResult.Read()) 
       //{ 
       // // 
       // value = readerResult.GetInt32(0); 
       //} 

       int param3Returned; 
       if(int.TryParse($"{param3Param.Value}", out param3Returned)) 
       { 
        // do something with param3Returned 
       } 
      } 
      catch (Exception ex) 
      { 
       // do something with ex 
      } 
     } 
+0

Das sieht ziemlich ähnlich aus, was wahrscheinlich funktionieren würde. Ich hacke jetzt meinen Code. Vielen Dank! Was ist scalarResult eine Eigenschaft von? Intellisense sagt, dass es nicht existiert. –

+0

Oh, ignoriere die letzte Frage zum skalaren Ergebnis. –

+0

Ich denke, ich bin jetzt sehr nah an der Antwort. Ich habe deinen Code und alles verwendet, aber jetzt gibt es einen neuen Fehler. Es sagt, Ausnahme während der Ausführung von: 'Login' Parameter 'stuff' ist nicht definiert. Sobald ich Scalar oder executeReader ausführen. –

2

ich glaube, den Code und die Bilder sagen mehr, als ich jemals wird gehen müssen.

C# DB Layer (DB Schicht conn als Verbindungs ​​string):

// Note: this is an instance (myDB in terms of the GUI Object) 

using System.Data; 
using MySql.Data.MySqlClient; 
... 
... 
public long MultBySeven(long theNum) 
{ // Call a Mysql Stored Proc named "multBy7" 
    // which takes an IN parameter, Out parameter (the names are important. Match them) 
    // Multiply the IN by 7 and return the product thru the OUT parameter 

    long lParam = 0; 
    using (MySqlConnection lconn = new MySqlConnection(connString)) 
    { 
     lconn.Open(); 
     using (MySqlCommand cmd = new MySqlCommand()) 
     { 
      cmd.Connection = lconn; 
      cmd.CommandText = "multBy7"; // The name of the Stored Proc 
      cmd.CommandType = CommandType.StoredProcedure; // It is a Stored Proc 

      // Two parameters below. An IN and an OUT (myNum and theProduct, respectively) 
      cmd.Parameters.AddWithValue("@myNum", theNum); // lazy, not specifying ParameterDirection.Input; 
      cmd.Parameters.AddWithValue("@theProduct", MySqlDbType.Int32); 
      cmd.Parameters["@theProduct"].Direction = ParameterDirection.Output; // from System.Data 
      cmd.ExecuteNonQuery(); // let it rip 
      Object obj = cmd.Parameters["@theProduct"].Value; 
      lParam = (Int32)obj; // more useful datatype 
     } 
    } 
    return (lParam); 
} 

C# GUI Testschicht:

private void btnTestInOut_Click(object sender, EventArgs e) 
{ // This GUI Layer call thru the use of a business object or data layer object (`myDB`) 
    long localHere = myDB.MultBySeven(11); 
} 

Stored Procedure (eine Nummer, Multiplizieren von 7):

DROP PROCEDURE IF EXISTS multBy7; 
DELIMITER $ 
CREATE PROCEDURE multBy7 
( IN myNum INT, 
    OUT theProduct INT 
) 
BEGIN 
    SET theProduct=myNum*7; 
END$ 
DELIMITER ; 

Debug-Ansicht (sprich: es funktioniert 11x7 = 77.):

enter image description here

MySQL Connector 6.9.9.0/Visual Studio 2015: enter image description here

Siehe auch 5.10.1 Using Stored Routines from Connector/Net, Alter unbekannt.

+0

Dank dir wurde mir klar, dass ich nicht alle notwendigen Pakete installiert hatte. Neben der Korrektur des Codes musste ich auch mysql Web, Entity Framework und Connector bearbeiten. Ich dachte, ich hätte es vorher getan, aber anscheinend nicht. –