SqlDataAdapter 填充 DataTable 不起作用

问题描述

我在 form_load 事件中运行此代码

        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();

        }

我收到错误 'Procedure or function 'pp_sp_MachineAndOp' 需要参数 '@MachineAndOpID',但未提供。' 行:

                sqlDa.Fill(sqlDt);

重要的是,如果我在运行时打开 sqlDt 的 DataTable Visualizer,我会看到预期的结果!

这是 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;
    }

我缺少什么?

解决方法

我认为您的助手类正在创建与数据库的连接,因为您的数据表中有数据。

因此,尝试从适配器中删除存储的 proc 名称和连接对象,然后检查。

SqlDataAdapter sqlDa = new SqlDataAdapter();//只使用这个。

,

删除除

之外的所有内容
 DataTable sqlDt = Helper.ExecuteDataTable("pp_sp_MachineAndOp",new SqlParameter("@MachineAndOpID",7));
dgvMachineAndOp.AutoGenerateColumns = false;
dgvMachineAndOp.DataSource = sqlDt;

您的 Helper.ExecuteDataTable 正在做所有事情。您不需要在代码中复制相同的内容。

,

您可以使用以下功能(根据您的需要进行修改):

 public IDataReader ExecuteReader(string spName,object[] parameterValues)
    {
        command = GetCommand();
        command.CommandType = CommandType.StoredProcedure;
        command.CommandText = spName;
        if (parameterValues != null)
        {
            for (int i = 0; i < parameterValues.Length; i++)
            {
                command.Parameters.Add(parameterValues[i]);
            }
        }
        reader = command.ExecuteReader();
        if (parameterValues != null)
            command.Parameters.Clear();
        return reader;
    }

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...