Stored procedures ASP.NET MVC中带有存储过程的ExecuteOnQuery处缺少参数

Stored procedures ASP.NET MVC中带有存储过程的ExecuteOnQuery处缺少参数,stored-procedures,ado.net,Stored Procedures,Ado.net,下面是我的代码,我在ExecuteNonQuery上得到一个错误: @缺少名称参数 我已经尝试了很多次,甚至在建立程序的过程中没有错误。存储过程包含一个带有4个参数的insert语句,其中3个为varchar类型,一个为integer类型,作为主键 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Configuration; using Syste

下面是我的代码,我在
ExecuteNonQuery
上得到一个错误:

@缺少名称参数

我已经尝试了很多次,甚至在建立程序的过程中没有错误。存储过程包含一个带有4个参数的insert语句,其中3个为
varchar
类型,一个为
integer
类型,作为主键

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;

namespace CompanyMaster
{
    public class Master
    {
         public IEnumerable<Company> Companies
         {
            get
            {
                string connectionString = ConfigurationManager.ConnectionStrings["DBCS"].ConnectionString;

                List<Company> companies = new List<Company>();

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

                    SqlDataReader rdr = cmd.ExecuteReader();

                    while (rdr.Read())
                    {
                        Company company = new Company();
                        company.CompanyCode = Convert.ToInt32(rdr["CompanyCode"]);
                        company.CompanyName = rdr["CompanyName"].ToString();
                        company.CompanyAddress = rdr["CompanyAddress"].ToString();
                        company.CompanyMail = rdr["CompanyMail"].ToString();

                        companies.Add(company);
                    }
                }
                return companies;
            }
       }

       public void Addcompany(Company company)
       {    
           string connectionString = ConfigurationManager.ConnectionStrings["DBCS"].ConnectionString;

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

               cmd.Parameters.Clear();

               SqlParameter paramCode = new SqlParameter();
               paramCode.ParameterName = "@Code";
               paramCode.Value = company.CompanyCode;
               cmd.Parameters.Add(paramCode);

               SqlParameter PName = new SqlParameter("@Name", SqlDbType.VarChar, 50);
               //PName.ParameterName = "@Name";
               PName.Value = company.CompanyName;
               cmd.Parameters.Add(PName);

               SqlParameter paramAddress = new SqlParameter();
               paramAddress.ParameterName = "@Address";
               paramAddress.Value = company.CompanyAddress;
               cmd.Parameters.Add(paramAddress);

               SqlParameter paramMail = new SqlParameter();
               paramMail.ParameterName = "@Mail";
               paramMail.Value = company.CompanyMail;
               cmd.Parameters.Add(paramMail);

               con.Open();
               cmd.ExecuteNonQuery();-- error is occurring here
           }
       }
    }
}

@Name
参数在代码到达
ExecuteNonQuery

时丢失,我认为您的问题与
null
vs
DBNull.Value

检查
company.CompanyName
是否为空(在c#中)。如果是,则应改为传递
DBNull.Value

有关两者区别的更多信息,请阅读

发件人:

注意

向服务器发送空参数值时,必须指定,而不是
null
Nothing
,在Visual Basic中)。系统中的
null
值是没有值的空对象。用于表示空值。有关数据库空值的详细信息,请参见

此外,还可以向命令中添加参数,并在一行代码中设置其值,如下所示:

cmd.Parameters.Add("@Name", SqlDbType.NVarChar, 50).Value = company.CompanyName;
这将使您的代码更短,可读性更强

以下是我对您的代码所做的更改,我认为这些更改可以解决您的问题:

public void Addcompany(Company company)
{    
    string connectionString = ConfigurationManager.ConnectionStrings["DBCS"].ConnectionString;

    using (var con = new SqlConnection(connectionString))
    {
        // SqlCommand also implements the IDisposable interface
        using(var cmd = new SqlCommand("spAddCompany", con))
        {
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.Add("@Code",  SqlDbType.Int).Value = company.CompanyCode;
            cmd.Parameters.Add("@Name", SqlDbType.VarChar, 50).Value = company.CompanyName as object ?? (object)DBNull.Value;
            cmd.Parameters.Add("@Address", SqlDbType.VarChar, 50).Value = company.CompanyAddress as object ?? (object)DBNull.Value;
            cmd.Parameters.Add("@Mail", SqlDbType.VarChar, 50).Value = company.CompanyMail as object ?? (object)DBNull.Value;
            con.Open();
            cmd.ExecuteNonQuery();
        }
    }
}

注意空合并操作符(
??
)的使用和对
对象的转换

侧注:存储过程中
@Name
参数的类型是
NVARCHAR
,但在C代码中是
SqlDbType.VarChar
。您应该将其更改为
SqlDbType.NVarChar
。所有其他参数也应该使用相同的样式。不起作用..谢谢这只是旁注,不是解决方案。@RacilHilan ok。。
public void Addcompany(Company company)
{    
    string connectionString = ConfigurationManager.ConnectionStrings["DBCS"].ConnectionString;

    using (var con = new SqlConnection(connectionString))
    {
        // SqlCommand also implements the IDisposable interface
        using(var cmd = new SqlCommand("spAddCompany", con))
        {
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.Add("@Code",  SqlDbType.Int).Value = company.CompanyCode;
            cmd.Parameters.Add("@Name", SqlDbType.VarChar, 50).Value = company.CompanyName as object ?? (object)DBNull.Value;
            cmd.Parameters.Add("@Address", SqlDbType.VarChar, 50).Value = company.CompanyAddress as object ?? (object)DBNull.Value;
            cmd.Parameters.Add("@Mail", SqlDbType.VarChar, 50).Value = company.CompanyMail as object ?? (object)DBNull.Value;
            con.Open();
            cmd.ExecuteNonQuery();
        }
    }
}