我想使用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;
发布于 2017-08-28 14:41:09
对于Firebird,默认排序规则通常区分大小写。这似乎不是C# DataTable
的情况(例如,参见Enable Case Sensitive when using DataTable.select)。
您需要将数据表的属性CaseSensitive
设置为true。
发布于 2019-05-14 01:56:24
不幸的是,如果同一字符串(在字符串的开头或结尾)中存在空格,DataTable的主键会将两个不同的字符串视为同一个字符串。对于此问题,您的数据库具有不同的行为。
由于您的表的主键对其使用单个列,因此您可以通过创建一个单独的数据结构来解决此问题,该结构是一个使用Linq扩展方法"ToDictionary“的字典,并在需要时使用它来查找行。
我在这里遇到了同样的问题,而且我发现没有办法使用DataTable本身来解决这个问题。祝好运!
https://stackoverflow.com/questions/45862157
复制相似问题