AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Probleme mit Native Client 10 und Transactions
Thema durchsuchen
Ansicht
Themen-Optionen

Probleme mit Native Client 10 und Transactions

Ein Thema von mmoeller1 · begonnen am 5. Mai 2009 · letzter Beitrag vom 27. Mai 2009
Antwort Antwort
mmoeller1

Registriert seit: 5. Mai 2009
4 Beiträge
 
#1

Probleme mit Native Client 10 und Transactions

  Alt 5. Mai 2009, 09:18
Datenbank: Microsoft SQL Server • Version: 2008 • Zugriff über: ADO
Hi,

ich arbeite grade an der Kompatibilität meiner Software zu SQL Server 2008.
Leider habe ich damit massive Probleme....

Ich vermute stark, dass das Problem mit dem Native Client 10 zusammen hängt.


Hier mein Problem:

Ich rufe in einer Transaktion eine StoredProcedure (über TADOStoredProc) auf.
Danach ändere ich in meiner StoredProcedure Komponente den 'ProcedureName' und Refreshe die Parameter.
Beim nächsten ausführen über "ExecProc" in einer Transaktion bekomme ich folgenden Fehler:

Falsche Syntax in der Nähe des 'set'-Schlüsselworts.


Weitere Fakten:

Dieser Fehler taucht teilweise auch bei Insert Anweisungen auf.
Ohne Transaktionen gibt es kein Problem.
Mit dem Native Client 9 funktioniert es mit oder ohne Transaktionen.


Hier der SQL Code der auf dem SQL Server ankommt:

SQL Log - native client 10 - mit Transaktion
SQL-Code:
exec [master].[sys].sp_procedure_params_100_rowset N'test',1,NULL,NULL
go
exec [test]
go
exec [master].[sys].sp_procedure_params_100_rowset N'test',1,NULL,NULL
go
SET NO_BROWSETABLE ON
go
 set fmtonly on EXEC set fmtonly off                                    -- Exception in Delphi here
go
 set fmtonly off
go



Und jetzt was ohne Transaction oder mit/ohne Transaktion bei Native Client 9 ankommt:


SQL-Code:
exec [master].[sys].sp_procedure_params_100_rowset N'test',1,NULL,NULL
go
exec [test]
go
exec [master].[sys].sp_procedure_params_100_rowset N'test',1,NULL,NULL
go
SET NO_BROWSETABLE ON
go
 set fmtonly on EXEC set fmtonly off
go
 set fmtonly off
go
SET NO_BROWSETABLE OFF
go
exec [test]
go


Die Stelle mit dem Problem ist set fmtonly on EXEC set fmtonly off

Ich vermute dass der Native client 10 in der Transaktion aus versehen eine Exception auslöst. Bei allen anderen varianten ist der abgesendete Code der gleiche (also genau so falsch), löst aber keinen Fehler aus.


Ich habe schon alle möglichen Property-Kombinationen der AdoConnection und AdoStoredProcedure Komponente getestet. Leider ohne Erfolg.

Ein Workaround war KEIN Parameters.Refresh zu machen, sondern die Parameter zu clearen und dann manuell anzulegen.
Leider gab es dann bei diversen anderen stellen Problemen mit Insert anweisungen.



Hier eine Demo:

Um das Problem reproduzieren zu können, benötigt Ihr den Native Client 10: http://go.microsoft.com/fwlink/?LinkId=110393




Project1.dpr

Delphi-Quellcode:
program Project1;

uses
  Forms,
  Unit1 in 'Unit1.pas{Form1};

{$R *.res}

begin
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.



Unit1.dfm


Delphi-Quellcode:
object Form1: TForm1
  Left = 424
  Top = 528
  Width = 483
  Height = 187
  Caption = 'Form1'
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'MS Sans Serif'
  Font.Style = []
  OldCreateOrder = False
  Position = poScreenCenter
  OnDestroy = FormDestroy
  DesignSize = (
    475
    153)
  PixelsPerInch = 96
  TextHeight = 13
  object Button1: TButton
    Left = 8
    Top = 56
    Width = 233
    Height = 25
    Caption = 'connect to DB and create StoredProc'
    TabOrder = 0
    OnClick = Button1Click
  end
  object Button2: TButton
    Left = 8
    Top = 120
    Width = 201
    Height = 25
    Caption = 'Execute StoredProc'
    TabOrder = 1
    OnClick = Button2Click
  end
  object CheckBox1: TCheckBox
    Left = 8
    Top = 104
    Width = 193
    Height = 17
    Caption = 'use transactions'
    Checked = True
    State = cbChecked
    TabOrder = 2
  end
  object LabeledEdit1: TLabeledEdit
    Left = 8
    Top = 24
    Width = 378
    Height = 21
    Anchors = [akLeft, akTop, akRight]
    EditLabel.Width = 81
    EditLabel.Height = 13
    EditLabel.Caption = 'ConnectionString'
    TabOrder = 3
    Text = 'Provider=SQLNCLI10.1'
  end
  object Button3: TButton
    Left = 393
    Top = 22
    Width = 75
    Height = 25
    Anchors = [akTop, akRight]
    Caption = 'build'
    TabOrder = 4
    OnClick = Button3Click
  end
  object Button4: TButton
    Left = 393
    Top = 119
    Width = 75
    Height = 25
    Anchors = [akRight, akBottom]
    Caption = 'Close'
    TabOrder = 5
    OnClick = Button4Click
  end
  object ADOConnection1: TADOConnection
    ConnectionString = 'Provider=SQLNCLI10.1'
    LoginPrompt = False
    Provider = 'SQLNCLI10.1'
    Left = 104
    Top = 48
  end
  object ADOStoredProc1: TADOStoredProc
    Connection = ADOConnection1
    Parameters = <>
    Left = 200
    Top = 48
  end
  object ADOCommand1: TADOCommand
    Connection = ADOConnection1
    Parameters = <>
    Left = 280
    Top = 56
  end
end


Unit1.pas

Delphi-Quellcode:
unit Unit1;

interface

uses
    Windows,
    Messages,
    SysUtils,
    Variants,
    Classes,
    Graphics,
    Controls,
    Forms,
    Dialogs,
    DB,
    ADODB,
    StdCtrls,
    ExtCtrls;

type
    TForm1 = class(TForm)
        ADOConnection1: TADOConnection;
        ADOStoredProc1: TADOStoredProc;
        Button1: TButton;
        Button2: TButton;
        CheckBox1: TCheckBox;
        LabeledEdit1: TLabeledEdit;
        Button3: TButton;
        Button4: TButton;
        ADOCommand1: TADOCommand;
        procedure Button1Click(Sender: TObject);
        procedure FormDestroy(Sender: TObject);
        procedure Button2Click(Sender: TObject);
        procedure Button3Click(Sender: TObject);
        procedure Button4Click(Sender: TObject);
    private
    { Private-Deklarationen }
    public
    { Public-Deklarationen }
    end;

var
    Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
    ADOConnection1.connected := false;
    ADOConnection1.ConnectionString := LabeledEdit1.Text;
    ADOConnection1.connected := true;

    try
        ADOCommand1.CommandText := 'CREATE PROCEDURE [test] AS';
        ADOCommand1.Execute;
    except
    end;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
    if ADOConnection1.Connected then
    begin

        ADOCommand1.CommandText := 'IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N''[test]'') AND type in (N''P'', N''PC'')) DROP PROCEDURE [test]';
        ADOCommand1.Execute;

        ADOConnection1.connected := false;

    end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
    if CheckBox1.Checked then ADOConnection1.BeginTrans;
    try
        ADOStoredProc1.ProcedureName := '[test]';
        ADOStoredProc1.parameters.Refresh;
        ADOStoredProc1.ExecProc;

        if CheckBox1.Checked then ADOConnection1.CommitTrans;
    except
        on E: Exception do
        begin
            if CheckBox1.Checked and ADOConnection1.InTransaction then
                ADOConnection1.RollbackTrans;

            ShowException(E, e);
        end;
    end;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
    LabeledEdit1.Text := PromptDataSource(Handle, LabeledEdit1.Text);
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
    close;
end;

end.


Nach starten der Applikation müsst Ihr den Connectionstring angeben. Klick auf 'build'


ACHTUNG: Der Native Client 10 hat wohl noch ein paar Probleme bei der SQL Authentifizierung (User/Pass Anmeldung). Entweder folgende Anleitung verwenden oder folgenden ConnectionString manuell anpassen und in das Eingabefeld einfügen

1. Provider auswählen -> weiter.
2. Bei "1." die IP oder den Servernamen angeben.
3. Bei "2." "Use an specific user name an password" auswählen.
4. "User name:" angeben (meist 'sa').
5. Bei "Blank password" den Haken entfernen.
6. Bei "Allow saving password" den Haken setzen.
7. "Password:" angeben.
8. Bei "3." Die Datenbank auswählen.
9. Verbindung Testen, dann weiter auf Tab "Alle"
10. Doppelklick auf Eintrag "Integrated Security". Dann ohne Änderung auf "OK".
11. Doppelklick auf Eintrag "Persist Security Info". Eigenschaftswert auf "True" ändern.
12. Dialog mit "OK" verlassen.





Beispiel ConnectionString:


Provider=SQLNCLI10.1;Password=<PASSWORT>;Persist Security Info=True;User ID=sa;Initial Catalog=<DATENBANK>;Data Source=<SERVERADRESSE>;Initial File Name="";Server SPN=""


Es wird automatisch eine StoredProcedure angelegt und beim Beenden wieder entfernt.



Für eure Hilfe wäre ich sehr dankbar!
  Mit Zitat antworten Zitat
mmoeller1

Registriert seit: 5. Mai 2009
4 Beiträge
 
#2

Re: Probleme mit Native Client 10 und Transactions

  Alt 6. Mai 2009, 12:45
Das Problem hängt nicht mit Delphi zusammen sondern beschränkt sich auf den Nativeclient 10.
Das Problem kann auch ohne Probleme mit einem VBScript nachvollzogen werden.

Weiß von euch jemand wie man einen Bug an Microsoft meldet?



VBScript:
Code:
DBdriver   = "SQLNCLI10.1"  'Native Client 10
'DBdriver   = "SQLOLEDB.1"  'Native Client 9
DBserver   = "127.0.0.1"
DBuser     = "sa"
DBpass     = ""
DBdb      = "test"

Set cn =CreateObject("ADODB.Connection")
cn.Open "Provider="&DBdriver&";Password="&DBpass&";Persist Security Info=True;User ID="&DBuser&";Initial Catalog="&DBdb&";Data Source="&DBserver&""
Set cmd = CreateObject("ADODB.Command")
Set cmd.ActiveConnection = cn
   
cn.BeginTrans
   cmd.CommandText = "test"
   cmd.commandtype=4
   cmd.Parameters.Refresh
   cmd.Execute
cn.CommitTrans

cn.BeginTrans
   cmd.CommandText = "test"
   cmd.commandtype=4
   cmd.Parameters.Refresh
   cmd.Execute
cn.CommitTrans
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.171 Beiträge
 
Delphi 10.4 Sydney
 
#3

Re: Probleme mit Native Client 10 und Transactions

  Alt 6. Mai 2009, 13:12
hast du schon das SP1 für den Server 2008 eingespielt?
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
mmoeller1

Registriert seit: 5. Mai 2009
4 Beiträge
 
#4

Re: Probleme mit Native Client 10 und Transactions

  Alt 7. Mai 2009, 07:38
Zitat von Bernhard Geyer:
hast du schon das SP1 für den Server 2008 eingespielt?
Ja, SP1 ist eingespielt. Habe auch schon nach neueren NativeClient 10 Updates ausschau gehalten aber da gibt es auch nichts neues.
  Mit Zitat antworten Zitat
mmoeller1

Registriert seit: 5. Mai 2009
4 Beiträge
 
#5

Re: Probleme mit Native Client 10 und Transactions

  Alt 27. Mai 2009, 13:54
Hier weitere Informationen:


http://social.msdn.microsoft.com/For...b-6e77e2219c67


Zitat:
OK, I have reproduced the problem.
Thank you for your patience.

The error here happens because ADO issues a metadata discovery request which proved to be problematic.
We are actively working to improve this area in the next release of the SQL Server to make it more robust.

As a workaround in VBScript you should be able to set ActiveConnection again like:


cn.BeginTrans
cmd.ActiveConnection = cn
cmd.CommandText = "test"
cmd.commandtype=4
cmd.Parameters.Refresh
cmd.Execute
cn.CommitTrans


cn.BeginTrans
cmd.ActiveConnection = cn
cmd.CommandText = "test"
cmd.commandtype=4
cmd.Parameters.Refresh
cmd.Execute
cn.CommitTrans


I suppose Delphi has an equivalent of setting active connection, could you try it?
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:05 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz