问题描述
我在 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;
}