【问题标题】:C# - Check DataAdapter stateC# - 检查 DataAdapter 状态
【发布时间】:2018-11-24 04:09:08
【问题描述】:

我的问题标题可能是错误的,不要为此生气,但请让我解释一下我的问题是什么。

首先,我创建了一个存储过程,它从我的数据绑定 DatagridView 中执行插入/更新或删除,所有这些都在一起。这是通过将不同的参数值传递给我的插入命令/更新命令/删除命令的 TableAdapter 设置中的存储过程来完成的。目前我这样解决这个问题:

 private void InicializeAdapter()
 {
     da = new OracleDataAdapter();
     OracleConnection conn = new OracleConnection(conn_string);
     conn.Open();

     OracleCommand select = new OracleCommand("MySelectProcedure", conn);
     OracleCommand ins_upd = new OracleCommand("MyProcedure", conn);
     OracleCommand delete_rec = new OracleCommand("MyProcedure", conn);

     select.CommandType = CommandType.StoredProcedure;
     ins_upd.CommandType = CommandType.StoredProcedure;
     delete_rec.CommandType = CommandType.StoredProcedure;

     ins_upd.Parameters.Add(new OracleParameter("ID_IN", OracleDbType.Decimal, 4, "ID"));
     ins_upd.Parameters.Add(new OracleParameter("DELETE_IN", OracleDbType.Decimal)).Value = 0;
     ins_upd.Parameters.Add(new OracleParameter("SERIAL_IN", OracleDbType.Varchar2, 50, "SERIAL"));

     delete_rec.Parameters.Add(new OracleParameter("ID_IN", OracleDbType.Decimal, 4, "ID"));
     delete_rec.Parameters.Add(new OracleParameter("DELETE_IN", OracleDbType.Decimal)).Value = 1;
     delete_rec.Parameters.Add(new OracleParameter("SERIAL_IN", OracleDbType.Varchar2, 50, "SERIAL"));

     da.SelectCommand = select;
     da.UpdateCommand = ins_upd;
     da.InsertCommand = ins_upd;
     da.DeleteCommand = delete_rec;

     da.MissingSchemaAction = MissingSchemaAction.AddWithKey;
     conn.Close();
  }

简而言之,当我插入或更新时,我将参数“DELETE_IN”=0 发送到 Oracle,当我从 DatagridView 中删除行时,我发送参数“1”。这样甲骨文就知道该怎么做了,我的代码也能正常工作......

我的问题是 - 我如何才能仅根据发生的变化传递该参数的不同值,而不是再次为 DeleteCommand 写入所有参数,如您在上面的示例中看到的那样?我正在考虑类似检查是否有插入/更新或删除命令,例如:

If (dataAdapter1.InsertCommand)
{
  ins_upd.Parameters.Add(new OracleParameter("DELETE_IN", OracleDbType.Decimal)).Value = 0;
}
else if(dataAdapter1.Deletecommand)
{
 ins_upd.Parameters.Add(new OracleParameter("DELETE_IN", OracleDbType.Decimal)).Value = 0;
}

我问是因为这会大大缩短我的代码。我知道可以在 DataTable 中监控更改,但是我在为 DataAdapter 分配命令时不知道如何使用它。

任何帮助表示赞赏,在此先感谢!

P.S.:我的Datagridview绑定到BindingSource,BindingSource的数据源是Datatable。

【问题讨论】:

  • 您的第二个代码示例无法编译。 if (dataAdapter1.InsertCommand) 在 C# 中不起作用。
  • @Sefe,当然不是,这只是一个比喻,我需要解决我的问题。我需要知道 DataAdapter 何时选择执行插入、更新或删除命令,以便将我的参数值正确传递给 Oracle。这是我的问题。
  • 不清楚你想用if (dataAdapter1.InsertCommand)实现什么。该条件不是布尔值,它是一个公开猜测您要检查的条件。我不清楚if 的用途,因为适配器会自动选择正确的命令。 ifelse 的主体是相同的。我建议您用文本描述您的预期解决方案,因为我很难从代码示例中理解它,无论它是否编译。

标签: c# dataadapter


【解决方案1】:

方法调用将解决您的问题:

private static OracleCommand CreateUpdateDeleteCommand(OracleConnection connection,
    bool shouldDelete) {

    OracleCommand command = new OracleCommand("MyProcedure", connection);
    command.CommandType = CommandType.StoredProcedure;

    command.Parameters.Add(new OracleParameter("ID_IN", OracleDbType.Decimal, 4, "ID"));    
    command.Parameters.Add(new OracleParameter("DELETE_IN", OracleDbType.Decimal)).Value =
        shouldDelete ? 1 : 0;
    command.Parameters.Add(new OracleParameter("SERIAL_IN", OracleDbType.Varchar2, 50,
        "SERIAL"));
    return command;
}

private void InitializeAdapter() {
    da = new OracleDataAdapter();
    OracleConnection conn = new OracleConnection(conn_string);
    conn.Open();

    OracleCommand select = new OracleCommand("MySelectProcedure", conn);
    select.CommandType = CommandType.StoredProcedure;
    da.SelectCommand = select;

    da.UpdateCommand = CreateUpdateDeleteCommand(conn, shouldDelete: false);
    da.InsertCommand = CreateUpdateDeleteCommand(conn, shouldDelete: false);
    da.DeleteCommand = CreateUpdateDeleteCommand(conn, shouldDelete: true);

    da.MissingSchemaAction = MissingSchemaAction.AddWithKey;
    conn.Close();
}

【讨论】:

  • 感谢您的回答,是的,这是我正在寻找的东西。抱歉所有的误解,但我没有发布我所有的代码来更好地澄清自己。我会这样做,但现在我会尝试使用你的建议,并告诉你结果。
  • 我尝试了你的建议,但它不起作用。当我尝试设置例如DataAdapter1.UpdateCommand= InitCommand(ins_upd, shouldDelete: false); 我收到错误 无法将 void 隐式转换为 oracle 命令
  • 我更新了初始化 DataAdapter 的整个代码,现在你可以看到它了。唯一缺少的是我还使用 switch 语句为不同的表初始化相同的东西,所以整个代码很长,我想通过传递参数 DELETE_IN 值来缩短它,如前所述。
猜你喜欢
  • 1970-01-01
  • 2011-06-02
  • 2023-03-26
  • 2010-09-23
  • 2011-06-12
  • 1970-01-01
  • 1970-01-01
  • 2012-07-01
  • 1970-01-01
相关资源
最近更新 更多