Search code examples
c#sqlstored-proceduresparameterssqldataadapter

SqlDataAdapter filling with DataTable does not work


I have this code running in form_load event:

        using (SqlConnection sqlConn = new SqlConnection(strConn))
        {
            sqlConn.Open();
            SqlDataAdapter sqlDa = new SqlDataAdapter("pp_sp_MachineAndOp", sqlConn);
            DataTable sqlDt = Helper.ExecuteDataTable("pp_sp_MachineAndOp", new SqlParameter("@MachineAndOpID", 7));
            sqlDa.Fill(sqlDt);
            dgvMachineAndOp.AutoGenerateColumns = false;
            dgvMachineAndOp.DataSource = sqlDt;

            sqlDa.Dispose();
            sqlConn.Close();

        }

I get error 'Procedure or function 'pp_sp_MachineAndOp' expects parameter '@MachineAndOpID', which was not supplied.' at line:

                sqlDa.Fill(sqlDt);

Important to say that if I open DataTable Visualizer of sqlDt at runtime I see expected results!

Here is a code behind Helper.ExecuteDataTable:

        public static DataTable ExecuteDataTable(string storedProcedureName, params SqlParameter[] arrParam)
    {
        DataTable dt = new DataTable();

        // Open the connection 
        using (SqlConnection sqlConn = new SqlConnection(strConn))
        {
            try
            {
                sqlConn.Open();
                // Define the command 
                using (SqlCommand sqlCmd = new SqlCommand())
                {
                    sqlCmd.Connection = sqlConn;
                    sqlCmd.CommandType = CommandType.StoredProcedure;
                    sqlCmd.CommandText = storedProcedureName;

                    // Handle the parameters 
                    if (arrParam != null)
                    {
                        foreach (SqlParameter param in arrParam)
                        {
                            sqlCmd.Parameters.Add(param);
                        }
                    }

                    // Define the data adapter and fill the dataset 
                    using (SqlDataAdapter da = new SqlDataAdapter(sqlCmd))
                    {
                        da.Fill(dt);
                    }
                }
            }
            catch (SqlException ex)
            {
                MessageBox.Show(ex.Message, Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error);
            }

        }
        return dt;
    }

What I am missing?


Solution

  • Remove everything except

     DataTable sqlDt = Helper.ExecuteDataTable("pp_sp_MachineAndOp", new SqlParameter("@MachineAndOpID", 7));
    dgvMachineAndOp.AutoGenerateColumns = false;
    dgvMachineAndOp.DataSource = sqlDt;
    

    your Helper.ExecuteDataTable is doing everything. you don't need to replicate same this in your code.