Ошибка «Процедура ожидает параметр, который не был предоставлен» при добавлении данных в мои данные Sql с использованием C # - PullRequest
0 голосов
/ 09 октября 2018

Для моего проекта 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();

Ваша помощь будет высоко ценится.

1 Ответ

0 голосов
/ 09 октября 2018

Хорошо, поэтому после нашего разговора в комментариях я еще раз просмотрел ваш код, чтобы увидеть, что мы пропустили, и внезапно это выскочило:

dbCmd.CommandType = CommandType.StoredProcedure;
dbCmd = new SqlCommand(sqlinsert, dbConn);

Ваш dbCmd тип командытеперь CommandType.Text, так как это значение по умолчанию.Измените порядок этих двух строк, и у вас все будет в порядке.

Однако, хотя я пишу ответ, вероятно, лучше еще кое-что изменить в своем коде:

  1. Вы используете поля для SqlConnection и SqlCommand.Это плохая практика.
    Рекомендуется использовать локальные переменные внутри оператора using для обоих - не только потому, что они оба реализуют интерфейс IDisposable, но также и потому, что 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();
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...