使用 C# 将数据添加到我的 Sql 数据时"Procedure expects parameter which was not supplied"错误



对于我的Uni项目,我们需要使用3层架构和存储过程。(即:数据访问层、业务层和表示层(

目标是在 C# 中将数据添加到数据库中,然后能够以所需的 Form 显示该数据。

我能够从数据库中加载硬编码数据并以数据网格的形式查看它,但添加似乎是问题所在。此外,存储过程说它的工作原理是 SSMS。

这是我得到的确切错误:

System.Data.SqlClient.SqlException:过程或函数"us_InsertSupervisors"需要参数"@SupervisorID",但未提供。

这是我用来插入数据的存储过程:

ALTER PROCEDURE  [dbo].[us_InsertSupervisors]
@SupervisorID varchar(10),
@SupervisorFirstName varchar(50),
@SupervisorSurname varchar(50),
@SupervisorCellNo varchar(50),
@SupervisorStatus varchar(10)
INSERT INTO SupervisorTable(SupervisorID, SupervisorFirstName, SupervisorSurname, SupervisorCellNo, SupervisorStatus) 
Values(@SupervisorID, @SupervisorFirstName, @SupervisorSurname, @SupervisorCellNo, @SupervisorStatus )

然后,我的数据访问层方法我们检索存储过程:

public int InsertSupervisor(string supervisorID, string supervisorFirstName, string supervisorSurname, string supervisorCellNo, string supervisorStatus)
{
if (dbConn.State == ConnectionState.Closed)
dbConn.Open();
string sqlinsert = "us_InsertSupervisors";
dbCmd.CommandType = CommandType.StoredProcedure;
dbCmd = new SqlCommand(sqlinsert, dbConn);
dbCmd.Parameters.AddWithValue("@SupervisorID", supervisorID);
dbCmd.Parameters.AddWithValue("@SupervisorFirstName", supervisorFirstName);
dbCmd.Parameters.AddWithValue("@SupervisorSurname", supervisorSurname);
dbCmd.Parameters.AddWithValue("@SupervisorCellNo", supervisorCellNo);
dbCmd.Parameters.AddWithValue("@SupervisorStatus", supervisorStatus);

int x = dbCmd.ExecuteNonQuery();
return x;
}

商务舱层:

class Supervisor
{
DataAccessLayer dl = new DataAccessLayer();
public string SupervisorID { get; set; }
public string SupervisorFirstName { get; set; }
public string SupervisorSurname { get; set; }
public string SupervisorCellNo { get; set; }
public string SupervisorStatus { get; set; }
public DataTable GetAllSupervisorNames()
{
return dl.GetAllSupervisorNames();
}
public DataTable GetAllSupervisors()
{
return dl.GetAllSupervisors();
}
public int InsertSupervisor(string SupervisorID, string SupervisorFirstName, string SupervisorSurname, string SupervisorCellNo, string SupervisorStatus)
{
return dl.InsertSupervisor(SupervisorID, SupervisorFirstName, SupervisorSurname, SupervisorCellNo, SupervisorStatus);
}
}

和表示层:

public partial class frmSupervisor : Form
{
Supervisor su = new Supervisor();
public frmSupervisor()
{
InitializeComponent();
}
private void frmSupervisor_Load(object sender, EventArgs e)
{
dgvSupervisors.DataSource = su.GetAllSupervisors();
}
private void btnAdd_Click(object sender, EventArgs e)
{
su.InsertSupervisor(txtSupervisorID.Text, txtSupervisorFirstName.Text, txtSupervisorSurname.Text, txtSupervisorCellNumber.Text, txtSupervisorStatus.Text);
}

C# 将我定向到数据访问层 (InsertSupervisor( 方法中的以下行:

int x = dbCmd.ExecuteNonQuery();

您的帮助将不胜感激。

好的,所以在评论中的对话之后,我再次查看了您的代码,看看我们错过了什么,突然弹出了:

dbCmd.CommandType = CommandType.StoredProcedure;
dbCmd = new SqlCommand(sqlinsert, dbConn);

您的dbCmd命令类型现在为CommandType.Text,因为它是默认值。 更改这两行的顺序,您应该没问题。

但是,当我编写答案时,最好在代码中再做一些更改的事情:

  1. 您正在使用SqlConnectionSqlCommand字段。这是不好的做法。
    最佳做法是在 using 语句中对两者使用局部变量 - 不仅因为它们都实现了IDisposable接口,还因为 ADO.Net 实现了连接池,并且通过释放SqlConnection的实例,您将连接返回到池。

  2. 使用AddWithValue.我知道我们已经在评论中涵盖了它,但如果不处理这个问题,任何答案都是不完整的。

所以更好的代码应该是这样的:

public int InsertSupervisor(string supervisorID, string supervisorFirstName, string supervisorSurname, string supervisorCellNo, string supervisorStatus)
{
string sqlinsert = "us_InsertSupervisors";
using(var con = new SqlConnection(connectionString))
{
using(var cmd = new SqlCommand(sqlinsert, con))
{
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("@SupervisorID", SqlDbType.NVarChar, 10).Value = supervisorID;
cmd.Parameters.Add("@SupervisorFirstName", SqlDbType.NVarChar, 50).Value = supervisorFirstName;
cmd.Parameters.Add("@SupervisorSurname", SqlDbType.NVarChar, 50).Value = supervisorSurname;
cmd.Parameters.Add("@SupervisorCellNo", SqlDbType.NVarChar, 50).Value = supervisorCellNo;
cmd.Parameters.Add("@SupervisorStatus", SqlDbType.NVarChar, 10).Value = supervisorStatus;        
con.Open();
return cmd.ExecuteNonQuery();
}
}
}

相关内容

最新更新