C#中的SQLCommand不提供参数

时间:2017-07-07 00:30:08

标签: c# json asp.net-web-api

我在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

1 个答案:

答案 0 :(得分:0)

这个可能是罪魁祸首,但至少这是一个消除整个等式的变量。这些界限非常可疑:

cmd.CommandType = CommandType.StoredProcedure;
cmd = new SqlCommand("spCreatePerson", con);

首先,第二行完全否定了第一行。它们应该互换:

cmd = new SqlCommand("spCreatePerson", con);
cmd.CommandType = CommandType.StoredProcedure;

但更重要的是,它们说明了一个更大的潜在问题。即...

  

cmdcon甚至在哪里声明和创建?

如果您正在使用存在于更大范围内的连接和命令对象,则可能会与其他操作共享它们。这是一件坏事,可能导致很难诊断错误。

作为一般经验法则,我们应该在尽可能小的范围内声明,创建,使用和处置命令和连接。

你没有通过保持它们获得任何东西,底层系统非常好优化。但是你正在做的是在代码中开辟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.