2013-04-19 2 views
1

У меня проблема, у меня есть хранимая процедура в моей базе данных MySQL: sp_insertSupplier. Этот метод работает, когда выполняется в базе данных mysql.Ошибка C#, Выполнение хранимой процедуры, Хранимая процедура недоступна

Я делаю этот синтаксис в кнопке Сохранить

private void btn_supplier_save_Click(object sender, EventArgs e) 
{ 
    string connections = Connection.mysqlconnectionbuilder(); 
    using (MySqlConnection conn = new MySqlConnection(connections)) 
    { 
     using (MySqlCommand cmd = new MySqlCommand()) 
     { 
      //make connection 
      cmd.Connection = conn; 
      cmd.CommandType = CommandType.StoredProcedure; 
      cmd.CommandText = "call sp_insertSupplier(@KD,@NM,@AL,@EM,@TLP);"; 
      cmd.Parameters.AddWithValue("@KD", createCode()); 
      cmd.Parameters.AddWithValue("@NM", txtsuppliernama.Text); 
      cmd.Parameters.AddWithValue("@AL", txtsupplieralamat.Text); 
      cmd.Parameters.AddWithValue("@EM", txtsupplieremail.Text); 
      cmd.Parameters.AddWithValue("@TLP",txtsuppliernotelp.Text); 
      try 
      { 
       conn.Open(); 
       int result = cmd.ExecuteNonQuery(); 
       //check the result status 
       if (result.Equals(1)) 
       { 
        DialogResult results = MessageBox.Show("Data berhasil ditambahkan! \n Apakah anda ingin input data lainnya? ", "Sukses!", MessageBoxButtons.OKCancel); 
        //cek apabila ingin menambahkan data lagi. 
        if (results.Equals(DialogResult.OK)) 
        { 
         reset(); 
        } 
        else if (results.Equals(DialogResult.Cancel)) 
        { 
         this.Close(); 
        } 
       } 
      } //end TRY 
      catch (Exception exe) 
       { 
        MessageBox.Show("Terjadi Kesalahan", "Perhatian!", MessageBoxButtons.OK, MessageBoxIcon.Error); 
        StreamWriter _writer = new StreamWriter("E899911823.log"); 
        _writer.WriteLine(exe.ToString()); 
        Console.WriteLine(exe.ToString()); 
       } //END CATCH 
      finally 
       { 
        conn.Clone(); 
       } //END FINALLY 
     } 
    } 
} 

, но, когда я выполняю синтаксис, он показывает ошибку:

MySql.Data.MySqlClient.MySqlException (0x80004005): Procedure or function '`call sp_insertSupplier(@KD,@NM,@AL,@EM,@TLP)`' cannot be found in database XXXXX 

Я не думаю, что никаких проблем с менеджером связи или случайный метод для создания @KD.

У меня есть еще такие же проблемы, консоль показывает:

MySql.Data.MySqlClient.MySqlException (0x80004005): Procedure or function '`call sp_insertSupplier`' cannot be found in database '`XXXXX`'. 
at MySql.Data.MySqlClient.ProcedureCache.GetProcData(MySqlConnection connection, String spName) 
at MySql.Data.MySqlClient.ProcedureCache.AddNew(MySqlConnection connection, String spName) 
at MySql.Data.MySqlClient.ProcedureCache.GetProcedure(MySqlConnection conn, String spName, String cacheKey) 
at MySql.Data.MySqlClient.StoredProcedure.GetParameters(String procName, DataTable& proceduresTable, DataTable& parametersTable) 
at MySql.Data.MySqlClient.StoredProcedure.CheckParameters(String spName) 
at MySql.Data.MySqlClient.StoredProcedure.Resolve(Boolean preparing) 
at MySql.Data.MySqlClient.MySqlCommand.ExecuteReader(CommandBehavior behavior) 
at MySql.Data.MySqlClient.MySqlCommand.ExecuteNonQuery() 
at SerbaManisInventory.SupplierAdd.btn_supplier_save_Click(Object sender, EventArgs e) 

Я просто переписать код так, что такой код:

using (MySqlCommand cmd = new MySqlCommand()) 
{ 
    cmd.Connection = conn; 
    cmd.CommandType = CommandType.StoredProcedure; 
    cmd.CommandText = "call sp_insertSupplier"; 
    cmd.Parameters.AddWithValue("@KD", createCode()); 
    cmd.Parameters.AddWithValue("@NM", txtsuppliernama.Text); 
    cmd.Parameters.AddWithValue("@AL", txtsupplieralamat.Text); 
    cmd.Parameters.AddWithValue("@EM", txtsupplieremail.Text); 
    cmd.Parameters.AddWithValue("@TLP",txtsuppliernotelp.Text); 
    try 
     { 
      ... 

ответ

2
cmd.CommandType = CommandType.StoredProcedure; 
cmd.CommandText = "call sp_insertSupplier(@KD,@NM,@AL,@EM,@TLP);"; 

Если CommandType является StoredProcedure, вам не нужно писать все это. Просто напишите:

cmd.CommandText = "sp_insertSupplier"; 

И поставьте параметры так же, как и вы.

Там действительно нет процедуры/функции с именем call sp_insertSupplier(@KD,@NM,@AL,@EM,@TLP);

+0

спасибо за ответ, я просто попробую, но он по-прежнему показывает ошибку: – randytan

+0

удалите этот 'call'. Просто напишите 'sp_insertSupplier' –

+0

oops, я забыл, что« звонок »: D спасибо за помощь приятель! отлично провести время! работаю сейчас. – randytan

2

Просто напишите имя хранимой процедуры в CommandText

cmd.CommandText = "sp_insertSupplier"; 

В пути вы пишете CommandText вы вынуждаете поставщик для поиска хранимой процедуры с именем, состоящим из «вызова sp_insertSupplier ......» и, очевидно, нет процедуры с этим именем.

+0

проблема по-прежнему сохраняется. Какие возможности делают эту ошибку? – randytan

+0

С трассировки стека у вас все еще есть слово «звонок» перед реальным именем хранимой процедуры. Не ставьте ничего до и после названия sp – Steve

0

просто напишите имя хранимой процедуры в commandText cmd.CommandText = "sp _insertSupplier "; вам не нужна часть «звонок»

7

Убедитесь, что имя вашей базы данных написано строчными буквами в строке подключения! Я тоже получил эту ошибку и решил ее с помощью this bug report, изменив имя моей базы данных на все строчные буквы. Кажется, что это поведение не зависит от типа целевой системы.

+0

имеет ту же проблему, это решило это - спасибо. – Zbynek