【问题标题】:C# Data generator for Oracle: ORA-26010Oracle 的 C# 数据生成器:ORA-26010
【发布时间】:2021-07-02 13:53:51
【问题描述】:

我正在尝试为 oracle 数据库创建 C# 数据生成器。虽然我遇到了一些问题。我收到 ORA-26010 错误消息:

数据库中的非空列未被加载,将导致每一行都被拒绝。

我之前的表格没有这个问题,我已经花了几个小时来寻找解决方案。

这是它在代码中的样子:

 private static DataTable BuildMagazynTable(int b)
    {
        var magazynTable = new DataTable();
        magazynTable.Columns.Add("ID");
        magazynTable.Columns.Add("NAZWA_MAGAZYNU");
        magazynTable.Columns.Add("MIASTO");
        magazynTable.Columns.Add("ULICA");
        magazynTable.Columns.Add("NR_LOKALU");

        for (int i = 1; i <= b; i++)
        {
            var ar = magazynTable.NewRow();
            ar["ID"] = null;
            ar["NAZWA_MAGAZYNU"] = "Nazwa Magazynu" + i;
            ar["MIASTO"] = "Miasto" + i;
            ar["ULICA"] = "Ulica" + i;
            ar["NR_LOKALU"] = "Nr lokalu" + i;

            magazynTable.Rows.Add(ar);
        }
        return magazynTable;
    }

还有我是如何在 oracle 数据库中创建表的:

CREATE TABLE magazyn (

id                NUMBER GENERATED by default on null as IDENTITY,
Nazwa_magazynu  VARCHAR2(15) NOT NULL,
miasto            VARCHAR2(15) NOT NULL,
ulica             VARCHAR2(15) NOT NULL,
Nr_lokalu      VARCHAR2(15) NOT NULL);
ALTER TABLE magazyn ADD CONSTRAINT magazyn_pk PRIMARY KEY ( id );

还有来自 SQL Developer 的屏幕:

我正在使用 Oracle.ManagedDataAccess 和大容量复制将数据发送到数据库。

【问题讨论】:

  • 在DataTable中省略ID列是否有效?
  • ID 是一个标识列,您不应该向它传递任何值,无论是否为 Null。
  • 如果我删除 ID,我仍然会得到相同的错误 - “NR_LOKALU”列上的 26010,就像以前一样。我用 ID = null 做了同样的事情;在 3 个不同的桌子上,它工作得很好。只是这个有问题。

标签: c# sql oracle


【解决方案1】:

如果 i 大于 9,那么您的数据将失败,因为 Nazwa Magazynu10 有 16 个字符,而您的列只能容纳 15 个字符。

您可以使用以下方法在 Oracle 中复制错误:

INSERT INTO magazyn ( ID, NAZWA_MAGAZYNU, MIASTO, ULICA, NR_LOKALU )
SELECT NULL,
       'Nazwa Magazynu' || LEVEL,
       'Miasto' || LEVEL,
       'Ulica' || LEVEL,
       'Nr lokalu' || LEVEL
FROM   DUAL
CONNECT BY LEVEL <= 10;

这会引发错误:

ORA-12899: value too large for column  "SCHEMA_NAME"."MAGAZYN"."NAZWA_MAGAZYNU" (actual: 16, maximum: 15)

但是,如果您使用较短的字符串:

INSERT INTO magazyn ( ID, NAZWA_MAGAZYNU, MIASTO, ULICA, NR_LOKALU )
SELECT NULL,
       'NM' || TO_CHAR( LEVEL, 'FM00000' ),
       'M'  || TO_CHAR( LEVEL, 'FM00000' ),
       'U'  || TO_CHAR( LEVEL, 'FM00000' ),
       'NL' || TO_CHAR( LEVEL, 'FM00000' )
FROM   DUAL
CONNECT BY LEVEL <= 10;

然后就可以了。

db小提琴here

【讨论】:

  • 谢谢,没注意到。虽然它不能解决主要问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多