2016-01-26 2 views
2

Когда я запускаю программу, я получаю эту ошибку:Invalid Cast Исключение было необработанный MySQL

Invalid Cast Exception was unHandled

Это является часть формы для заполнения базы данных, и Visual Studio помечает Int бросания как ошибка

MySqlConnection conectar = new MySqlConnection("server=127.0.0.1; database=gymne; Uid=root; pwd=0000000000;"); 
using (MySqlCommand sqlCommand = new MySqlCommand("SELECT COUNT(*) from Socios where Nombre like @pNombre AND Apellido like @pApellido", conectar)) 
{ 
    conectar.Open(); 
    sqlCommand.Parameters.AddWithValue("@pNombre", txtNombre.Text); 
    sqlCommand.Parameters.AddWithValue("@pApellido", txtApellido.Text); 
    int UsuarioExiste = (int)sqlCommand.ExecuteScalar();//<----"error here" 
    if (UsuarioExiste > 0) 
    { 
     MessageBox.Show("El Socio ya existe!!", "No Guardado", MessageBoxButtons.OK, MessageBoxIcon.Information); 
    } 

ответ

2

I сильно подозреваете, что вы неправильно определили свою часть LIKE. Вам нужно использовать %..%, по крайней мере, чтобы выяснить, как вы пытаетесь получить значения, содержащие эту строку. Подобно;

sqlCommand.Parameters.AddWithValue("@pNombre", "%" + txtNombre.Text + "%"); 
sqlCommand.Parameters.AddWithValue("@pApellido", "%" + txtApellido.Text + "%"); 

Не используйте AddWithValue столько, сколько вы можете. It may generate unexpected and surprising results sometimes. Используйте метод Add, чтобы указать свой тип параметра и его размер.

Также используйте using statement для того, чтобы автоматически удалять ваше соединение и команду вместо вызова (где-то, возможно, в вашем коде) или Dispose методов вручную.

Кстати, знайте, COUNT(*) возвращает BIGINT в MySQL и этот тип сопоставлен с Int64 в .NET стороне. Как Steve mentioned, вы можете анализировать это значение вместо того, чтобы кастинг;

int UsuarioExiste = int.Parse(sqlCommand.ExecuteScalar()); 

или вы можете определить, как UsuarioExistelong, который кажется более последовательным (?) Я думаю.

long UsuarioExiste = (long)sqlCommand.ExecuteScalar(); 
+0

Так что мне не нужно использовать AddWithValue, просто добавить? – user2461687

+0

он по-прежнему не работает, он говорит, что это отличное – user2461687

+0

большое спасибо, я сделаю исправления – user2461687

3

Проблема заключается в ExecuteScalar, что в MySql возвращает Int64, а не Int32. Так инвалид бросок при использовании явного приведения

При преобразовании вашей ошибка должна уйти

int UsuarioExiste = Convert.ToInt32(sqlCommand.ExecuteScalar()); 

You are not alone попасть в этой проблеме

Конечно, все, что было сказано в ответе от Г-н Soner Gönül по-прежнему применим и должен быть выполнен как можно скорее.

+0

спасибо, я не знаю, как применить изменения – user2461687

+0

Я показал явное преобразование в Int32, и это должно быть достаточно, чтобы правильно обрабатывать количество строк, возвращаемых вашим запросом. Ссылка показывает другой подход с использованием длинной переменной и с использованием явного литья – Steve

+0

@Steve Yeah, явный разговор от 'long' до' int' существует, а явное литье - okey _unless_ 'ExecuteScalar' возвращает больше, чем' int.MaxValue', что кажется довольно трудно для большинства из нас :) –

Смежные вопросы