【问题标题】:Update a set of rows of a table having no primary key更新没有主键的表的一组行
【发布时间】:2020-07-05 12:03:47
【问题描述】:

我想使用 ODP.net 更新一组行。 我想根据 PRIORITY 的递增顺序获取员工列表,并将 PRIORITY 列的值更新为 1 并递增 1。 我尝试了下面的方法,它给出了错误“动态 SQL 生成失败。没有找到关键信息”

StrQuery = "SELECT * FROM EMPLOYEE WHERE DEPT ='" + dept + "' ORDER BY PRIORITY";
DataTable dt = new DataTable();
OracleDataAdapter da = new OracleDataAdapter();
da.SelectCommand = new OracleCommand(StrQuery, ora);
OracleCommandBuilder cb = new OracleCommandBuilder(da);
da.Fill(dt);
intNpriority = 1;
foreach (DataRow row in dt.Rows)
{
    row["PRIORITY"] = intNpriority;
    intNpriority = intNpriority + 1;
}
da.UpdateCommand = cb.GetUpdateCommand();
da.Update(dt);

该表没有主键,我现在无法添加主键。我可以添加自定义更新查询吗?如何添加?有没有其他方法可以达到同样的效果?

表结构:

column name   |  (data type)
Employee_name |  (varchar2)
dept          |  (varchar2)
PRIORITY      | (NUMBER)

【问题讨论】:

  • 每当您有这样的问题时,请说明现有的数据结构(列名和数据类型,它们是否可以为空等),提供一些示例行,并显示所需的输出。不要让我们阅读您的代码(您自己承认它没有做您想做的事情)并猜测这一切背后的原因。
  • 可以使用Oracle ROWID 列吗?

标签: c# oracle odp.net


【解决方案1】:

我花了两天时间寻找解决方法。 幸运的是我能完成它。 想法是在DataTable中添加一个dump主键,这个新的dump列不会影响真正的数据库表。 这是我的代码示例

Dim currentRow = m_DataTable.Rows(m_RowPosition) Dim tmpRows() As DataRow = {currentRow}

        Dim cmdBuilder As OracleCommandBuilder = New OracleCommandBuilder(m_Adapter)
        
        **If m_DataTable.PrimaryKey.Count = 0 Then
            m_DataTable.Columns.Add(New DataColumn("_ID_", System.Type.GetType("System.String")))
            m_DataTable.Columns("_ID_").Unique = True
        End If**

        m_Adapter.Update(tmpRows)

注意:currentRow 是正在编辑的行。 请仔细考虑应用此提示,因为它可能会更新表的所有数据。 它适用于您的表格只有一行(某种配置数据)的情况

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-19
    • 1970-01-01
    • 2019-01-27
    • 1970-01-01
    • 1970-01-01
    • 2014-02-06
    • 2021-01-11
    相关资源
    最近更新 更多