gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 14:48:56 26 4
gpt4 key购买 nike

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

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

我能够从数据库加载硬编码数据并以数据网格的形式查看它非常好,但添加似乎是问题所在。存储过程也说它是 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 接口(interface),而且因为 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();
}
}
}

关于c# - 使用 C# 将数据添加到我的 Sql 数据时出现 "Procedure expects parameter which was not supplied"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52718208/

26 4 0