Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
3696 connectés 

  FORUM HardWare.fr
  Programmation
  C#/.NET managed

  [C#] Bosser avec un CLOB Oralce ?

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[C#] Bosser avec un CLOB Oralce ?

n°1324204
Arjuna
Aircraft Ident.: F-MBSD
Posté le 13-03-2006 à 14:36:44  profilanswer
 

Salut,
 
J'ai une table Oracle avec notamment un CLOB dedans.
 
Actuellement, je veux écrire dedans une valeur.
 
"insert into matable (id, monclob) values (:id, :monclob)"
 
dans un objet oraclecommand, avec deux paramètres.
sauf que j'arrive pas à faire marcher le "clob". si je basarde une string dedans, ça marche pas. en bidouillant à partir d'exemples qui marchent pas du tout pareil (et je ne veux pas faire la bidouille à deux balles qui consiste à faire un "select for update" ) je suis arrivé à ça :
 

Code :
  1. OracleParameter param5 = cmd.CreateParameter();
  2.    param5.DbType = DbType.Object;
  3.    param5.Direction = ParameterDirection.Input;
  4.    param5.ParameterName = ":newtxt";
  5.    OracleLob val = (OracleLob)param5.Value;
  6.    byte[] valB = System.Text.Encoding.UTF8.GetBytes(newtxt);
  7.    val.Write(valB, 0, valB.Length);
  8.    param5.Value = val;
  9.    cmd.Parameters.Add(param5);


 
Sauf que ça plante à l'execution, en me disant que l'objet n'est pas instancié (val = null) sur le "val.Write()"
 


Erreur du serveur dans l'application '/bci'.
La référence d'objet n'est pas définie à une instance d'un objet.
Description : Une exception non gérée s'est produite au moment de l'exécution de la demande Web actuelle. Contrôlez la trace de la pile pour plus d'informations sur l'erreur et son origine dans le code.
 
Détails de l'exception: System.NullReferenceException: La référence d'objet n'est pas définie à une instance d'un objet.
 
Erreur source:
 
Ligne 1387 :    OracleLob val = (OracleLob)param5.Value;
Ligne 1388 :    byte[] valB = System.Text.Encoding.UTF8.GetBytes(newtxt);
Ligne 1389 :    val.Write(valB, 0, valB.Length);
Ligne 1390 :    param5.Value = val;
Ligne 1391 :    cmd.Parameters.Add(param5);
 
 
Fichier source : c:\inetpub\wwwroot\bci\queries.cs    Ligne : 1389
 
Trace de la pile:
 
[NullReferenceException: La référence d'objet n'est pas définie à une instance d'un objet.]
   bci.Queries.CreateNews(Object newnum, Decimal codsoc, String typtie, String sigtie, String newtit, String newtxt, String newfic, String datdeb, String datfin, String typdes) in c:\inetpub\wwwroot\bci\queries.cs:1389
   bci.WriteNews.btnSave_Click(Object sender, EventArgs e) in c:\inetpub\wwwroot\bci\writenews.aspx.cs:118
   System.Web.UI.WebControls.Button.OnClick(EventArgs e) +108
   System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument) +57
   System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument) +18
   System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData) +33
   System.Web.UI.Page.ProcessRequestMain() +1292
 
 
Informations sur la version : Version Microsoft .NET Framework :1.1.4322.2300; Version ASP.NET :1.1.4322.2300


 
QQ1 sait comment faire ? :sweat:

mood
Publicité
Posté le 13-03-2006 à 14:36:44  profilanswer
 

n°1324246
Arjuna
Aircraft Ident.: F-MBSD
Posté le 13-03-2006 à 14:51:58  profilanswer
 

Après avoir vu ce lien :
http://forums.oracle.com/forums/th [...] &tstart=90
 
Retour à la case départ :

Code :
  1. OracleParameter param5 = cmd.Parameters.Add(":newtxt", OracleType.Clob);
  2.    param5.Direction = ParameterDirection.Input;
  3.    param5.Value = newtxt; //System.Text.Encoding.UTF8.GetBytes();
  4. //    cmd.Parameters.Add(param5);


(écrit différement de ce que j'avais mis au début, mais bon)
 
Erreur :

Code :
  1. [OracleException: ORA-12704: non concordance de jeux de caractères]


 
Moi je veux bien, mais j'ai pas de jeu de caractère spécifié, et je vois pas comment en spécifier un :fou:
 
On va se la retenter en BLOB, du binaire, il devrait plus m'emmerder avec un jeu de caractère :gun:


Message édité par Arjuna le 13-03-2006 à 14:56:06
n°1324261
Arjuna
Aircraft Ident.: F-MBSD
Posté le 13-03-2006 à 14:59:20  profilanswer
 

:heink:
 
Je vais l'éclater ce truc :o
 
Même avec un Blob il m'emmerde avec le jeu de caractères :gun:
 

Code :
  1. OracleParameter param5 = cmd.CreateParameter();
  2.    param5.OracleType = OracleType.Blob;
  3.    param5.Direction = ParameterDirection.Input;
  4.    param5.ParameterName = ":newtxt";
  5.    param5.Value = System.Text.Encoding.UTF8.GetBytes(newtxt);
  6.    cmd.Parameters.Add(param5);
  7. [...]
  8.    OracleString rowid;
  9.    cmd.ExecuteOracleNonQuery(out rowid);


 
Erreur :
 


Erreur du serveur dans l'application '/bci'.
ORA-12704: non concordance de jeux de caractères
Description : Une exception non gérée s'est produite au moment de l'exécution de la demande Web actuelle. Contrôlez la trace de la pile pour plus d'informations sur l'erreur et son origine dans le code.
 
Détails de l'exception: System.Data.OracleClient.OracleException: ORA-12704: non concordance de jeux de caractères
 
Erreur source:
 
Ligne 1416 :    cmd.Parameters.Add(param9);
Ligne 1417 :    OracleString rowid;
Ligne 1418 :    cmd.ExecuteOracleNonQuery(out rowid);
Ligne 1419 :    return true;
Ligne 1420 :   }
 
 
Fichier source : c:\inetpub\wwwroot\bci\queries.cs    Ligne : 1418
 
Trace de la pile:
 
[OracleException: ORA-12704: non concordance de jeux de caractères
]
   System.Data.OracleClient.OracleConnection.CheckError(OciErrorHandle errorHandle, Int32 rc) +174
   System.Data.OracleClient.OracleCommand.Execute(OciHandle statementHandle, CommandBehavior behavior, Boolean isReader, Boolean needRowid, OciHandle& rowidDescriptor, ArrayList& refCursorParameterOrdinals) +1934
   System.Data.OracleClient.OracleCommand.Execute(OciHandle statementHandle, CommandBehavior behavior, Boolean needRowid, OciHandle& rowidDescriptor) +32
   System.Data.OracleClient.OracleCommand.ExecuteNonQueryInternal(Boolean needRowid, OciHandle& rowidDescriptor) +171
   System.Data.OracleClient.OracleCommand.ExecuteOracleNonQuery(OracleString& rowid) +63
   bci.Queries.CreateNews(Object newnum, Decimal codsoc, String typtie, String sigtie, String newtit, String newtxt, String newfic, String datdeb, String datfin, String typdes) in c:\inetpub\wwwroot\bci\queries.cs:1418
   bci.WriteNews.btnSave_Click(Object sender, EventArgs e) in c:\inetpub\wwwroot\bci\writenews.aspx.cs:118
   System.Web.UI.WebControls.Button.OnClick(EventArgs e) +108
   System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument) +57
   System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument) +18
   System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData) +33
   System.Web.UI.Page.ProcessRequestMain() +1292
 
 
Informations sur la version : Version Microsoft .NET Framework :1.1.4322.2300; Version ASP.NET :1.1.4322.2300


Message édité par Arjuna le 13-03-2006 à 15:01:25
n°1324522
moi23372
Posté le 13-03-2006 à 20:19:59  profilanswer
 

je devrais bosser la dessus la semaine prochaine, si d'ici la tu n'as pas de solution, je te dirais comment je l'aurais fait car je sais qu'ils l'ont déjà fait chez moi au boulot...

n°1324782
Arjuna
Aircraft Ident.: F-MBSD
Posté le 14-03-2006 à 09:05:57  profilanswer
 

J'espère bien avoir trouvé d'ici là ;)
 
Par contre si tu peux piquer les sources de tes collègues, ça m'aiderait bien :ange:


Message édité par Arjuna le 14-03-2006 à 09:06:25
n°1324791
Arjuna
Aircraft Ident.: F-MBSD
Posté le 14-03-2006 à 09:29:29  profilanswer
 

oh putain je vais le bousiller ce connard d'Oracle :o
 
en fait, c'est pas sur le CLOB que ça merdait... ze soucy of "game of characters" venait du type "DbType.String" au lieu de "DbType.AnsiString" pour mettre dans un VARCHAR2 (pour les autres champs) :gun:
 
Quand ça veut pas, ça veut pas.
 
M'enfin bon maintenant ça marche :bounce:

n°1324795
Arjuna
Aircraft Ident.: F-MBSD
Posté le 14-03-2006 à 09:33:52  profilanswer
 

So, the syntaxe qui marche :
 
Côté de la base :


 
CREATE TABLE WT_NEWS
(
  CODSOC  NUMBER,
  TYPTIE  VARCHAR2(3),
  SIGTIE  VARCHAR2(12),
  NUMNEW  NUMBER,
  DATDEB  VARCHAR2(8),
  DATFIN  VARCHAR2(8),
  TYPDES  VARCHAR2(3),
  NEWTIT  VARCHAR2(30),
  NEWTXT  CLOB,
  NEWFIC  VARCHAR2(255)
)
TABLESPACE DATGNX1
PCTUSED    40
PCTFREE    10
INITRANS   1
MAXTRANS   255
STORAGE    (
            INITIAL          32K
            NEXT             504K
            MINEXTENTS       1
            MAXEXTENTS       2147483645
            PCTINCREASE      10
            FREELISTS        1
            FREELIST GROUPS  1
            BUFFER_POOL      DEFAULT
           )
LOGGING  
  LOB (NEWTXT) STORE AS  
      ( TABLESPACE  DATGNX1  
        ENABLE      STORAGE IN ROW
        CHUNK       8192
        PCTVERSION  10
        NOCACHE
        STORAGE    (
                    INITIAL          32K
                    NEXT             504K
                    MINEXTENTS       1
                    MAXEXTENTS       2147483645
                    PCTINCREASE      10
                    FREELISTS        1
                    FREELIST GROUPS  1
                    BUFFER_POOL      DEFAULT
                   )
      )
NOCACHE
NOPARALLEL;
 
 
CREATE INDEX IX_WT_NEWS1 ON WT_NEWS
(CODSOC, TYPTIE, SIGTIE)
LOGGING
TABLESPACE DATGNX1
PCTFREE    10
INITRANS   2
MAXTRANS   255
STORAGE    (
            INITIAL          32K
            NEXT             504K
            MINEXTENTS       1
            MAXEXTENTS       2147483645
            PCTINCREASE      10
            FREELISTS        1
            FREELIST GROUPS  1
            BUFFER_POOL      DEFAULT
           )
NOPARALLEL;
 
 
CREATE INDEX IX_WT_NEWS2 ON WT_NEWS
(CODSOC, TYPDES, DATDEB, DATFIN)
LOGGING
TABLESPACE DATGNX1
PCTFREE    10
INITRANS   2
MAXTRANS   255
STORAGE    (
            INITIAL          32K
            NEXT             504K
            MINEXTENTS       1
            MAXEXTENTS       2147483645
            PCTINCREASE      10
            FREELISTS        1
            FREELIST GROUPS  1
            BUFFER_POOL      DEFAULT
           )
NOPARALLEL;
 
 
CREATE UNIQUE INDEX UIX_WT_NEWS ON WT_NEWS
(NUMNEW)
LOGGING
TABLESPACE DATGNX1
PCTFREE    10
INITRANS   2
MAXTRANS   255
STORAGE    (
            INITIAL          32K
            NEXT             504K
            MINEXTENTS       1
            MAXEXTENTS       2147483645
            PCTINCREASE      10
            FREELISTS        1
            FREELIST GROUPS  1
            BUFFER_POOL      DEFAULT
           )
NOPARALLEL;


 
(bien noter ces putains de "VARCHAR2" qui ont remplacés automatiquement les "VARCHAR" que j'avais mis, qui sont compatible "DbType.String", eux :o)
 
Côté C# :

Code :
  1. private const string sCreateNews =  "insert into wt_news (numnew, codsoc, typtie, sigtie, newtit, newtxt, newfic, datdeb, datfin, typdes) " +
  2.            "values (seq_wt_news.nextval, :codsoc, :typtie, :sigtie, :newtit, :newtxt, :newfic, :datdeb, :datfin, :typdes)";
  3.  public bool CreateNews(object newnum, decimal codsoc, string typtie, string sigtie, string newtit, string newtxt, string newfic, string datdeb, string datfin, string typdes)
  4.  {
  5.   if (newnum != null)
  6.   {
  7.    // update
  8.    return false;
  9.   }
  10.   else
  11.   {
  12.    OracleCommand cmd = cnx.CreateCommand();
  13.    cmd.CommandType = CommandType.Text;
  14.    cmd.CommandText = sCreateNews;
  15.    OracleParameter param1 = cmd.CreateParameter();
  16.    param1.DbType = DbType.Decimal;
  17.    param1.Direction = ParameterDirection.Input;
  18.    param1.ParameterName = ":codsoc";
  19.    param1.Size = 12;
  20.    param1.Value = codsoc;
  21.    cmd.Parameters.Add(param1);
  22.    OracleParameter param2 = cmd.CreateParameter();
  23.    param2.DbType = DbType.AnsiString;
  24.    param2.Direction = ParameterDirection.Input;
  25.    param2.ParameterName = ":typtie";
  26.    param2.Size = 3;
  27.    param2.Value = typtie.ToUpper();
  28.    cmd.Parameters.Add(param2);
  29.    OracleParameter param3 = cmd.CreateParameter();
  30.    param3.DbType = DbType.AnsiString;
  31.    param3.Direction = ParameterDirection.Input;
  32.    param3.ParameterName = ":sigtie";
  33.    param3.Size = 12;
  34.    param3.Value = sigtie.ToUpper();
  35.    cmd.Parameters.Add(param3);
  36.    OracleParameter param4 = cmd.CreateParameter();
  37.    param4.DbType = DbType.AnsiString;
  38.    param4.Direction = ParameterDirection.Input;
  39.    param4.ParameterName = ":newtit";
  40.    param4.Size = 30;
  41.    param4.Value = newtit;
  42.    cmd.Parameters.Add(param4);
  43.    OracleParameter param5 = cmd.CreateParameter();
  44.    param5.OracleType = OracleType.Clob;
  45.    param5.Direction = ParameterDirection.Input;
  46.    param5.ParameterName = ":newtxt";
  47.    param5.Value = newtxt;
  48.    cmd.Parameters.Add(param5);
  49.    OracleParameter param6 = cmd.CreateParameter();
  50.    param6.DbType = DbType.AnsiString;
  51.    param6.Direction = ParameterDirection.Input;
  52.    param6.ParameterName = ":newfic";
  53.    param6.Size = 255;
  54.    param6.Value = newfic.ToLower();
  55.    cmd.Parameters.Add(param6);
  56.    OracleParameter param7 = cmd.CreateParameter();
  57.    param7.DbType = DbType.AnsiString;
  58.    param7.Direction = ParameterDirection.Input;
  59.    param7.ParameterName = ":datdeb";
  60.    param7.Size = 8;
  61.    param7.Value = datdeb;
  62.    cmd.Parameters.Add(param7);
  63.    OracleParameter param8 = cmd.CreateParameter();
  64.    param8.DbType = DbType.AnsiString;
  65.    param8.Direction = ParameterDirection.Input;
  66.    param8.ParameterName = ":datfin";
  67.    param8.Size = 8;
  68.    param8.Value = datfin;
  69.    cmd.Parameters.Add(param8);
  70.    OracleParameter param9 = cmd.CreateParameter();
  71.    param9.DbType = DbType.AnsiString;
  72.    param9.Direction = ParameterDirection.Input;
  73.    param9.ParameterName = ":typdes";
  74.    param9.Size = 3;
  75.    param9.Value = typdes;
  76.    cmd.Parameters.Add(param9);
  77.    OracleString rowid;
  78.    cmd.ExecuteOracleNonQuery(out rowid);
  79.    return true;
  80.   }
  81.  }


 
Reste plus qu'à faire le UPDATE quoi :D
En tout cas, le Insert marche bien :)
(sauf que "newtit" s'est pas enregistré, faut que je voie pkoi :D)

n°1325257
alien_nan
Posté le 14-03-2006 à 17:28:39  profilanswer
 

http://www.oracle.com/technology/t [...] index.html
 
c'est un module que tu installes ds vs2003 pour avoir un explorateur de serveur comme SqlServeur, avec les fonctions de drag & drop de table / proc stock qui vont bien pour génerer ta DAL plus facilement
 
sinon le driver ODP d'oracle est d'apres ce que j'ai pu lire (et on l'utilise) meilleur en terme de perf que celui de M$
http://morpheus.developpez.com/oracledotnet/
 
 :hello:

n°1325409
Arjuna
Aircraft Ident.: F-MBSD
Posté le 14-03-2006 à 19:47:59  profilanswer
 

ben moi j'utilise le drivers fourni avec Oracle 10gR2

n°1325624
alien_nan
Posté le 15-03-2006 à 09:24:02  profilanswer
 

Arjuna a écrit :

ben moi j'utilise le drivers fourni avec Oracle 10gR2


c le meme :)
par contre le module d'exploration de serveur est pas mal (je n'ai pas d'actions chez Oracle :D )

mood
Publicité
Posté le 15-03-2006 à 09:24:02  profilanswer
 

n°1325938
Arjuna
Aircraft Ident.: F-MBSD
Posté le 15-03-2006 à 15:51:04  profilanswer
 

chais pas, moi j'utilise Toad dont General Electric a payé une licence à mon patron sur mon PC perso alors que je bosse chez un autre client (c'est clair ?)
 
en tout cas, toad dernière version c'est d'la balle (juste un peu moins bien que Microsoft Entreprise Manager :ange: :D)

n°1334290
laylay
Posté le 29-03-2006 à 00:11:23  profilanswer
 

s'il vous plait est ce que quelqunpeut m'aider:Urgent: comment se connecter à une base de donnée oracle via C#


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C#/.NET managed

  [C#] Bosser avec un CLOB Oralce ?

 

Sujets relatifs
[Oracle] Problème de performances Instr et CLOBrequete SQL select like dans un CLOB
LIKE incompatible avec les CLOB ?Creation et manipulation de "clob" Oracle en JAVA [Résolu]
[oracle] question con sur les cloby a un classe java qui permet de bosser sur des chemins ?
Quel profil pour bosser dans les jeux vidéo? 
Plus de sujets relatifs à : [C#] Bosser avec un CLOB Oralce ?


Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)