用 DataTable 填充的 SqlDataAdapter 不起作用

Posted

技术标签:

【中文标题】用 DataTable 填充的 SqlDataAdapter 不起作用【英文标题】:SqlDataAdapter filling with DataTable does not work 【发布时间】:2021-08-21 11:39:04 【问题描述】:

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

        

我收到错误“过程或函数“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;
    

我错过了什么?

【问题讨论】:

Helper.ExecuteDataTable 是自定义代码,我们无法从远处告诉您它有什么问题。我会说你需要提到pp_sp_MachineAndOp 两次是非常可疑的,一次是在SqlDataAdapter 的构造函数中,另一次是在助手中。在适当的设计中,没有必要重复它。我怀疑Helper.ExecuteDataTable 旨在完成所有工作,根本不需要SqlDataAdapter 我在 Helper.ExecuteDataTable 后面添加了代码。 如您所见,Helper.ExecuteDataTable 确实为您提供了sqlDt 的所有工作,并带有自己的SqlDataAdapter。你为什么用自己的?您只需要DataTable sqlDt = Helper.ExecuteDataTable("pp_sp_MachineAndOp", new SqlParameter("@MachineAndOpID", 7));,仅此而已。 【参考方案1】:

删除所有内容,除了

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

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

【讨论】:

【参考方案2】:

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

所以,尝试从适配器中删除存储的过程名称和连接对象,然后检查。

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

【讨论】:

我试过了,现在我得到了错误:'SelectCommand 属性在调用'Fill'之前没有被初始化。'我会在几分钟内添加 Helper.ExecuteDataTable 代码。【参考方案3】:

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

 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;
    

【讨论】:

以上是关于用 DataTable 填充的 SqlDataAdapter 不起作用的主要内容,如果未能解决你的问题,请参考以下文章

读取sqlite数据库时用SQLiteDataAdapter填充Datatable时遇到的问题。

SQLite SELECT查询中的自定义字段填充后不会成为DataTable中的DateTime列?

SqlDataAdapter 未填充 DataTable

从数据库中读取并填写DataTable

从两个通过 LINQ 连接的 DataTable 创建组合的 DataTable。 C#

使用 JSON 文件填充 DataTable 列,但 DataTable 为空