【发布时间】: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));,仅此而已。
标签: c# sql stored-procedures parameters sqldataadapter