Вести с полей
Утром выложил новую тестовую сборку провайдера (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».