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
vsDBNull.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();
}
}
}