Вести с полей

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

Ну и пока его ваял/тестировал, обнаружилась странная хрень с сервером. Он, то подключается, то не подключается. Никак не может определиться.

Как лично по мне — это очередная ахинея в сервере.

3 комментария

Dmitry Kovalenko  on 16 февраля, 2020

Проблема лечится приведением значения свойства USER ID к верхнему регистру — «GAMER».

Dmitry Kovalenko  on 16 февраля, 2020

Сегодня забавный день.

Обнаружилась еще одна бага, но уже в обновленном System.Data.OleDb. Клиент решил обновиться и наступил на эти грабли. Походу он первый, кто решил эту штуку использовать 🙂

[winsock][BUG CHECK] Чтение из закрытого порта подключения. Ошибка WinSock: 0  on 11 февраля, 2022

[…] Позже сообразил, что она уже вылазила. Причем совсем недавно. […]

Leave a Comment