2013-08-22 31 views
8

Bir postgresql veritabanına çok basit bir güncelleştirme ve çalışmıyor. Sql select deyimi düzgün ve doğru değerleri döndürür. Ben VB.NET ve postgresql 9.2 kullanıyorumNeden "çapraz veritabanı başvurusu yapılmıyor" alıyorum?

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

:

i güncelleme almak zaman, öyle hata atar.

Ben Tek istediğim açıklamasında Whats eşleşecek şekilde adı alanını değiştirmektir.

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" 

kodu: aslında db yollanmaktan neler olduğunu görmek için postgresql günlüğüne hatalar için

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

bu sorunu olduğunu, ancak kod ortasında o ExecuteNonQuery() bir SELECT sorgusu için gerekli değilse bilmiyorum – Steve

+1

Genellikle db 'olarak yorumlanır birden fazla nokta ile bir tırnaksız tanımlayıcı belirtir Postgres tarafından istisnai tetikleyen .schema.table'. Nedeni, * db server log dosyasına * bakarak, fiili rahatsız edici ifadenin, varsayılan kayıt ayarları ile birlikte hata mesajıyla birlikte belgelendiğini görüyorum. –

+0

@ErwinBrandstetter, bir "str_import_date = 22.08.2013" gibi. O ExecuteNonQuery bir hataydı, ama sorun erwin - - dize birleştirme her zaman – Steve

cevap

1

bak. Kodunuzu nasıl düzelteceğimi bilmiyorum çünkü bu platformu çok iyi bilmiyorum. Ayrıca, mevcut yaklaşımınız sql enjeksiyon sorunlarına tabi olacağından parametreli sorgulara geçmeniz gerekir.

Ancak, hata ekstra ad var demektir. Normal ad alanı, içeriğe bağlı olarak schema.table.column veya schema.table şeklindedir. Bir tabloyu schema.table.column olarak belirtmeye çalışırsanız, bunu database.schema.table olarak okuyacak ve bu hatayı atacaktır. Benzer şekilde, fazladan bir noktanız varsa, database.schema.table.column'u (bu da hatayı atmak için) belirtebilirsiniz.

bu dizgelenmiş SQL gerçekten kötü bir fikir yeni bir sebep parçası olmakla birlikte, gerçekten sorunun yuzeysel etmez.

İlgili konular