[fpc-devel] TMSSQLConnection - sqlDB component for accessing MS SQL Server

Marcos Douglas md at delfire.net
Tue Mar 20 21:19:58 CET 2012


On Tue, Mar 20, 2012 at 4:00 PM, Michael Van Canneyt
<michael at freepascal.org> wrote:
>
>
> On Tue, 20 Mar 2012, Marcos Douglas wrote:
>
>>>>>
>>>>> Hi Michael,
>>>>> Do you have some prediction to include the sources?
>>>>
>>>>
>>>>
>>>>
>>>> My apologies, I had totally forgotten; I am buried in work currently.
>>>>
>>>> Committed in revision 20522. I didn't commit any examples or tests.
>>>> Please
>>>> test if everything works OK. I compiled on Linux 64-bit, I don't have
>>>> a working FPC/Lazarus 32-bit windows development environment currently.
>>>
>>>
>>> I will do tests.
>>> Thanks!
>>
>>
>> I found a bug
>> Consider the script:
>> create table #t (id int, name varchar(60))
>>
>> If I execute:
>> insert table #t values (1, 'john')  -------- OK
>>
>> If I execute:
>> insert table #t (name) values ('john')  -------- ERROR
>
>
> What is the error you get ?
>
> Probably you need to quote name, as I imagine 'name' is a reserved word.

No.
Anyway, I change the colum names (id,name to col1, col2)
The error is:
"Cannot insert the value NULL into column 'col', table tempdb.dbo.#t..."

See the code (Insert2 procedure):

program t001;

{$mode objfpc}{$H+}

uses
  heaptrc, classes, sysutils, sqldb, fileutil, mssqlconn;

var
  tran: TSQLTransaction;
  conn: TMSSQLConnection;
  q: TSQLQuery;

procedure CreateTable;
begin
  q.Close;
  q.SQL.Text := 'create table #t (col1 int, col2 varchar(60))';
  q.ExecSQL;
end;

procedure Insert1;
begin
  q.Close;
  q.SQL.Text := 'insert into #t values (1, ''áéíç'')';
  q.ExecSQL;
end;

procedure Insert2;
begin
  q.Close;
  q.SQL.Text := 'insert into #t (col2) values (''áéíç'')';
  q.ExecSQL;
end;

procedure SelectAndShow;
var
  s: string;
begin
  q.Close;
  q.SQL.Text := 'select * from #t';
  q.Open;
  while not q.EOF do
  begin
    s := q.FieldByName('col2').AsString;
    writeln(UTF8ToConsole(s));
    q.Next;
  end;
end;

procedure Update;
begin
  q.Close;
  q.SQL.Text := 'update #t set col2 = ''foo''';
  q.ExecSQL;
end;

{$R *.res}

begin
  tran := TSQLTransaction.Create(nil);
  conn := TMSSQLConnection.Create(nil);
  q := TSQLQuery.Create(nil);
  try
    conn.Transaction := tran;
    q.DataBase := conn;

    conn.HostName := 'localhost';
    conn.DatabaseName := 'DbTest';
    conn.UserName := 'test';
    conn.Password := '123';
    conn.CharSet := 'UTF-8';
    conn.Connected := True;

    CreateTable;

    Insert1;
    SelectAndShow;

    Insert2; // <<<<<<<< ERROR here
    SelectAndShow;

    tran.Commit;
    tran.StartTransaction;
    try
      Update;
      tran.Commit;
    except
      tran.Rollback;
      raise;
    end;

    SelectAndShow;

    writeln('Done');
  finally
    q.Free;
    conn.Free;
    tran.Free;
  end;

end.


Marcos Douglas



More information about the fpc-devel mailing list