Autor Téma: Otevření SQL CE databáze s nvarchar >127 znaků  (Přečteno 4819 krát)

Offline jux

  • Příspěvků: 10
  • Karma: 0
    • Verze Delphi: XE
Prosím o radu, nevíte někdo, jak správně otevřít databázi SQL CE, která obsahuje tabulky s položkami typu nvarchar(4000) ??
Jakmile se pokusím otevřít tabulku, která takovou položku obsahuje, obdržím chybovou hlášku. Pokud změním délku položky na <127, tak vše funguje..  Hledal jsem po internetu nápovědu, podobný problém se řeší na mnoha fórech už od r 2008, nicméně všechna ta vlákna nakonec vedou ... do tmy.. :-(  Jediné, na co jsem narazil, byla rada s použitím Server-Side Cursors , nicméně to mi nefunguje vůbec..

Prosím o shovívavost, nejsem profík, programuji jen občas, ale potřebuji nutně něco vyřešit..  :-)

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 1623
  • Karma: 67
    • Verze Delphi: D5,D2007, DXE, DXE2 + 2 poslední (teď XE8 a XE10)
    • O Delphi v češtině
Re:Otevření SQL CE databáze s nvarchar >127 znaků
« Odpověď #1 kdy: 05-02-2015, 22:17:55 »
A jen tak mimochodem ta chybova hlaska je presne jak? A vubec cim to oteviras, pres co pristupujes atd.
Embarcadero MVP - Czech republic

Offline jux

  • Příspěvků: 10
  • Karma: 0
    • Verze Delphi: XE
Re:Otevření SQL CE databáze s nvarchar >127 znaků
« Odpověď #2 kdy: 06-02-2015, 11:44:21 »
Omlouvám se za vágní dotaz.. Napsal jsem špatně, co vlastně potřebuji..
K databázi přistupuji pomocí ADO, a dostávám chybové hlášení " Byl otevřen objekt" .   Na internetu jsem se dočetl, že se jedná pravděpodobně o chybu OLEDB provideru, viz
https://social.msdn.microsoft.com/Forums/sqlserver/en-US/d3eadff4-3e9d-4415-8eb6-12792c8670d8/sql-server-compact-35-and-delphi-7?forum=sqlce , to je asi kompletní popis mého problému.. nebo (https://social.msdn.microsoft.com/Forums/sqlserver/en-US/48815888-d4ee-42dd-b712-2168639e973c/sql-server-compact-35-nvarchar-limitation?forum=sqlce)

Našel jsem jedno jediné jakési řešení, kde autor popisoval, že při použití Server-Side Cursors se snad tato chyba nevyskytuje, nicméně já v tom případě obdržím hlášku " Operace s více kroky vedla k vytvoření chyb. Zkontrolujte všechny hodnoty stavů služby OLE DB, jsou-li k dispozici. Nebyla provedena žádná akce" 
(http://stackoverflow.com/questions/6962306/sql-server-compact-edition-3-5-gives-multiple-step-operation-generated-errors)

Šlo mi o to, že bych potřeboval poradit, jak případně tu chybu obejít. Vše, co jsem po internetu sehnal, byly různé rady typu zkrátit pole na <127 znaků, založit databázi jinak, atd. To ale nemůžu, protože potřebuji otevřít stávající databázi bez toho, abych nějak ořezal data v ní uložená..

Znovu se omlouvám, pokud můj dotaz není úplně srozumitelný, databázemi se normálně nezabývám a programuji si spíše drobnosti pro osobní potřebu.

JJ
« Poslední změna: 06-02-2015, 11:47:41 od jux »

Hugo

  • Host
Re:Otevření SQL CE databáze s nvarchar >127 znaků
« Odpověď #3 kdy: 06-02-2015, 19:00:11 »
Ahoj běžně používám nvarchar(4000) ale s databází MS SQL nevím co je CE, čtu to s delphi a žádný problém jsem nezaznamenal. Jen pozor na vyhledávání a práci s řetězci v azbuce atd. jinak se ti budou vracet jen samé ???????????????????????????????

Jak s tím pracuješ?

Hugo

  • Host
Re:Otevření SQL CE databáze s nvarchar >127 znaků
« Odpověď #4 kdy: 06-02-2015, 19:04:31 »
Jestli to máš v DELPHI je nutné přistupovat s datovým typem WideString TWideStringField v ADOQuery. Jestli použiješ string (256) ASCI znaků bude to pro UNICODE 127 znaků délky.

Offline Daniel_Andrascik

  • Hrdina
  • ****
  • Příspěvků: 392
  • Karma: 15
    • Verze Delphi: D2007, XE3
Re:Otevření SQL CE databáze s nvarchar >127 znaků
« Odpověď #5 kdy: 06-02-2015, 19:16:33 »
CE je tusim Compact edition. A pokial ma pamat neklame tak spravanie normalnej serverovskej a CE edicie nie su uplne totozne.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 1678
  • Karma: 70
    • Verze Delphi: D2007, XE3, DX10
Re:Otevření SQL CE databáze s nvarchar >127 znaků
« Odpověď #6 kdy: 06-02-2015, 19:22:08 »
CE je tusim Compact edition. A pokial ma pamat neklame tak spravanie normalnej serverovskej a CE edicie nie su uplne totozne.
To te pamet neklame: je to takove siditko, ktere umi jen unicode stringy, nema triggery, SP a jeste buhvi co.

Offline jux

  • Příspěvků: 10
  • Karma: 0
    • Verze Delphi: XE
Re:Otevření SQL CE databáze s nvarchar >127 znaků
« Odpověď #7 kdy: 06-02-2015, 20:39:16 »
Děkuji za reakce, vezmu to dozadu - MS SQL CE je opravdu to "šidítko" Compact Edition :-) .  Bohužel, protože tvůrce toho programu, který s touto mou databází pracuje, ho vytvořil pravděpodobně v MS Visual Studiu, jehož je MQ SQL CE součástí, tak i já musím s touto lahůdkou pracovat.. 
Ve zkratce - potřebuji si napsat jednoduchý program, který na základě nějakého výběru, je nepodstatné jakého, vybere z "hlavní" databáze určité záznamy a překopíruje je do "nové" databáze, kterou zase zpětně bude používat ten původní program.
Začal jsem s tím pokusničit, a vzápětí jsem narazil na problém, když se pokouším udělat např. Select z tabulky, která obsahuje položku typu nvarchar(4000), tak dostanu zpět chybovou hlášku "Objekt je otevřen".  Jestliže jen změním v tom Selectu tabulku na takovou, která nvarchar >127 neobsahuje, tak vše funguje, jak má, data se zobrazí, přenesou atd.
Jak jsem psal v minulém příspěvku, po nějakém hledání jsem našel poměrně dost zoufalých výkřiků, že se to lidem, kteří něco podobného zkoušejí děje také. Jsou to obvykle starší příspěvky, ale nikde jsem nenašel nějaké finální řešení.
Proto se zkouším zeptat tady, jestli by někoho nenapadlo, jak to obejít..

Otevírám to prostřednictvím OLEDB provideru a ADO, testuji to v Delphi7.
Na formuláři mám komponenty AdoConnection , AdoDataSet, DataSource, DataSetProvider a DBGrid. K propojení je použit MS SQL CE 3.5 OLEDB provider.
Zatím od toho programu nechci nic jiného, než aby mi zobrazil data z příslušné tabulky v DBGrid. Jak jsem psal, jakmile nepožaduji data z tabulky, v níž by se vyskytoval nvarchar >127 , tak vše proběhne , jak má a DBGrid zobrazí příslušná data.
Podle všeho je to bohužel opravdu vlastnost toho OLEDB provideru. Bohužel, jak jsem psal, nejsem v databázích zběhlý, takže nevím, jestli je nějaká možnost přistupovat k té databázi prostřednictvím něčeho jiného. Ta CE verze MS SQL je totiž opravdu dost specifická...
Bohužel ale nemám možnost to udělat nějak jinak. Původní program, který databázi vytváří a spravuje prostě neumí některé potřebné věci, takže se snažím ty funkce dotvořit "externě" ... Jsem tudíž nucen dodržet všechny formáty atd., aby po provedených externích operacích tu upravenou databázi ten původní program zase přijal... Varianta kompletního vytvoření nového "původního" programu bohužel nepřichází v úvahu, i když by to bylo nejlepší. Je dost rozsáhlý, a navíc komunikuje se speciálním zařízením naprosto nestandardním protokolem... :-(


« Poslední změna: 06-02-2015, 20:47:23 od jux »

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 1678
  • Karma: 70
    • Verze Delphi: D2007, XE3, DX10
Re:Otevření SQL CE databáze s nvarchar >127 znaků
« Odpověď #8 kdy: 06-02-2015, 20:59:15 »
Jak jsem psal v minulém příspěvku, po nějakém hledání jsem našel poměrně dost zoufalých výkřiků, že se to lidem, kteří něco podobného zkoušejí děje také. Jsou to obvykle starší příspěvky, ale nikde jsem nenašel nějaké finální řešení.
Namatkou jsem se na nektere ty odkazy dival, ale ty se vetsinou tykaly čuráklu, ne? Teoreticky by tam nejaka neplecha mohla byt, protoze pisou, ze CE je compacted na urovni stranek a ne bajtu a stranky ma 256 bytu. Na druhou stranu nikde o zadnem omezeni na delku nic nepisou a mela by zvladat 1..4000 NCHAR/NVARCHAR

Citace
Otevírám to prostřednictvím OLEDB provideru a ADO, testuji to v Delphi7.
No tady by mohl byt kamen urazu, protoze CE umi jen NCHAR a NVARCHAR, cili nativni kodovani woken tj. unicode a D7 neni unikodifikovan.

Ja bych nejdriv zkusil bliz izolovat problem:

1. Nevim, jestli se na tu DB da dostat treba z Management studia nebo LINQ nebo odnekud, ale zkusil bych, jestli to v takovem toolu funguje nebo ne.
2. Pokud ano, zkusil bych to treba z .NETu (tim bych mohl vyloucit ten OLEDB provider, protoze ten bude spolecny)
3. Nakonec bych se soustredil na Delphi a jak ti radil Hugo, je treba pouzit WideString


Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 1623
  • Karma: 67
    • Verze Delphi: D5,D2007, DXE, DXE2 + 2 poslední (teď XE8 a XE10)
    • O Delphi v češtině
Re:Otevření SQL CE databáze s nvarchar >127 znaků
« Odpověď #9 kdy: 06-02-2015, 21:18:20 »
No jak jsem se na to dival, tak se opravdu vsude tvrdi, ze je to problem s OLEDB providerem - http://stackoverflow.com/questions/14221821/getting-delphi-7-to-play-with-sql-server-compact-3-5/14222561#14222561.

Proč nezkusíš ten server side kurzor? Jen při otevírání např. TAdoQuery.CursorLocation := clUseServer
Embarcadero MVP - Czech republic

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 1623
  • Karma: 67
    • Verze Delphi: D5,D2007, DXE, DXE2 + 2 poslední (teď XE8 a XE10)
    • O Delphi v češtině
Re:Otevření SQL CE databáze s nvarchar >127 znaků
« Odpověď #10 kdy: 06-02-2015, 21:28:02 »
A mimochodem z VB mají stejný problém http://stackoverflow.com/questions/2272730/vb6-adodb-fails-with-sql-compact-multipe-step-operation-generated-errors, který také byl vyřešen

changing

mDbConnection.CursorLocation = adUseClient
to
mDbConnection.CursorLocation = adUseServer
Embarcadero MVP - Czech republic

Offline jux

  • Příspěvků: 10
  • Karma: 0
    • Verze Delphi: XE
Re:Otevření SQL CE databáze s nvarchar >127 znaků
« Odpověď #11 kdy: 06-02-2015, 21:28:37 »
Díky za návrhy, co se týče
ad 1) do databáze se dostanu a jsem schopen s ní pracovat prostřednictvím http://sourceforge.net/projects/compactview/
ad 2) jak jsem psal, nejsem profík, takže netuším, jak bych to měl udělat
ad 3) netuším, jak ten Widestring použít, protože komponentu ADOQuery v tom mém testovacím programu vůbec nemám použitu, koukal jsem na ni, ale žádnou volbu, kde bych mohl nastavit WideString jsem nenašel ani v ní, ani v ostatních komponentách, které tam mám... Ale je pravda, že to by mohl být onen problém.. Jdu ještě hledat.. :-)

Omlouvám se, tuším, že radit někomu, kdo toho o tématu moc neví, není jednoduché... :-)


Offline jux

  • Příspěvků: 10
  • Karma: 0
    • Verze Delphi: XE
Re:Otevření SQL CE databáze s nvarchar >127 znaků
« Odpověď #12 kdy: 06-02-2015, 21:31:25 »
Server side cursor jsem zkoušel nastavit, nicméně to zase dostanu chybovou hlášku
" Operace s více kroky vedla k vytvoření chyb. Zkontrolujte všechny hodnoty stavů služby OLE DB, jsou-li k dispozici. Nebyla provedena žádná akce" 
Kouknu na to, co jste mi poslali, a zkusím server side nastavit těmi zaslanými příkazy. Třeba jsem to dělal špatně. Nastavil jsem to rovnou ve vlastnostech komponent při jejich definování..

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 1623
  • Karma: 67
    • Verze Delphi: D5,D2007, DXE, DXE2 + 2 poslední (teď XE8 a XE10)
    • O Delphi v češtině
Re:Otevření SQL CE databáze s nvarchar >127 znaků
« Odpověď #13 kdy: 06-02-2015, 22:02:56 »
Server side cursor jsem zkoušel nastavit, nicméně to zase dostanu chybovou hlášku
" Operace s více kroky vedla k vytvoření chyb. Zkontrolujte všechny hodnoty stavů služby OLE DB, jsou-li k dispozici. Nebyla provedena žádná akce" 
Kouknu na to, co jste mi poslali, a zkusím server side nastavit těmi zaslanými příkazy. Třeba jsem to dělal špatně. Nastavil jsem to rovnou ve vlastnostech komponent při jejich definování..


Jen pro jistotu, zkus to nastavit jen pro tu query, a tu query nemej pripojenou na zadny grid, proste to jen zkus otevrit a projit pres Next
Embarcadero MVP - Czech republic

Offline jux

  • Příspěvků: 10
  • Karma: 0
    • Verze Delphi: XE
Re:Otevření SQL CE databáze s nvarchar >127 znaků
« Odpověď #14 kdy: 26-02-2015, 12:07:18 »
Omlouvám se za delší odmlku způsobenou nemocí..
Trochu jsem na tom pracoval, ale dostávám se stále do téhož problému.  Pro přehlednost přikládám testovací program :


------------------------------------------------------
unit Unit1_3b;

interface

uses
  Windows, Messages, SysUtils, Registry, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ActiveX, ComObj, AdoDb, DBClient, Provider, DB, Grids, DBGrids,
  StdCtrls;

type
  TForm1 = class(TForm)
    ADOConnection1: TADOConnection;
    ADODataSet1: TADODataSet;
    DataSource1: TDataSource;
    DBGrid1: TDBGrid;
    Button2: TButton;
    Button3: TButton;
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure FormShow(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}



procedure TForm1.Button2Click(Sender: TObject);
begin
 ADODataSet1.Active:=False;
 AdoDataset1.CommandText:='Select * from Lokalita';
 ADODataSet1.Active:=True;

end;

procedure TForm1.Button3Click(Sender: TObject);
begin
 ADODataSet1.Active:=False;
 AdoDataset1.CommandText:='Select * from Dodavatel;';
 ADODataSet1.Active:=True;
end;

procedure TForm1.FormShow(Sender: TObject);
begin
 //ADODataSet1.CursorLocation:=clUseServer;
 AdoDataSet1.ConnectionString:='Provider=Microsoft.SQLSERVER.CE.OLEDB.3.5;Data Source=C:\Users\Juks\Documents\DELPHI_7\TestSDF1\data1.sdf';

end;

end.
--------------------------------------------------------------------------------

Pokud program spustím přesně tak, jak je uvedený zde, po stisku Button3 se DBGrid naplní daty z tabulky Lokalita, která neobsahuje nvarchar>127, tak, jak potřebuji .
Pokud stisknu Button2, který otevírá data z tabulky s nvarchar(4000) objeví se hláška "Byl otevřen objekt" .
Pokud v proceduře FormShow přidám řádek ADODataSet1.CursorLocation:=clUseServer; , obdržím pro Button3 hlášku "Operace služby OLEDB s více kroky vedla k vytvoření chyb" a pro Button2 "Nespecifikovaná chyba"

Zkusil jsem použít místo ADODataSet  ADOQuery, se stejným výsledkem, i co se týče CursorLocation:=clUseServer .
"Operace služby OLEDB s více kroky vedla k vytvoření chyb" se objeví v okamžiku, kdy v takovém případě s ADOQuery udělám OPEN. k NEXTu se vůbec nedostanu..  :-(

Předem díky za všechny případné nápady co dál..

JJ


« Poslední změna: 26-02-2015, 13:11:15 od jux »

Offline jux

  • Příspěvků: 10
  • Karma: 0
    • Verze Delphi: XE
Re:Otevření SQL CE databáze s nvarchar >127 znaků
« Odpověď #15 kdy: 02-04-2015, 19:20:54 »
Hmmm, ta to vypadá, že se asi žádné rady už nedočkám...
Mohl by mi prosím někdo zkusit poradit alespoň v tom, jestli správně používám to přepnutí Cursorlocation na Serverside ? Není potřeba tam nastavit ještě něco dalšího ?  Není mi jasné, proč mi to nefunguje, když na několika fórech ve světě to zmiňují jako řešení, a mě to nejde ani zapnout..

Díky předem

JJ

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 1623
  • Karma: 67
    • Verze Delphi: D5,D2007, DXE, DXE2 + 2 poslední (teď XE8 a XE10)
    • O Delphi v češtině
Re:Otevření SQL CE databáze s nvarchar >127 znaků
« Odpověď #16 kdy: 02-04-2015, 23:21:06 »
Jen zkus jeste tohle:
Mej AdoQuery a u ni nastav CursorType := ctOpenForwardOnly a CursoLocation := clUseServer.
Nesmis to mit pripojene na Datasource ani grid.

Proste ciste AdoQuery, pak AdoQuery.Open a AdoQuery.Next;
Embarcadero MVP - Czech republic

Offline jux

  • Příspěvků: 10
  • Karma: 0
    • Verze Delphi: XE
Re:Otevření SQL CE databáze s nvarchar >127 znaků
« Odpověď #17 kdy: 03-04-2015, 13:54:40 »
Díky, ale bohužel to vede na stále stejnou hlášku
" Operace s více kroky vedla k vytvoření chyb. Zkontrolujte všechny hodnoty stavů služby OLE DB, jsou-li k dispozici. Nebyla provedena žádná akce"

Použil jsem tento testovací program :

procedure TForm1.Button1Click(Sender: TObject);
begin
AdoQuery1.ConnectionString:='Provider=Microsoft.SQLSERVER.CE.OLEDB.3.5;DataSource=C:\Users\j\Documents\DELPHI_7\TestSDF1\data1.sdf';
 ADOQuery1.CursorType:=ctOpenForwardOnly;
 ADOQuery1.CursorLocation:=clUseServer;
 ADOQuery1.SQL.Add('SELECT * from Lokalita');
 ADOQuery1.Open;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
 AdoQuery1.Next
end;

Nic jiného vyjma ADOQuery a dvou tlačítek v programu nebylo. K chybě dojde při OPEN.

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 1623
  • Karma: 67
    • Verze Delphi: D5,D2007, DXE, DXE2 + 2 poslední (teď XE8 a XE10)
    • O Delphi v češtině
Re:Otevření SQL CE databáze s nvarchar >127 znaků
« Odpověď #18 kdy: 03-04-2015, 14:14:42 »
A kdyz to prelozis s debug dcu a budes krokovat dovnitr? Ja si totiz myslim, ze pri open se provede jeste nejaka jina operace - a treba by se dalo pres neco obejit. Ale tezko rict. Potreboval bych testovaci projekt a databazi abych to mohl kdyz tak zkusit.
Embarcadero MVP - Czech republic

Offline jux

  • Příspěvků: 10
  • Karma: 0
    • Verze Delphi: XE
Re:Otevření SQL CE databáze s nvarchar >127 znaků
« Odpověď #19 kdy: 03-04-2015, 18:42:01 »
Uložil jsem prázdnou testovací tabulku a původní testovací program na  http://www.uschovna.cz/zasilka/EIZHI6EEITEY3KU6-GF2/
pokud by jste měl někdo chuť s tím experimentovat.. Přiznám se, že toho o krokování dcu moc netuším..

Předem díky
JJ

Offline jux

  • Příspěvků: 10
  • Karma: 0
    • Verze Delphi: XE
Re:Otevření SQL CE databáze s nvarchar >127 znaků
« Odpověď #20 kdy: 27-04-2015, 23:40:59 »
Tak jsem to nakonec obešel.
Pomocí exportu v http://sourceforge.net/p/compactview jsem tu databázi převedl na soupis SQL příkazů, a následně jsem všechny deklarace položek typu nvarchar(4000) upravil v textovém editoru na typ ntext . Položky nvarchar(255) šly naštěstí všechny bez ztráty dat převést na nvarchar(127), se kterým v Delphi nejsou problémy . Následně jsem nechal proběhnout všechny příkazy a vytvořil novou upravenou databázi. Tu jsem následně předhodil originál programu, který s ní pracuje - zdá se, že je vše funkční, i když jsem ještě neotestoval vše. Otevírání databáze v Delphi mi již chodí, takže teď jdu konečně psát ten program, který jsem před tak dávnou dobou započal..

Díky všem za čas, který jste strávili při psaní odpovědí na mé nejasné otázky..

JJ

 

S rychlou odpovědí můžete používat BB kódy a emotikony jako v běžném okně pro odpověď, ale daleko rychleji.

Upozornění: do tohoto tématu bylo naposledy přispěno před 120 dny.
Zvažte prosím založení nového tématu.

Jméno: E-mail:
Ověření:
Datový typ v Delphi, který má True a False: