3

我有这个存储过程:

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))
4

3 回答 3

1

你的设计有问题。如何使用Name和中的相同字段IdName可以包含任何不能包含的字符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);

这应该可以解决您的问题

于 2013-08-17T17:55:06.253 回答
0

我会建议这个实现:

  • 创建两个不同的存储过程 - 一个用于数字 ID,另一个用于字母数字查询;
  • 在您的 Winforms 应用程序上检测用户输入的内容是否为数字 - 您可以检查TryParse来实现这一点;
  • 根据输入类型使用其中一种。

希望对你有效。

于 2013-08-17T16:37:22.787 回答
0

改变

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

mySqlCommand1.Parameters.AddWithValue("@EmployeeID",Convert.ToInt32( textBox1.Text));
于 2013-08-17T17:18:08.150 回答