用 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列?