Logo Hardware.com.br
gelinski
gelinski Super Participante Registrado
682 Mensagens 27 Curtidas

Stored Procedures em MySql não executam em C#

#1 Por gelinski 17/09/2013 - 20:16
Estou trabalhando com o desenvolvimento de uma aplicação em C#, mas nunca trabalhei com ele conectando com o MySql. A princípio, consegui alguns progressos, como disparar comandos insert dento do banco, mas não estou conseguindo executar Stored Procedures (SP's). Eu tenho várias SP's escritas no banco (mais especificamente, 72 SP's) e não posso simplesmente reescrevê-las para o SQL Server (tanto que levei três semanas inteiras para desenvolver a lógica delas).

Tenho o código abaixo para a DAL:


private int _InsertCountry(Country country)
{
int ret = 0;
MySqlConnection con = new MySqlConnection(ConfigurationManager.ConnectionStrings["PlatformWriter"].ConnectionString);
MySqlCommand cmd = new MySqlCommand("sp_CountryCreate", con);
cmd.CommandType = CommandType.StoredProcedure;
try
{
cmd.Parameters.Add(new MySqlParameter("@inCountry", country.country));
cmd.Parameters.Add(new MySqlParameter("@inCountryCode", country.countryCode));
con.Open();
// Está apontando que a SP não existe, mesmo estando corretas
// int retorno = cmd.ExecuteNonQuery();
MySqlDataReader dr = cmd.ExecuteReader();
if (dr != null)
{
ret = Convert.ToInt32(dr[0].ToString());
}
}
catch (MySqlException ex) { throw ex; }
finally { if (con != null) { con.Close(); } }
return ret;
}
O código, da forma acima, está caindo em Catch, com o erro:
Procedure or function '`sp_CountryCreate`' cannot be found in database '`DefaultPlatform`'.
Onde DefaultPlatform é o nome da base. O C# consegue abrir a conexão, tanto que cai em Catch depois de executar o cmd.ExecuteReader(). Estou usando ExecuteReader para pegar o retorno do Country ID cadastrado.

Adiantando: a Connection String está certa, testei com o código abaixo e executou sem problemas:

using (MySqlConnection conn = new MySqlConnection(ConfigurationManager.ConnectionStrings["PlatformWriter"].ConnectionString))
{
MySqlCommand comm = new MySqlCommand("insert into Country (country, countryCode) values (@inCountry, @inCountryCode)", conn);
//comm.CommandType = CommandType.StoredProcedure;
comm.Parameters.Add(new MySqlParameter("@inCountry", country.country));
comm.Parameters.Add(new MySqlParameter("@inCountryCode", country.countryCode));
conn.Open();
comm.ExecuteNonQuery();
}
A SP em questão foi testada anteriormente e está funcionando adequadamente, o código está abaixo:

drop procedure if exists sp_CountryCreate//
create procedure sp_CountryCreate(
inCountry varchar(72),
inCountryCode integer)
begin
insert into Country (country, countryCode) values (inCountry, inCountryCode);
select last_insert_id();
end//
E não quero ouvir um "use SQL Server para C#"... Quem disser isso, vai reescrever TODAS as SP's desse banco de dados!

Brincadeiras à parte, não tem como migrar, a lógica das SP's é bastante trabalhosa e não posso me dar ao luxo de fazer isso, estou sozinho na equipe oooo.png
"Para que um soldado ame a sua arma, ele deve compreendê-la e saber que ela não o trairá." - Mikhail Kalashnikov

"Ex-namorada é como comprar um carro que já foi seu: vem com o mesmo defeito, só que mais rodado." - Eu mesmo rindo_ate_agora.png
gelinski
gelinski Super Participante Registrado
682 Mensagens 27 Curtidas
#3 Por gelinski
17/09/2013 - 20:58
sephiroth0 disse:

Modo de dizer, meus colegas ficam falando tanto que acabo acostumando, hehehe...

Então cara, essas SP's estão Ok, após a criação, elas são rigorosamente testadas. Para desencargo de consciência, testei novamente e até escrevi novamente para tentar executar outra SP, independente desta, que também deu na mesma... xingamentos.gif

E a base é a mesma da SP. A connectionstring que está sendo passada é a que está no web.config da aplicação:
[code=rich][/code]O print do teste:

Imagem



Update:
Li agora neste blog:
http://corengen.wordpress.com/2010/10/14/mysql-stored-procedure-not-found/

Cara, não acredito que isso tenha acontecido! Por que é que só funcionou colocando o nome da database em lowercase??? Vi nesse trecho:
"I checked the database name usingMySQLAdministrator andnoted that it was all lowercase, i.e. ‘vitality’ rather than ‘Vitality’. So, I changed the ConnectionString to: Database=vitality;Data Source=server350;User Id=vuser;Password=vuser"

É como digo lá na empresa para meus colegas: informática não é ciência exata, é exotérica!
"Para que um soldado ame a sua arma, ele deve compreendê-la e saber que ela não o trairá." - Mikhail Kalashnikov

"Ex-namorada é como comprar um carro que já foi seu: vem com o mesmo defeito, só que mais rodado." - Eu mesmo rindo_ate_agora.png
gelinski
gelinski Super Participante Registrado
682 Mensagens 27 Curtidas
#5 Por gelinski
17/09/2013 - 22:24
sephiroth0 disse:

Ainda não vi sentido nisso, mas, como disse antes, é exoterismo: na base da reza! rindo_ate_agora.png
Não vi sentido por que chegou a executar insert com o tipo de comando = text...
"Para que um soldado ame a sua arma, ele deve compreendê-la e saber que ela não o trairá." - Mikhail Kalashnikov

"Ex-namorada é como comprar um carro que já foi seu: vem com o mesmo defeito, só que mais rodado." - Eu mesmo rindo_ate_agora.png
© 1999-2025 Hardware.com.br. Todos os direitos reservados.
Imagem do Modal