C# 使用DataTable填充SqlDataAdapter无效
我在form_load事件中运行此代码:C# 使用DataTable填充SqlDataAdapter无效,c#,sql,stored-procedures,parameters,sqldataadapter,C#,Sql,Stored Procedures,Parameters,Sqldataadapter,我在form_load事件中运行此代码: using (SqlConnection sqlConn = new SqlConnection(strConn)) { sqlConn.Open(); SqlDataAdapter sqlDa = new SqlDataAdapter("pp_sp_MachineAndOp", sqlConn); DataTable sqlDt
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',该参数未提供。'在第行:
重要的是,如果我在运行时打开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;
}
我缺少什么?我认为您的助手类正在创建与数据库的连接,因为您的数据表包含数据 所以,尝试从适配器中删除存储的进程名和连接对象,然后检查
SqlDataAdapter sqlDa=新的SqlDataAdapter()//仅使用此选项。删除除
DataTable sqlDt = Helper.ExecuteDataTable("pp_sp_MachineAndOp", new SqlParameter("@MachineAndOpID", 7));
dgvMachineAndOp.AutoGenerateColumns = false;
dgvMachineAndOp.DataSource = sqlDt;
您的Helper.ExecuteDataTable正在执行所有操作。您不需要在代码中复制相同的功能。您可以使用以下功能(根据需要进行修改):
public-IDataReader-ExecuteReader(字符串spName,对象[]参数值)
{
command=GetCommand();
command.CommandType=CommandType.storedProcess;
command.CommandText=spName;
if(参数值!=null)
{
对于(int i=0;i
Helper.ExecuteDataTable
是自定义代码,我们无法从远处告诉您它有什么问题。我要说的是,您需要两次提到pp\u sp\u MachineAndOp
,一次在SqlDataAdapter
的构造函数中,另一次在helper中,这是非常可疑的。在正确的设计中,不需要重复。我怀疑Helper.ExecuteDataTable
是为完成所有工作而设计的,根本不需要涉及SqlDataAdapter
。我已经在Helper.ExecuteDataTable后面添加了代码。正如您所见,Helper.ExecuteDataTable
确实完成了为您提供sqlDt
的所有工作,配有自己的SqlDataAdapter
。你为什么用你自己的?您只需要DataTable sqlDt=Helper.ExecuteDataTable(“pp_sp_MachineAndOp”,新的SqlParameter(“@MachineAndOpID”,7))代码>没有其他内容。我尝试了此操作,但发现错误:“SelectCommand属性在调用“Fill”之前尚未初始化。”我将在几分钟后添加Helper.ExecuteDataTable代码。
DataTable sqlDt = Helper.ExecuteDataTable("pp_sp_MachineAndOp", new SqlParameter("@MachineAndOpID", 7));
dgvMachineAndOp.AutoGenerateColumns = false;
dgvMachineAndOp.DataSource = sqlDt;
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;
}