2013-08-17 7 views
3

Я эту хранимую процедуру:Преобразование типа данных NVARCHAR к Int

CREATE PROCEDURE SearchEmployee 
     @EmployeeID int, 
     @EmployeeName nvarchar(256), 
     @Address nvarchar(256), 
AS 
    Select 
     EmployeeId, EmployeeName, Address 
    From 
     Employee 
    Where 
     EmployeeID = @EmployeeID OR 
     EmployeeName LIKE '%' + @EmployeeName+ '%' OR 
     Address LIKE '%' + @Address+ '%' 

Тогда в моих Winforms я называю это так:

using (SqlCommand mySqlCommand1 = new SqlCommand("dbo.SearchEmployee", myDatabaseConnection)) 
{ 
      mySqlCommand1.CommandType = CommandType.StoredProcedure; 
      { 
       mySqlCommand1.Parameters.AddWithValue("@EmployeeID", textBox1.Text); 
       mySqlCommand1.Parameters.AddWithValue("@EmployeeName", textBox1.Text); 
       mySqlCommand1.Parameters.AddWithValue("@Address", textBox1.Text); 
      } 
     } 

Как я избежать ошибки

Ошибка преобразования типа данных nvarchar в int.

Когда пользователь вводит имя сотрудника вместо EmployeeID?

Я попробовал это в моей хранимой процедуре:

EmployeeID = cast(@EmployeeID as varchar(10)) 

ответ

1

Существует проблема с вашим дизайном. Как вы можете использовать одно и то же поле от Name и Id? Name может содержать любой символ, где Id не может !. Самое быстрое обходное решение - это недопустимое значение для Id, если пользовательский тип не является числовым.

int empId = 0; 
if(!int.TryParse(textbox1.Text, out empId)) 
{ 
    empId = -1;// or some invalid Id which won't appear in DB 
} 
mySqlCommand1.Parameters.AddWithValue("@EmployeeID", empId); 

это должно решить вашу проблему

+0

Потому что я буду только с помощью одного searchTextBox, который будет найти на каждом поле. Огромное спасибо :) –

0

Я хотел бы предложить эту реализацию вместо:

  • Создание двух различных хранимых процедур - один для цифровых идентификаторов, другой для буквенно-цифровых запросов;
  • Определите в приложении Winforms, если содержимое, набранное пользователем, является числовым или нет - вы можете проверить TryParse для его реализации;
  • Используйте тот или иной, в зависимости от типа ввода.

Надеюсь, что это сработает для вас.

0

изменение

mySqlCommand1.Parameters.AddWithValue("@EmployeeID", textBox1.Text); 

в

mySqlCommand1.Parameters.AddWithValue("@EmployeeID",Convert.ToInt32(textBox1.Text)); 
+0

..... Та же ошибка –

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