我在c#中有一个插入数据的函数。应该做的只是调用我通过Fiddler提供的Request Body提供的存储过程。现在我正在尝试测试它,但我一直收到这个错误。
“过程或函数”spCreatePerson'需要参数'@first',这是未提供的。“
这是对象 -
public class Person
{
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string Phone { get; set; }
public string Email { get; set; }
public int PersonTypeId { get; set; }
}
这是请求正文 -
{"FirstName":"Test","LastName":"MuhFuh","Phone":"5555555555","Email":"test@gmail.com","PersonTypeId":1}
这是调用proc -
的函数public static int InsertData(string procName, Person p)
{
int rowsAffected = 0;
con = CreateConnection();
using (con)
{
cmd.CommandType = CommandType.StoredProcedure;
cmd = new SqlCommand("spCreatePerson", con);
cmd.Parameters.AddWithValue("@first", p.FirstName);
cmd.Parameters.AddWithValue("@last", p.LastName);
cmd.Parameters.AddWithValue("@email", p.Email);
cmd.Parameters.AddWithValue("@phone", p.Phone);
cmd.Parameters.AddWithValue("@pTypeID", p.PersonTypeId);
rowsAffected = cmd.ExecuteNonQuery();
}
return rowsAffected;
}
正如您所看到的,我传入了参数,但是我收到了这个错误。我在代码中遗漏了什么吗?我介入了它,数据似乎传递得很好。
修改
这是存储过程 -
CREATE PROC [dbo].[spCreatePerson] @first nvarchar(100), @last
nvarchar(100), @email nvarchar(50), @phone nvarchar(100), @pTypeID int
AS
INSERT INTO Person(FirstName, LastName, Email, Phone, PersonTypeID)
VALUES(@first, @last, @email, @phone, @pTypeID)
GO
答案 0 :(得分:0)
这个可能是罪魁祸首,但至少这是一个消除整个等式的变量。这些界限非常可疑:
cmd.CommandType = CommandType.StoredProcedure;
cmd = new SqlCommand("spCreatePerson", con);
首先,第二行完全否定了第一行。它们应该互换:
cmd = new SqlCommand("spCreatePerson", con);
cmd.CommandType = CommandType.StoredProcedure;
但更重要的是,它们说明了一个更大的潜在问题。即...
cmd
和con
甚至在哪里声明和创建?
如果您正在使用存在于更大范围内的连接和命令对象,则可能会与其他操作共享它们。这是一件坏事,可能导致很难诊断错误。
作为一般经验法则,我们应该在尽可能小的范围内声明,创建,使用和处置命令和连接。
你没有通过保持它们获得任何东西,底层系统非常好优化。但是你正在做的是在代码中开辟bug和奇怪行为的可能性。
结构基本上应该是(有些伪代码):
using (var con = new Connection())
using (var cmd = new Command(con))
// set parameters, command type, etc.
// execute the command, get any results you might need
}
// any follow-up logic, etc.