C#数据表。无法使用Firebird检索或分配主键

时间:2017-08-24 12:51:28

标签: c# datatable primary-key firebird

我想将数据库中的数据加载到带有Firebird的数据集中,然后使用数据集(特别是使用Find)。为此,我需要为第一列分配一个主键。

当我使用FlameRobin查看数据库时,我可以看到约束,它告诉我主键被分配给AR_NUMMER。 但是当我尝试自己分配主键时,Visual Studio告诉我AR_NUMMER中的值不是唯一的。

FlameRobin告诉我AR_NUMMER列中的值是varchar(30)(值是字母数字字符串)。

当这些值明显用作主键时,它们如何才有可能是唯一的? (可能是这些值中原来的空格字符无法正确检索吗?)

我知道必须有一种方法可以使用列本身加载表的约束,但我无法使其工作。

这是我的代码,但主键除外:

private void ... (...)
{
string inikey = "Bewegungsdaten";
string datenbank = "Daten V4";
string sql = "SELECT a.AR_NUMMER, a.AR_LFDNR, a.AR_HRSTNUMMER, AR_HRSTLFDNR, a.AR_EAN, a.AR_BEZEICHNUNG, a.AR_KURZTEXT, a.AR_ISTBESTAND, a.AR_MASSE, a.AR_AG, a.AR_ALT, a.AR_FREI, a.GEANDERT, a.ANGELEGT " +
                    "FROM ARTIKEL a ";
tabName = "Artikel";
dbAbruf(inikey, datenbank, sql, tabName);
ds.Tables["Artikel"].PrimaryKey = new DataColumn[] { ds.Tables["Artikel"].Columns["AR_NUMMER"] };
}

private void dbAbruf(string inikey, string datenbank, string sql, string tabName)
{    
        IniFile iniFile = new IniFile("D:\\Projekte\\ABPS-Schnittstellen-Programm\\ABPS-Schnittstelle\\plmWEBkonfigurator.ini");
        string conString = iniFile.GetString("ERP-WEB-DBTranslator", inikey, "");

        FbConnection con = new FbConnection();
        FbCommand cmd = new FbCommand();
        con.ConnectionString = conString;
        cmd.Connection = con;
        cmd.CommandText = sql;

        try
        {
            con.Open();
            FbDataAdapter adapter = new FbDataAdapter(cmd);
            adapter.Fill(ds,tabName);
            DataTable table = ds.Tables[tabName];
            con.Close();
        }
        catch (Exception ex)
        { MessageBox.Show(ex.ToString(), "Fehler!", MessageBoxButtons.OK, MessageBoxIcon.Error); }

这是表格的完整DDL。它真的很长,因为总共有大约250列。

CREATE TABLE ARTIKEL
(
  AR_LFDNR integer NOT NULL,
  AR_NUMMER varchar(30) NOT NULL,
  AR_BEZEICHNUNG varchar(40),
  AR_AG varchar(18),
  AR_LANGTEXT blob sub_type 1,
  AR_KDNUMMER varchar(10),
  AR_ME varchar(10),
  AR_VORKALKNUMMER varchar(20),
  AR_INFO blob sub_type 1,
  AR_ISTBESTAND numeric(15,3) DEFAULT 0,
  AR_RESERVIERT numeric(15,3) DEFAULT 0,
  AR_MINDESTBESTAND numeric(15,3) DEFAULT 0,
  AR_BILDDATEI varchar(250),
  AR_RAL integer,
  AR_MASSE numeric(15,4) DEFAULT 0,
  AR_MASSEEINHEIT varchar(8) DEFAULT 'kg',
  AR_MAT1 integer,
  AR_MAT2 integer,
  AR_LIEFERANT1 varchar(10),
  AR_LIEFERANT2 varchar(10),
  AR_ANTEIL1 numeric(9,2) DEFAULT 0,
  AR_ANTEIL2 numeric(9,2) DEFAULT 0,
  AR_ANTEIL3 numeric(9,2) DEFAULT 100,
  AR_STUECKZEIT numeric(9,2) DEFAULT 0,
  AR_STUECKZEITEINHEIT varchar(3) DEFAULT 'Min',
  AR_RUESTZEIT numeric(9,2) DEFAULT 0,
  AR_RUESTZEITEINHEIT varchar(3) DEFAULT 'Min',
  AR_VERPACKUNG varchar(20),
  AR_VPE integer DEFAULT 0,
  AR_MASCHINE varchar(20),
  AR_WERKZEUGNUMMER varchar(25),
  AR_FACHZAHL smallint DEFAULT 1,
  AR_HATSTKLISTE varchar(1) DEFAULT 'F',
  AR_EK numeric(15,4) DEFAULT 0,
  AR_STL_LIST blob sub_type 1,
  AR_RAL1 integer,
  AR_VZTKNZ varchar(40),
  AR_ZEICHNUNG varchar(30),
  AR_TEILBEZ varchar(50),
  AR_MATERIAL varchar(50),
  AR_TEILE integer,
  AR_LAUFZEIT numeric(5,2),
  AR_KST0 varchar(8),
  AR_KST1 varchar(8),
  AR_KST2 varchar(8),
  AR_KST3 varchar(8),
  AR_KST4 varchar(8),
  AR_KST5 varchar(8),
  AR_WV0 numeric(5,2),
  AR_WV1 numeric(5,2),
  AR_WV2 numeric(5,2),
  AR_WV3 numeric(5,2),
  AR_WV4 numeric(5,2),
  AR_WV5 numeric(5,2),
  AR_WS0 numeric(5,2),
  AR_WS1 numeric(5,2),
  AR_WS2 numeric(5,2),
  AR_WS3 numeric(5,2),
  AR_WS4 numeric(5,2),
  AR_WS5 numeric(5,2),
  AR_VPGEWICHT numeric(5,2),
  AR_KALKMP numeric(9,2),
  AR_TAFEL1 numeric(9,2),
  AR_TAFEL2 numeric(9,2),
  AR_TAFEL3 numeric(9,2),
  AR_FREI numeric(15,3) DEFAULT 0,
  AR_BEZUG smallint DEFAULT 1,
  AR_MAXBESTAND numeric(15,3) DEFAULT 0,
  AR_KUEHLZEIT numeric(9,2),
  AR_HASTV varchar(1) DEFAULT 'F',
  AR_TVLFDNR integer DEFAULT 0,
  AR_TEINFO blob sub_type 1,
  AR_TYP varchar(1),
  AR_KURZTEXT varchar(50),
  AR_REV varchar(20),
  AR_REV_DATUM timestamp,
  AR_SERIENNUM_PFL varchar(1) DEFAULT 'F',
  AR_IMSTAPEL numeric(15,4) DEFAULT 0,
  AR_BESTELLT numeric(15,4) DEFAULT 0,
  AR_BEDARF numeric(15,4) DEFAULT 0,
  AR_ANLAGEKALK blob sub_type 1,
  AR_IDNR1 varchar(30),
  AR_IDNR2 varchar(30),
  AR_KILL timestamp,
  AR_FREIGABE varchar(1) DEFAULT 'F',
  AR_FRDATUM timestamp,
  AR_FRNAME varchar(20),
  AR_GRP varchar(30),
  AR_MASSEVERLUST numeric(15,3),
  AR_LIEFERGEWICHT numeric(15,3),
  AR_TRTYP smallint DEFAULT -1,
  AR_BEZEICHNUNGSPR1 varchar(40),
  AR_BEZEICHNUNGSPR2 varchar(40),
  AR_LANGTEXTSPR1 blob sub_type 1,
  AR_LANGTEXTSPR2 blob sub_type 1,
  AR_ALT varchar(1) DEFAULT 'F',
  AR_WKZBAU varchar(1) DEFAULT 'F',
  AR_MENGEJEVE numeric(9,3),
  AR_MEJEVE varchar(10),
  AR_EAN varchar(13),
  AR_MATCHCODE varchar(40),
  AR_BEZEICHNUNGZUSATZ varchar(40),
  AR_KST6 varchar(8),
  AR_KST7 varchar(8),
  AR_KST8 varchar(8),
  AR_KST9 varchar(8),
  AR_WV6 decimal(9,2),
  AR_WV7 decimal(9,2),
  AR_WV8 decimal(9,2),
  AR_WV9 decimal(9,2),
  AR_WS6 decimal(9,2),
  AR_WS7 decimal(9,2),
  AR_WS8 decimal(9,2),
  AR_WS9 decimal(9,2),
  AR_WB0 varchar(250),
  AR_WB1 varchar(90),
  AR_WB2 varchar(90),
  AR_WB3 varchar(90),
  AR_WB4 varchar(90),
  AR_WB5 varchar(90),
  AR_WB6 varchar(90),
  AR_WB7 varchar(90),
  AR_WB8 varchar(90),
  AR_WB9 varchar(90),
  AR_KUNDE varchar(30),
  AR_PRUEF_ANW varchar(5),
  AR_VERPACKK_ANW varchar(5),
  AR_TKLFDNR integer,
  AR_MAT3 integer,
  AR_LIEFERANT3 varchar(10),
  AR_ANT_MAT1 integer DEFAULT 100,
  AR_ANT_MAT3 integer DEFAULT 0,
  AR_MAT4 integer,
  AR_LIEFERANT4 varchar(10),
  AR_ANTEIL4 numeric(9,2) DEFAULT 0,
  AR_LAGERORT varchar(12),
  AR_BEREICH varchar(7),
  AR_LETZTESN integer DEFAULT 0,
  AR_LVKURZTEXT blob sub_type 1,
  AR_VPEGEWICHT numeric(15,3),
  AR_SCHICHT integer,
  AR_PROG varchar(10),
  AR_PRFILE blob sub_type 1,
  AR_ZOOMFKT varchar(5) DEFAULT '100',
  AR_TEILEJEME integer,
  AR_RAL2 integer,
  AR_RAL3 integer,
  AR_OFLNORM varchar(120),
  AR_LANGTEXTZUSATZ blob sub_type 1,
  AR_MINBERECH numeric(15,4),
  AR_KUNDEN blob sub_type 1,
  AR_FELD0 varchar(40),
  AR_FELD1 varchar(40),
  AR_FELD2 varchar(40),
  AR_FELD3 varchar(40),
  AR_FELD4 varchar(40),
  AR_FELD5 varchar(40),
  AR_FELD6 varchar(40),
  AR_FELD7 varchar(40),
  AR_FELD8 varchar(40),
  AR_FELD9 varchar(40),
  AR_TAFEL4 numeric(9,2),
  AR_SPPROG varchar(3),
  AR_MAT5 integer,
  AR_LIEFERANT5 varchar(10),
  AR_ANTEIL5 numeric(9,2),
  AR_DEFFELD0 varchar(40),
  AR_DEFFELD1 varchar(40),
  AR_DEFFELD2 varchar(40),
  AR_DEFFELD3 varchar(40),
  AR_DEFFELD4 varchar(40),
  AR_DEFFELD5 varchar(40),
  AR_DEFFELD6 varchar(40),
  AR_DEFFELD7 varchar(40),
  AR_DEFFELD8 varchar(40),
  AR_DEFFELD9 varchar(40),
  AR_DEFFELD10 varchar(40),
  AR_DEFFELD11 varchar(40),
  AR_DEFFELD12 varchar(40),
  AR_DEFFELD13 varchar(40),
  AR_DEFFELD14 varchar(40),
  AR_DEFFELD15 varchar(40),
  AR_DEFFELD16 varchar(40),
  AR_DEFFELD17 varchar(40),
  AR_DEFFELD18 varchar(40),
  AR_DEFFELD19 varchar(40),
  AR_CHARGE smallint DEFAULT 0,
  AR_ISKT smallint DEFAULT 0,
  AR_KSTV1 varchar(8),
  AR_KSTV2 varchar(8),
  AR_WVV1 numeric(5,2),
  AR_WVV2 numeric(5,2),
  AR_WSV1 numeric(5,2),
  AR_WSV2 numeric(5,2),
  AR_WBV1 varchar(90),
  AR_WBV2 varchar(90),
  AR_ZUBEHORAUTO varchar(1) DEFAULT 'F',
  AR_VP1CHK smallint DEFAULT 0,
  AR_VP2CHK smallint DEFAULT 0,
  AR_VP3CHK smallint DEFAULT 0,
  AR_VP4CHK smallint DEFAULT 0,
  AR_VP1 varchar(50),
  AR_VP2 varchar(50),
  AR_VP3 varchar(50),
  AR_VP4 varchar(50),
  AR_VP1STK integer,
  AR_VP2STK integer,
  AR_VP3STK integer,
  AR_VP4STK integer,
  AR_VP1NR varchar(30),
  AR_VP2NR varchar(30),
  AR_VP3NR varchar(30),
  AR_VP4NR varchar(30),
  AR_VP1TARA numeric(9,2),
  AR_VP2TARA numeric(9,2),
  AR_VP3TARA numeric(9,2),
  AR_VP4TARA numeric(9,2),
  AR_MTKLASSE varchar(12),
  AR_ZINDEX varchar(12),
  AR_MTKLASSE1 varchar(12),
  AR_MTKLASSE2 varchar(12),
  AR_MTKLASSE3 varchar(12),
  AR_FRWWW smallint DEFAULT 0,
  AR_KDRABATT varchar(1) DEFAULT 'F',
  AR_BESTAND1 numeric(15,3),
  AR_BESTAND2 numeric(15,3),
  AR_FLLFDNR integer,
  AR_CHKBESTAND varchar(1) DEFAULT 'F',
  AR_TMDRUCK smallint DEFAULT 0,
  AR_SGFKOA smallint DEFAULT 1,
  AR_SGFKOR smallint DEFAULT 0,
  AR_KDS smallint,
  AR_MATIDENTALT varchar(25),
  AR_TAFEL1ALT numeric(9,2),
  AR_TAFEL2ALT numeric(9,2),
  AR_TAFEL3ALT numeric(9,2),
  AR_INAUFTRAG numeric(15,4) DEFAULT 0,
  AR_SUMRZ numeric(15,8) DEFAULT 0,
  AR_SUMSZ numeric(15,8) DEFAULT 0,
  AR_SUMVLZ numeric(15,4) DEFAULT 0,
  AR_SUMAG integer DEFAULT 1,
  AR_VERPREIS numeric(15,4),
  AR_PINDEX varchar(12),
  AR_FLAECHE numeric(15,4),
  AR_GAS numeric(15,4),
  AR_RESBUFF numeric(15,3) DEFAULT 0,
  AR_ZEICHNUNGRT varchar(30),
  AR_ZINDEXRT varchar(12),
  AR_PINDEXRT varchar(12),
  AR_FRINDEX varchar(20),
  AR_SPERRBESTAND numeric(15,3) DEFAULT 0,
  AR_GASART varchar(10) DEFAULT '',
  AR_GASZEIT numeric(15,4) DEFAULT 0,
  AR_WTNUMMER varchar(5),
  AR_LAGER varchar(1) DEFAULT 'F',
  AR_KONTIERUNG varchar(1) DEFAULT 'F',
  AR_KONTO1 varchar(7),
  AR_KONTO2 varchar(7),
  AR_KONTO3 varchar(7),
  AR_KONTO4 varchar(7),
  AR_EKONTO1 varchar(7),
  AR_EKONTO2 varchar(7),
  AR_EKONTO3 varchar(7),
  AR_EKONTO4 varchar(7),
  AR_PRUEFBERICHT varchar(1) DEFAULT 'F',
  AR_RALNUMMER varchar(20),
  AR_ZFE varchar(3),
  AR_WGNR varchar(10),
  AR_EINSATZGEWICHT numeric(15,4),
  AR_EINSATZLAENGE numeric(15,4),
  AR_VBASIS integer,
  AR_VKALKNR varchar(20),
  AR_VNUTZER varchar(20),
  AR_VZEIT timestamp,
  AR_NEUTEIL smallint DEFAULT 0,
  AR_PSPGEANDERT timestamp,
  AR_PSPSTATUS integer,
  AR_FERTSTATUS integer,
  AR_IDNR3 varchar(30),
  AR_CHARRE integer DEFAULT 0,
  AR_LPREIS numeric(15,4),
  AR_LPREISDK numeric(15,4),
  AR_PREISINFO varchar(120),
  AR_PAKANZ integer,
  AR_NOINTPOL smallint DEFAULT 0,
  AR_STATWARENNR varchar(11),
  AR_DPREIS numeric(15,4),
  AR_MINPREIS numeric(15,4),
  AR_MAXPREIS numeric(15,4),
  AR_URSPRKNZ varchar(2),
  AR_HRSTLFDNR integer,
  AR_HRSTKBEZ varchar(30),
  AR_GEFKLASSE varchar(10),
  AR_VPEINHEIT varchar(10),
  AR_KATEGORIE integer,
  AR_HRSTNUMMER varchar(60),
  AR_ARAGEWICHT numeric(15,4),
  AR_RAL4 integer,
  AR_KALKART smallint DEFAULT 0,
  AR_PILFDNR integer,
  AR_HOLAENGE numeric(15,2),
  AR_HOBREITE numeric(15,2),
  AR_HOSTAERKE numeric(15,2),
  AR_HOLAENGE1 numeric(15,2),
  AR_HOLAENGE2 numeric(15,2),
  AR_EXTERNNR varchar(50),
  AR_VPMASSEEINHEIT varchar(8),
  AR_PROFIL varchar(2),
  AR_SGFANF smallint,
  AR_REVERSECHARGE smallint DEFAULT 0,
  NUTZERID varchar(20),
  GEANDERT timestamp,
  ANLNUTZERID varchar(20),
  ANGELEGT timestamp,
  CONSTRAINT INTEG_7 PRIMARY KEY (AR_NUMMER),
  CONSTRAINT UNQ_AR_LFDNR UNIQUE (AR_LFDNR)
);
ALTER TABLE ARTIKEL ADD CONSTRAINT FK_AR_AG_AG
  FOREIGN KEY (AR_AG) REFERENCES AG (AG_AG) ON UPDATE CASCADE ON DELETE SET NULL;
ALTER TABLE ARTIKEL ADD CONSTRAINT FK_AR_PILFDNR
  FOREIGN KEY (AR_PILFDNR) REFERENCES PIKTOGRAMME (PI_LFDNR) ON UPDATE CASCADE ON DELETE SET NULL;
CREATE INDEX AR_BEZEICHNUNG ON ARTIKEL (AR_BEZEICHNUNG);
CREATE INDEX AR_BEZEICHNUNG_NUMMER ON ARTIKEL (AR_BEZEICHNUNG,AR_NUMMER);
CREATE INDEX IDX_AR_BEZEICHNUNG_UPPER ON ARTIKEL COMPUTED BY (UPPER(AR_BEZEICHNUNG));
CREATE INDEX IDX_AR_HRSTNUMMER_UPPER ON ARTIKEL COMPUTED BY (UPPER(AR_HRSTNUMMER));
CREATE INDEX IDX_AR_MATCHCODE_UPPER ON ARTIKEL COMPUTED BY (UPPER(AR_MATCHCODE));
CREATE INDEX IDX_AR_NUMMER_UPPER ON ARTIKEL COMPUTED BY (UPPER(AR_NUMMER));
CREATE INDEX IDX_AR_TVLFDNR ON ARTIKEL (AR_TVLFDNR);
GRANT SELECT
 ON ARTIKEL TO ROLE CIN_USER;
GRANT DELETE, INSERT, REFERENCES, SELECT, UPDATE
 ON ARTIKEL TO ROLE GFU_USER;
GRANT DELETE, INSERT, REFERENCES, SELECT, UPDATE
 ON ARTIKEL TO  SYSDBA WITH GRANT OPTION;

2 个答案:

答案 0 :(得分:1)

对于Firebird,默认排序规则通常是区分大小写。 C#DataTable似乎并非如此(例如,见Enable Case Sensitive when using DataTable.select)。

您需要将数据表的属性CaseSensitive设置为true。

答案 1 :(得分:0)

不幸的是,如果差异是同一字符串中的空白(在字符串的开头或结尾),则DataTable的主键会将两个不同的字符串视为同一字符串。您的数据库对此问题具有不同的行为。

由于表的主键为此使用了一个列,因此您可以通过以下方法解决此问题:创建一个单独的数据结构,使用Linq扩展方法“ ToDictionary”创建一个字典,并根据需要使用它来查找行。

我在这里遇到了同样的问题,但是我找不到使用DataTable本身解决该问题的方法。祝你好运!