Вести с полей
Утром выложил новую тестовую сборку провайдера (3.12.0.33717) с поддержкой IDENTITY колонок FB3.
Не прошло… хотя нет, таки прошло, шесть лет как я это сделал.
Ну, думаю, надо бы теперь соорудить примерчик на .NET, который бы показал «как узнать — имеет колонка автоинкремент или нет?».
Накатал.
//////////////////////////////////////////////////////////////////////////////// //Samples for LCPI ADO.NET Data provider for OLEDB. // ibprovider.com. 16.12.2020 using System; using lcpi.data.oledb; using structure_lib=lcpi.lib.structure; namespace Sample_0028{ //////////////////////////////////////////////////////////////////////////////// //class Program class Program { private const string c_cn_str ="provider=LCPI.IBProvider.5;" +"location=localhost:d:\\database\\ram\\ibp_test_fb30_d3.gdb;" +"dbclient_type=fb.direct;" +"user id=gamer;" +"password=vermut;"; //---------------------------------------------------------------------- static int Main(string[] args) { int resultCode=0; OleDbConnection cn=null; OleDbTransaction tr=null; OleDbCommand cmd=null; OleDbDataReader reader=null; try { cn=new OleDbConnection(c_cn_str); cn.Open(); var dsinfo=cn.GetSchema(OleDbMetaDataCollectionNames.DataSourceInformation); Helper__CheckComponents(dsinfo); tr=cn.BeginTransaction(); cmd=new OleDbCommand(null,cn,tr); //-------------------- Console.WriteLine("Recreate TBL_WITH_IDENTITY ..."); cmd.CommandText ="recreate table TBL_WITH_IDENTITY\n" +"(ID1 INTEGER GENERATED BY DEFAULT AS IDENTITY,\n" +" ID2 INTEGER)"; cmd.ExecuteNonQuery(); //-------------------- Console.WriteLine("Commit retain ..."); tr.CommitRetaining(); //-------------------- cmd.CommandText ="select ID1,ID2 from TBL_WITH_IDENTITY"; reader =cmd.ExecuteReader(System.Data.CommandBehavior.SchemaOnly); var readerSchema=reader.GetSchemaTable(); for(int i=0;i!=2;++i) //expected two rows { var readerSchemaRow=readerSchema.Rows[i]; Console.WriteLine ("[{0}] {1} has autoincrement: {2}", i, readerSchemaRow[OleDbDataReaderSchemaColumnNames.ColumnName], readerSchemaRow[OleDbDataReaderSchemaColumnNames.IsAutoIncrement]); }//for i //-------------------- Console.WriteLine("Commit ..."); tr.Commit(); } catch(Exception e) { resultCode=1; Console.WriteLine(""); Console.WriteLine("ERROR: {0} - {1}",e.Source,e.Message); }//catch finally { structure_lib.DisposeUtils.Exec(ref cmd); structure_lib.DisposeUtils.Exec(ref tr); structure_lib.DisposeUtils.Exec(ref cn); }//finally return resultCode; }//Main //----------------------------------------------------------------------- private static void Helper__CheckComponents(System.Data.DataTable dsinfo) { Helper__CheckComponents_DBMS(dsinfo); }//Helper__CheckComponents //----------------------------------------------------------------------- private static void Helper__CheckComponents_DBMS(System.Data.DataTable dsinfo) { var row=dsinfo.Rows[0]; var dbmsName =row[OleDbMetaDataCollectionColumnNames.DataSourceInformation.DataSourceProductName]; var dbmsVersion =row[OleDbMetaDataCollectionColumnNames.DataSourceInformation.DataSourceProductVersion]; if(DBNull.Value.Equals(dbmsName)) throw new ApplicationException("DBMS Name is not defined!"); if(DBNull.Value.Equals(dbmsVersion)) throw new ApplicationException("DBMS Version is not defined!"); if((string)(dbmsName)!="Firebird") throw new ApplicationException("Wrong DBMS name: "+dbmsName+". Expected \"Firebird\"."); if(new Version((string)dbmsVersion)<new Version("3.0")) throw new ApplicationException("Wrong Firebird version: "+dbmsVersion+". Expected version not less than 3.0."); Console.WriteLine("OK. We work with {0} {1}",dbmsName,dbmsVersion); }//Helper__CheckDBMS }//class Program //////////////////////////////////////////////////////////////////////////////// }//Sample_0028
Ну и пока его ваял/тестировал, обнаружилась странная хрень с сервером. Он, то подключается, то не подключается. Никак не может определиться.
Как лично по мне — это очередная ахинея в сервере.
Dmitry Kovalenko on 16 февраля, 2020
Проблема лечится приведением значения свойства USER ID к верхнему регистру — «GAMER».