[C#] Bosser avec un CLOB Oralce ?

Bosser avec un CLOB Oralce ? [C#] - C#/.NET managed - Programmation

Marsh Posté le 13-03-2006 à 14:36:44    

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:

Reply

Marsh Posté le 13-03-2006 à 14:36:44   

Reply

Marsh Posté le 13-03-2006 à 14:51:58    

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
Reply

Marsh Posté le 13-03-2006 à 14:59:20    

: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
Reply

Marsh Posté le 13-03-2006 à 20:19:59    

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...

Reply

Marsh Posté le 14-03-2006 à 09:05:57    

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
Reply

Marsh Posté le 14-03-2006 à 09:29:29    

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:

Reply

Marsh Posté le 14-03-2006 à 09:33:52    

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)

Reply

Marsh Posté le 14-03-2006 à 17:28:39    

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:

Reply

Marsh Posté le 14-03-2006 à 19:47:59    

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

Reply

Marsh Posté le 15-03-2006 à 09:24:02    

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 )

Reply

Marsh Posté le 15-03-2006 à 09:24:02   

Reply

Marsh Posté le 15-03-2006 à 15:51:04    

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)

Reply

Marsh Posté le 29-03-2006 à 00:11:23    

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

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed