2013-08-17 192 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

没有与你的设计有问题。你如何使用NameId的相同字段? 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

我会建议,而不是此实现:

我在存储过程中尝试这个

  • 创建两个不同的存储过程 - 一个用于数字ID,另一个用于字母查询;
  • 在您的Winforms应用程序中检测用户输入的内容是否为数字 - 您可以检查TryParse以执行此操作;
  • 根据输入类型使用一种或另一种。

希望它适合你。

0

变化

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

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

.....同样的错误 –

相关问题