2013-08-22 11 views
8

aggiornamento molto semplice a un database postgresql, e non funziona. L'istruzione sql select va bene e restituisce i valori corretti.Perché ricevo un "riferimento cross-database non implementato"?

E 'quando ottengo all'aggiornamento, si genera l'errore:

{"ERROR [0A000] ERROR: cross-database references are not implemented: "openerp.public.product_template"; Error while executing the query"}. 

sto usando vb.net e PostgreSQL 9.2.

Tutto quello che voglio fare è cambiare il campo del nome in modo che corrisponda a quello che è nella descrizione.

log: 
LOG 0 duration: 34.000 ms statement: SELECT * FROM product_template where import_date = '08/22/2013' 
LOG 0 duration: 11.000 ms statement: select n.nspname, c.relname, a.attname, a.atttypid, t.typname, a.attnum, a.attlen, a.atttypmod, a.attnotnull, c.relhasrules, c.relkind, c.oid, d.adsrc from (((pg_catalog.pg_class c inner join pg_catalog.pg_namespace n on n.oid = c.relnamespace and c.oid = 20496) inner join pg_catalog.pg_attribute a on (not a.attisdropped) and a.attnum > 0 and a.attrelid = c.oid) inner join pg_catalog.pg_type t on t.oid = a.atttypid) left outer join pg_attrdef d on a.atthasdef and d.adrelid = a.attrelid and d.adnum = a.attnum order by n.nspname, c.relname, attnum 
LOG 0 duration: 12.000 ms parse _PLAN000000001D2CFB60: SELECT * FROM product_template where import_date = '08/22/2013' 
LOG 0 duration: 11.000 ms statement: select ta.attname, ia.attnum, ic.relname, n.nspname, tc.relname from pg_catalog.pg_attribute ta, pg_catalog.pg_attribute ia, pg_catalog.pg_class tc, pg_catalog.pg_index i, pg_catalog.pg_namespace n, pg_catalog.pg_class ic where tc.oid = 20496 AND tc.oid = i.indrelid AND n.oid = tc.relnamespace AND i.indisprimary = 't' AND ia.attrelid = i.indexrelid AND ta.attrelid = i.indrelid AND ta.attnum = i.indkey[ia.attnum-1] AND (NOT ta.attisdropped) AND (NOT ia.attisdropped) AND ic.oid = i.indexrelid order by ia.attnum 
LOG 0 duration: 0.000 ms statement: select current_schema() 
LOG 0 duration: 1.000 ms statement: select c.relhasrules, c.relkind, c.relhasoids from pg_catalog.pg_namespace u, pg_catalog.pg_class c where u.oid = c.relnamespace and c.relname = 'product_template' and u.nspname = 'public' 
LOG 0 duration: 1.000 ms statement: select c.relhasrules, c.relkind, c.relhasoids from pg_catalog.pg_namespace u, pg_catalog.pg_class c where u.oid = c.relnamespace and c.relname = 'product_template' and u.nspname = 'public' 
ERROR 0A000 cross-database references are not implemented: "openerp.public.product_template" 

Il codice:

Private Sub btnChgNameToDescr_Click(sender As Object, e As EventArgs) Handles btnChgNameToDescr.Click 

    Dim objConn As New System.Data.Odbc.OdbcConnection 
    Dim objCmd As New System.Data.Odbc.OdbcCommand 
    Dim dtAdapter As New System.Data.Odbc.OdbcDataAdapter 
    Dim ds As New DataSet 

    Me.Cursor = System.Windows.Forms.Cursors.WaitCursor 

    Dim strConnString As String 
    Dim strSQL As String 
    Dim iRecCount As Integer 

    Me.Cursor = System.Windows.Forms.Cursors.WaitCursor 

    If objConn.State = ConnectionState.Open Then 
     'do nothing 
    Else 
     strConnString = "Dsn=PostgreSQL35W;database=OpenERP;server=localhost;port=5432;uid=openpg;pwd=openpgpwd" 
     objConn.ConnectionString = strConnString 
     objConn.Open() 
    End If 


    If Me.txtImportDate.Text = "" Then 
     MsgBox("Import Date field cannot be blank.") 
     Exit Sub 
    End If 

    Dim str_import_date As String = Me.txtImportDate.Text 


    strSQL = "SELECT * FROM product_template where import_date = " & "'" & str_import_date & "'" 

    dtAdapter.SelectCommand = objCmd 

    With objCmd 
     .Connection = objConn 
     .CommandText = strSQL 
     .CommandType = CommandType.Text 
     .ExecuteNonQuery() 

     dtAdapter.Fill(ds, "product_template") 

     iRecCount = ds.Tables("product_template").Rows.Count 

    End With 

    If iRecCount = 0 Then 
     MsgBox("No records found.") 
     Me.Cursor = System.Windows.Forms.Cursors.Default 
     Exit Sub 
    End If 


    Dim cb As New Odbc.OdbcCommandBuilder(dtAdapter) 


    'change the name field to item_description 
    With ds 
     For i As Integer = 0 To .Tables("product_template").Rows.Count - 1 

      'this works, returns a string 
      Dim str_default_code As String = (.Tables(0).Rows(i).Item("name").ToString) 
      'this works 
      Dim str_item_description As String = (.Tables(0).Rows(i).Item("description").ToString) 

      .Tables("product_template").Rows(i).Item("name") = str_item_description 
      'setting the variable doesn't work either - Dim str_item_description As String = "BH LITE BRT" 

      'this throws the error 
      dtAdapter.Update(ds, "product_template") 

     Next 
    End With 

    Me.Cursor = System.Windows.Forms.Cursors.Default 
End Sub 
+0

Non so se questo è il tuo problema, ma che ExecuteNonQuery() nel mezzo del tuo codice non è necessario per una query SELECT – Steve

+1

Di solito indica un identificatore non quotato con più di un punto che verrebbe interpretato come 'db .schema.table' di Postgres che fa scattare detta eccezione. Troverò immediatamente la causa osservando il * file di registro del server db * in cui è documentata l'effettiva dichiarazione illegale e il messaggio di errore con le impostazioni di registrazione predefinite. –

+0

@ErwinBrandstetter come un 'str_import_date = 22.08.2013'. La concatenazione delle stringhe troverà sempre un modo per darti un calcio, stasera – Steve

risposta

1

cercare gli errori presenti nel registro di PostgreSQL per vedere cosa c'è in realtà sempre inviato al db. Non so come correggere il tuo codice perché non conosco molto bene questa piattaforma. Inoltre, è necessario passare a query parametrizzate poiché l'approccio corrente sarà soggetto a problemi di injection SQL.

Tuttavia, l'errore indica che si dispone di uno spazio dei nomi aggiuntivo. Lo spazio dei nomi normale è schema.table.column o schema.table a seconda del contesto. Se provi a specificare una tabella come schema.table.column, leggerà questo come database.schema.table e genererà questo errore. Allo stesso modo, se si dispone di un punto in più, è possibile specificare accidentalmente database.schema.table.column (che genererebbe anche l'errore).

questo è parte di un motivo per cui SQL con stringhe è davvero una cattiva idea, ma in realtà non graffia la superficie del problema.

Problemi correlati