Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将错误获取为@Parameter1不是过程的参数_C#_Sql_Sql Server_Stored Procedures_Ado.net - Fatal编程技术网

C# 将错误获取为@Parameter1不是过程的参数

C# 将错误获取为@Parameter1不是过程的参数,c#,sql,sql-server,stored-procedures,ado.net,C#,Sql,Sql Server,Stored Procedures,Ado.net,我正在从视频中学习mvc,从表单中获取数据并将其保存到数据库中。当我第一次运行代码时,它给出了一个错误 过程或函数“spaddeemployee”需要参数“@Employee_Name”,但未提供该参数 我采用了一种解决方案,在该解决方案中,我将存储过程初始化为NULL,但现在我收到另一个错误,指出“@Parameter1不是过程的参数” 这是我的存储过程 ALTER PROCEDURE [dbo].[spAddEmployee] ( @Employee_Name varchar(max

我正在从视频中学习mvc,从表单中获取数据并将其保存到数据库中。当我第一次运行代码时,它给出了一个错误

过程或函数“spaddeemployee”需要参数“@Employee_Name”,但未提供该参数

我采用了一种解决方案,在该解决方案中,我将存储过程初始化为NULL,但现在我收到另一个错误,指出“@Parameter1不是过程的参数”

这是我的存储过程

ALTER PROCEDURE [dbo].[spAddEmployee]
(
    @Employee_Name varchar(max) = NULL,
    @Employee_Age int = NULL,
    @Employee_Salary int = NULL,
    @Employee_City varchar(50) = NULL
)
AS
BEGIN
    INSERT INTO tblEmployee (Employee_Name, Employee_Age, Employee_Salary,  Employee_City)
    VALUES (@Employee_Name, @Employee_Age, @Employee_Salary, @Employee_City)
END
这是我的ADO.NET代码:

public void AddEmployee(Employee employee)
{
    string connectionString = ConfigurationManager.ConnectionStrings["EmployeeContext"].ConnectionString;

    using (SqlConnection con = new SqlConnection(connectionString))
    {
        SqlCommand cmd = new SqlCommand("spAddEmployee", con)
        {
            CommandType = CommandType.StoredProcedure
        };

        SqlParameter paramName = new SqlParameter();
        paramName.ParameterName = "@Employee_Name";
        paramName.Value = employee.Employee_Name;
        cmd.Parameters.Add(paramName);

        SqlParameter paramAge = new SqlParameter();
        paramAge.ParameterName = "@Employee_Age";
        paramAge.Value = employee.Employee_Age;
        cmd.Parameters.Add(paramAge);

        SqlParameter paramSalary = new SqlParameter();
        paramSalary.ParameterName = "@Employee_Salary";
        paramSalary.Value = employee.Employee_Salary;
        cmd.Parameters.Add(paramSalary);

        SqlParameter paramCity = new SqlParameter();
        paramCity.ParameterName = "@Employee_City";
        paramCity.Value = employee.Employee_City;
        cmd.Parameters.Add(paramCity);

        con.Open();
        cmd.ExecuteNonQuery();
    }
}
这是我的控制器代码

[HttpPost]
[ActionName("Create")]
public ActionResult Create_Post(FormCollection formCollection)
{
    Employee employee = new Employee();
    employee.Employee_Name = formCollection["Employee_Name"];
    employee.Employee_Age = Convert.ToInt32(formCollection["Employee_Age"]);
    employee.Employee_Salary = Convert.ToInt32(formCollection["Employee_Salary"]);
    employee.Employee_City = formCollection["Employee_City"];
    
    EmployeeBuissnessLayer employeeBuissnessLayer = new EmployeeBuissnessLayer();
    employeeBuissnessLayer.AddEmployee(employee);
    return RedirectToAction("Index");
}
我在线路上出错了

employeeBuissnessLayer.AddEmployee(employee);
请帮助我,我尝试了很多解决方案,但没有一个有效。

    SqlParameter paramName = new SqlParameter();
    paramName.ParameterName = "@Employee_Name";
    paramName.Value = employee.Employee_Name;
    cmd.Parameters.Add(paramName);
应该是

    SqlParameter paramName = new SqlParameter();
    paramName.ParameterName = "@Employee_Name";
    // Always set the datatype
    paramName.SqlDbType = SqlDbType.NVarChar;
    // For strings, always set the length
    paramName.Size = 128; // Max string length
    // Ensure you pass DBNull not C# null
    paramName.Value = employee.Employee_Name ?? System.DBNull.Value;
    cmd.Parameters.Add(paramName);

注意:最好的做法是不使用
sp
前缀来命名存储过程。

@DaleK很抱歉,我没有完全理解它。您可以解释我应该在哪里设置System.DBNull.Value。您还需要在
cmd.ExecuteOnQuery()行停止调试器
并手动检查每个参数的值。@DaleK我过去不太活跃,我对平台也不熟悉,但从现在开始我会这样做。lol我不知道如何通过单击检查符号来接受答案,现在我做到了。谢谢