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

标签 c# sql

对于我的 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/

相关文章:

mysql - 将左连接限制为 1

c# - C#中的多线程

c# - “Payment.GenLedDet”因其保护级别而无法访问

c# - 读取单元格的文本而不是值

sql - 为什么 postgres 在更新行后在选择查询中返回无序数据?

sql - 不带引号的 Sqoop 语句

mysql - 如何获取最近 7 天的选择数据?

c# - 使用 WPF 将应用程序最小化到系统托盘(不使用 NotifyIcon)

C# Jupyter 笔记本

mysql - 如何获取姓名和经理姓名