none
messagio record troppo lungo in fase di creazione di una tabella in System.Data.OleDb RRS feed

  • Domanda

  • Help !!! ho bisogno di aiuto sto cercando di creare una tabella con i relativi campi ma mi da un messaggio di errore  : record troppo lungo ,

    Dove sbaglio?

     cm.CommandText = "CREATE TABLE [TabellaEMail] ([IDCodice] LONG IDENTITY (1,1) PRIMARY KEY," & _
             "[Nominativo] nchar(255), " & _
            "[E-Mail] nchar(255), " & _
            "[Data Invio] date , " & _
                   "[Conferma] logical , " & _
              "[Data Ricezione] date, " & _
              "[Oggetto] nchar(255), " & _
              "[Testo] nchar(255), " & _
            "[Allegato]nchar(255), " & _
            "[Archivio] nchar(3), " & _
            "[IDCorrelazione] long  , " & _
            "[Condominio] nchar(255), " & _
            "[IndirizzoCondominio] nchar(255), " & _
            "[CapCondominio] nchar(255), " & _
            "[IDInvio] nchar(255), " & _
            "[IDRicezione] nchar(255), " & _
            "[ID] nchar(255), " & _
            "[Oggetto Risposta] nchar(255), " & _
            "[Testo Risposta] nchar(255), " & _
            "[Memo] nchar(255) )"

    p.s. arrivo da vb6 il  campo memo  è possibile solo con longvarchar ?

    Ringrazio per l'attenzione


    Graziella

    domenica 15 aprile 2012 18:27

Tutte le risposte

  • Che database stai utilizzando? Se stai usando SQL Server, I tipi LONG e LOGICAL non esistono.

    Sempre nel caso che tu stia utilizzando SQL Server, ti consiglio di usare il tipo NVARCHAR invece di NCHAR, in modo il campo sia a lunghezza variabile: http://msdn.microsoft.com/it-it/library/ms186939.aspx.

    p.s. arrivo da vb6 il campo memo è possibile solo con longvarchar ?

    Se ti riferisci a campi di testo di lunghezza arbitraria (fino a 2 GB), devi utilizzare il tipo VARCHAR(MAX). Ti consiglio di dare un'occhiata ai tipi di dati disponibili in SQL Server: http://msdn.microsoft.com/it-it/library/ms187752.aspx.


    Marco Minerva [MCPD]
    Blog: http://blogs.ugidotnet.org/marcom
    Twitter: @marcominerva

    domenica 15 aprile 2012 18:47
  • il database che uso  è ancora MDB. Devo necessariamente creare delle tabelle ed ho la necessità di record che hanno ancora più campi di quello esposto sopra.

    Spero possiate aiutarmi.


    Graziella

    lunedì 16 aprile 2012 07:02
  • La lunghezza complessiva dei campi del tuo record supera il massimo consentito da Access. Ad esempio, hai ben 12 campi char di lunghezza fissa a 255 caratteri, quindi solo essi occupano circa 3 KB, mentre la definizione di una tabella non può superara i 2 KB.

    La prima cosa che devi fare è trasformare i campi in lunghezza variabile, usando il tipo VARCHAR. Poi, vedo che hai dei campi con nome ID..., che quindi farebbero pensare a identificativi o chiavi esterne: tu li hai definiti come testuali, mentre solitamente per le relazioni si usando gli INT. Inoltre, dovresti normalizzare la tabella: ad esempio, hai i tre campi Condiminio, IndirizzoCondominio e CapCondominio: al posto di essi, è preferibile usare una chiave esterna che punta ad un'altra tabella in cui hai l'anagrafica dei condomini, per evitare di ripetere le stesse informazioni in tutti i record.


    Marco Minerva [MCPD]
    Blog: http://blogs.ugidotnet.org/marcom
    Twitter: @marcominerva

    lunedì 16 aprile 2012 07:48
  •  i nomi dei campi sono solo un esempio . Comunque con VB6 questo limite non esiste ho tabelle  che contengono molti più campi anche memo e non da errore

     praticamente in net non   prevede una tabella lunga più di 3 kb ?

    ringrazio


    Graziella

    lunedì 16 aprile 2012 13:46
  • Il problema non è .NET, è Access... Prova a copiare la query che hai scritto in Access (dopo averla adattata per farla funzionare), e vedrai che otterrai lo stesso errore, così ti renderai conto che non si tratta di una limitazione di .NET.

    I campi MEMO sono un caso a parte, perché in realtà la loro definizione occupa (se non ricordo male), 16 byte, che rappresenta un puntatore alle informazioni vere e proprie. Di campi MEMO, quindi, ne puoi avere più di un centinaio, senza problemi.

    In tutto questo discorso, fai attenzione ad una cosa molto importante: non ho detto che una una tabella non può essere lunga più di 3 KB, ma solo che la sua DEFINIZIONE (ovvero la dimensione dei suoi campi, calcolata sommando l'occuzione dei tipi di dato) non può esserlo.


    Marco Minerva [MCPD]
    Blog: http://blogs.ugidotnet.org/marcom
    Twitter: @marcominerva

    lunedì 16 aprile 2012 14:01
  • forse non mi sono spiegata bene la stessa

    tabella creata in vb6 ( non adopero access ne query) non da problemi ho copiato la tabella creata in vb6 adattandola a .net che è descritta sopra

    probabilmente sbaglio qualcosa,

    spero possiate essermi d'aiuto anche per definire dbmemo in ado .... Ringrazio

    tabella creata  in vb6

    Set tabella = db.CreateTableDef("" & nometabella & "")
    Set campo(0) = tabella.CreateField("IDCodice", dbLong)
    Set campo(1) = tabella.CreateField("Nominativo", dbText, 255)
    Set campo(2) = tabella.CreateField("E-mail", dbText, 255)
    Set campo(3) = tabella.CreateField("Data Invio", dbDate)
    Set campo(4) = tabella.CreateField("Conferma", dbBoolean)
    Set campo(5) = tabella.CreateField("Data Ricezione", dbDate)
    Set campo(6) = tabella.CreateField("Oggetto", dbMemo)
    Set campo(7) = tabella.CreateField("Testo", dbMemo)
    Set campo(8) = tabella.CreateField("Allegato", dbMemo)
    Set campo(9) = tabella.CreateField("archivio", dbText, 3)
    Set campo(10) = tabella.CreateField("IDCorrelazione", dbLong)
    Set campo(11) = tabella.CreateField("Condominio", dbText, 255)
    Set campo(12) = tabella.CreateField("IndirizzoCondominio", dbText, 255)
    Set campo(13) = tabella.CreateField("localitaCondominio", dbText, 255)
    Set campo(14) = tabella.CreateField("CapCondominio", dbText, 255)
    Set campo(15) = tabella.CreateField("IDInvio", dbText, 255)
    Set campo(16) = tabella.CreateField("IDRicezione", dbText, 255)
    Set campo(17) = tabella.CreateField("ID", dbText, 255)
    Set campo(18) = tabella.CreateField("Oggetto Risposta", dbMemo)
    Set campo(19) = tabella.CreateField("Testo Risposta", dbMemo)
    Set campo(20) = tabella.CreateField("memo", dbMemo)

    For i = 0 To 20
    tabella.Fields.Append campo(i)
    Next i
    Set Au_Id(0) = tabella.CreateIndex()
    Au_Id(0).Name = "IDCodice"

    Au_Id(0).Primary = True
    Au_Id(0).Unique = False

    Set campiIndice(0) = Au_Id(0).CreateField("IDCodice")

    Au_Id(0).Fields.Append campiIndice(0)
    tabella.Indexes.Append Au_Id(0)

    Set Au_Id(1) = tabella.CreateIndex()
    Au_Id(1).Name = "IDCorrelazione"

    Au_Id(1).Primary = False
    Au_Id(1).Unique = False

    Set campiIndice(1) = Au_Id(1).CreateField("IDCorrelazione")
    Au_Id(1).Fields.Append campiIndice(1)
    tabella.Indexes.Append Au_Id(1)

     db.TableDefs.Append tabella
    db.Close 


    Graziella

    lunedì 16 aprile 2012 17:32
  • Ti avevo suggerito di provare direttamente con Access per farti capire che il problema non è .NET, ma il modo in cui hai creato la query. Il codice che hai mostrato, infatti, chiarisce l'inghippo: in VB6 e in .NET stai dichiarando la tabella usando, per i campi, tipi di dati diversi.

    In VB6, stai utilizzando campi MEMO, la cui definizione come ti ho detto occupa 16 Byte. Al contrario, con VB .NET, hai dichiarato quegli stessi campi sono CHAR(255), e quindi hanno un'occupazione 15 volte più grande.

    Poi, non conosco molto bene ADO, ma potrebbe darsi che i campi che, in VB6, hai dichiarato come dbText, 255, in realtà nel database vengano definiti come campi a lunghezza variabile. Invece, in .NET, stai usando una dimensione fissa.

    Per dichiarare un campo MEMO, ti basta specificare questo tipo di dato. Ad esempio:

    "[Testo] MEMO, " & _
     


    Marco Minerva [MCPD]
    Blog: http://blogs.ugidotnet.org/marcom
    Twitter: @marcominerva

    lunedì 16 aprile 2012 17:41