簡體   English   中英

存儲過程或函數需要未提供的參數

[英]Stored procedure or function expects parameter which was not supplied

我正在嘗試通過調用存儲過程將數據插入 SQL Server 數據庫,但出現錯誤

*過程或函數“插入”需要未提供的參數“@Emp_no”*

我的存儲過程稱為Insertion 我已經徹底檢查過了,沒有丟失任何參數,我也使用標簽進行了檢查。 標簽顯示了該值,但我不知道為什么會收到錯誤消息。

我的代碼是

    try
    {
        SqlCommand cmd = new SqlCommand();
        cmd.Parameters.Clear();
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.CommandText = "Insertion";
        cmd.Connection = con;

        if (rdb_Male.Checked)
        {
            int @Emp_no = Convert.ToInt32(txtbx_Empno.Text);
            string @Emp_name = txtbx_Emp_Name.Text;
            double @phone = Convert.ToDouble(txtbx_Phone.Text);
            string @Email = txtbx_Email.Text;
            string @Password = txtbx_Pwd.Text;
            string @Gender = rdb_Male.Text;
            DateTime @Dob = Convert.ToDateTime(dob);
            string @Address = txtbx_Address.Text;
            string @Designation = txtbx_Designation.Text;
            string @Qualification = txtbx_Qual.Text;
            double @Experience = Convert.ToDouble(txtbx_Exp.Text);
            double @Salary = Convert.ToDouble(txtbx_Sal.Text);
            DateTime @Doj = Convert.ToDateTime(doj);
        }
        else if (rdb_Female.Checked)
        {
            int @Emp_no = Convert.ToInt32(txtbx_Empno.Text);
            string @Emp_name = txtbx_Emp_Name.Text;
            double @phone = Convert.ToDouble(txtbx_Phone.Text);
            string @Email = txtbx_Email.Text;
            string @Password = txtbx_Pwd.Text;
            string @Gender = rdb_Female.Text;
            DateTime @Dob = Convert.ToDateTime(dob);
            string @Address = txtbx_Address.Text;
            string @Designation = txtbx_Designation.Text;
            string @Qualification = txtbx_Qual.Text;
            double @Experience = Convert.ToDouble(txtbx_Exp.Text);
            double @Salary = Convert.ToDouble(txtbx_Sal.Text);
            DateTime @Doj = Convert.ToDateTime(doj);
        }

        if (con.State==ConnectionState.Closed)
            con.Open();

        LABEL.Text = txtbx_Empno.Text;

        cmd.ExecuteNonQuery();

        lbl_Errormsg.Visible = true;
        lbl_Errormsg.Text = "Record Inserted Successfully";

        con.Close();
    }

和存儲過程是

ALTER PROCEDURE dbo.Insertion
(
@Emp_no int,
@Emp_name varchar(30),
@phone numeric(10,0),
@Email varchar(30),
@Password varchar(10),
@Gender varchar(6),
@Dob date,
@Address varchar(100),
@Designation varchar(20),
@Qualification varchar(20),
@Experience numeric(4,2),
@Salary numeric(10,2),
@Doj date
)
AS
 Begin
   Insert into Register (Emp_no, Emp_name, phone, Email, Password, Gender, Dob, Address, Designation, Qualification, Experience, Salary, Doj)
   Values(@Emp_no, @Emp_name, @phone, @Email, @Password, @Gender, @Dob, @Address, @Designation, @Qualification, @Experience, @Salary, @Doj)
 End

請幫我。 提前致謝。

只是一個提示,它可能會為某人節省很多時間進行自我反省。 如果您遵循了此處的建議,例如使用 AddWithValue 來傳遞參數,並且您已驗證所有內容,但仍然收到錯誤消息“未提供”,請檢查您是否已設置命令對象的 CommandType 屬性到 CommandType.StoredProcedure。

不設置此屬性會導致相同的消息,相信我! 希望它可以幫助某人。

您需要使用SqlCommand.Parameters.AddWithValue

cmd.Parameters.AddWithValue("@ParameterName", value);

SqlCommand.Parameters.Add用於其他數據類型:

cmd.Parameters.Add("@ParameterName", SqlDbType.Int, 5);
cmd.Parameters["@ParameterName"].Value = value;

SqlCommand.Parameters.AddWithValue替換了采用字符串和對象參數的Add的模糊重載。 有關更多信息,請參閱MSDN

對於其他人:我剛剛遇到了同樣的錯誤,因為我的一個參數為空。 我們需要檢查它,例如:

command.Parameters.AddWithValue("@phone", (object)phone?? DBNull.Value);

您的插入存儲過程需要@Emp_no (以及大約 15 個其他參數)。 您不能在不傳遞參數的情況下調用存儲過程。

看看這個網站以供參考:

http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlparametercollection.addwithvalue.aspx?cs-save-lang=1&cs-lang=csharp#code-snippet-2

在您定義變量的任何地方,請改用Parameters.AddWithValue

cmd.Parameters.AddWithValue("@Emp_no ", Convert.ToInt32(txtbx_Empno.Text));

你需要使用這個:

cmd.Parameters.AddWithValue("@Emp_no", @Emp_no);
cmd.Parameters.AddWithValue("@Emp_name", @Emp_name);
cmd.Parameters.AddWithValue("@phone", @phone);
cmd.Parameters.AddWithValue("@Email", @Email);
cmd.Parameters.AddWithValue("@Password", @Password);
cmd.Parameters.AddWithValue("@Gender", @Gender);
cmd.Parameters.AddWithValue("@Dob", @Dob);
cmd.Parameters.AddWithValue("@Address", @Address);
cmd.Parameters.AddWithValue("@Designation", @Designation);
cmd.Parameters.AddWithValue("@Experience", @Experience);
cmd.Parameters.AddWithValue("@Salary", @Salary);
cmd.Parameters.AddWithValue("@Doj", @Doj);

否則,它將為每個參數拋出該異常。

這是如何做到的

using (var cmd = new SqlCommand("STORED_PROCEDURE_NAME", SqlConnection))
{
     cmd.CommandType = CommandType.StoredProcedure;
     cmd.Parameters.AddWithValue("@PARAM_NAME", PARAM_VALUE);
}

請注意AddWithValueCommandType.StoredProcedure都是必不可少的。

“只有一個 Add 方法已過時,該方法接受參數名稱的字符串和值的對象。正如您所指出的,對於這種情況,您應該調用 AddWithValue。”

http://social.msdn.microsoft.com/Forums/en-US/15bb16a4-0cf1-4289-b677-3b9d98f09298/parametersaddwithvalue-output-parameter-in-adonet-2?forum=adodotnetdataproviders

並非所有 Parameter.Add 方法都已折舊。 你想如何制作一個 OUTPUT 參數? 為此,您必須使用 Parameter.Add。

這些天仍然存在相同的錯誤消息,涵蓋多個問題 - 我的問題是將空值傳遞給參數。 答案是空檢查,如下所示:

parameter.Value = (object)yourParamVal ?? DBNULL.Value;

避免參數集為 DBNull.value 的沒有值的參數

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM