对于我的 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
,因为它是默认值。
更改这两行的顺序,您应该没问题。
但是,在我写答案的同时,最好再检查一些内容以更改您的代码:
您正在为
SqlConnection
和SqlCommand
使用字段。这是不好的做法。
最佳做法是在 using 语句中为两者使用局部变量——不仅因为它们都实现了IDisposable
接口(interface),而且因为 ADO.Net 实现了一个连接池,并通过释放的实例>SqlConnection
您正在将连接返回到池中。使用
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/