2012-02-08 14 views
3

私はC#2010で単純なストアドプロシージャを呼び出そうとしています。 IN引数のみでOKですが、OUT引数を使用すると機能しません。 phpmyadminのでC#のMysqlコネクタを使用したスト​​アドプロシージャ

:次に

drop procedure if exists insert_artist; 
delimiter $$ 
create procedure insert_student(IN name VARCHAR(100), OUT id INT) 
begin 
insert into student(name) values(name); 
set id = last_insert_id(); 
end$$ 
delimiter ; 

それが正常に動作しています

call insert_student("toto",@id); 
select @id; 

を使用。 C#で今すぐ

、:は、ExecuteNonQueryを実行するときに

 using (MySqlConnection connection = new MySqlConnection(connectionString)) 
     { 
      connection.Open(); 
      using (MySqlCommand command = connection.CreateCommand()) 
      { 
       command.CommandText = "insert_student"; 
       command.CommandType = System.Data.CommandType.StoredProcedure; 
       command.Parameters.AddWithValue("@name", "xxxx"); 
       command.Parameters.AddWithValue("@id",MySqlDbType.Int32); 
       command.ExecuteNonQuery(); 
       Console.WriteLine("**** " + command.Parameters["@id"].Value); 
      } 
     } 

)(私に例外を与える:

OUT or INOUT argument 2 for routine insert_student is not a variable or NEW pseudo-variable in BEFORE trigger 

ストアドプロシージャ内のアウトargmentない同じ事は正常に動作しています。

だから?どうしましたか ?

ありがとうございました。

+2

私は覚えていませんが、2番目のパラメータで 'Direction'または' ParameterDirection'プロパティ*(またはそのようなもの)*を 'Out'に設定する必要があります。 –

+0

[OK]を追加しています:command.Parameters ["@ id"]。Direction = System.Data.ParameterDirection.Output;ありがとうatornblad。 – tweetysat

+0

興味のある方には、MySQL/c#Visual Studio 2015の動作例を示しました[こちら](http://stackoverflow.com/a/38706288)。その状況はINとOUTのパラメータの1つでした。当然焦点は「OUT」にあった。 – Drew

答えて

3

充実した例:

if (this.OpenConnection() == true) 
{ 
    MySqlCommand cmd = new MySqlCommand(nameOfStoredRoutine, connection);  
    cmd.CommandType = CommandType.StoredProcedure;  
    //input parameters 
    for (int i = 0; i < (parameterValue.Length/2); i++) 
    { 
     cmd.Parameters.AddWithValue(parameterValue[i, 0], parameterValue[i, 1]); 
     cmd.Parameters[parameterValue[i, 0]].Direction = ParameterDirection.Input; 
     parameterList = parameterList + parameterValue[i,0] + " " + parameterValue[i,1] + " "; 
     } 

     //single output parameter 
     cmd.Parameters.AddWithValue("@output", MySqlDbType.Int32); 
     cmd.Parameters["@output"].Direction = ParameterDirection.Output; 

     cmd.ExecuteNonQuery(); //Execute command 
     this.CloseConnection(); //close connection 

     return Convert.ToInt32(cmd.Parameters["@output"].Value.ToString()); 
0

私の次のコードは、

のplsはそれがあなたのために大丈夫かどうかをチェック動作します。

InsertQuery = New MySqlCommand("xxxxxx") 
InsertQuery.Connection = Connection 
InsertQuery.CommandType = Data.CommandType.StoredProcedure 

InsertQuery.Parameters.AddWithValue("IN_xxx", str_xxxx) 

InsertQuery.Parameters.Add("OUT_LastID", MySqlDbType.Int32).Direction = ParameterDirection.Output 
IQ = InsertQuery.ExecuteReader() 
IQ.Read() 
LASTID = InsertQuery.Parameters("OUT_LastID").Value 
関連する問題