我想将数据库中的数据加载到带有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;
答案 0 :(得分:1)
对于Firebird,默认排序规则通常是区分大小写。 C#DataTable
似乎并非如此(例如,见Enable Case Sensitive when using DataTable.select)。
您需要将数据表的属性CaseSensitive
设置为true。
答案 1 :(得分:0)
不幸的是,如果差异是同一字符串中的空白(在字符串的开头或结尾),则DataTable的主键会将两个不同的字符串视为同一字符串。您的数据库对此问题具有不同的行为。
由于表的主键为此使用了一个列,因此您可以通过以下方法解决此问题:创建一个单独的数据结构,使用Linq扩展方法“ ToDictionary”创建一个字典,并根据需要使用它来查找行。
我在这里遇到了同样的问题,但是我找不到使用DataTable本身解决该问题的方法。祝你好运!