2011-11-10 54 views
3

我正在使用PowerBuilder 12 Classic DataWindow將新記錄插入到具有標識列的SQL Server 2008數據庫表中。在插入之後,我想獲取用於其他表格的標識列的值。PowerBuilder:在插入到Sql Server表後獲取標識值

在我pbodb120.ini下[MS_SQLSERVER_SYNTAX]我已經改變了GetIndentity行這樣的:

GetIdentity='Select IDENT_CURRENT (''&TableName'')' 

我的代碼看起來像這樣(文檔ID是標識列):

dw_document_add.update(true, true) 

li_docid = dw_document_add.getitemnumber(dw_document_add.getrow(), "docid") 

麻煩在於,似乎只有一半的時間返回身份。我認爲這可能是一個時間問題。 (記錄正在插入到數據庫中。)

有沒有什麼辦法可以確保每次都能獲得身份?

UPDATE

我已經添加標識=「@@ IDENTITY」我的連接字符串,它似乎是現在的工作。但我不確定是否需要在pbodbxxx.ini文件中。

回答

4

最好的建議是不要試圖推倒重來; DataWindow已經做到了這一點。在DataWindow畫家中,進入行/更新屬性,在底部你會看到標識列。選擇您的身份列(它需要在您的SQL語句中),PB將在INSERT後檢索身份值。

祝你好運,

特里。

+0

我已經做到了。我將Identity列設置爲docid,但它仍然只在大約一半的時間內填充它。記錄總是進入數據庫,但是docid不會返回到datawindow列中。 – Slapout

+0

觸發器正在執行的失敗情況的任何機會,將用於檢索值的變量廢除?我從來沒有與SQL Server 2008有任何問題,所以它可能值得尋找一些特定的環境。 – Terry

+0

現在,我正在重讀的啞巴問題:您使用ODBC而不是本機驅動程序的任何特定原因?你是否有與本地驅動程序相同的問題? ODBC驅動程序可能是獲取身份值的方式;我有ODBC驅動程序做得更糟! – Terry

1

而且我也不相信GETROW()調用。

應該已經在你插入DW排本地變量中的行數,否則你不會有所有SetItem一個適當的參數()調用肯定preceeded更新()調用。

0

我使用PB 11.5和MSSQL 2005.

我使用SQL SNC驅動程序進行連接。我總是將identity=SCOPE_IDENTITY()添加到我的連接字符串中。

如果您使用@@identity如果您的應用程序是多用戶,則可能會遇到麻煩。另外,如果可能的話,我建議您使用存儲過程數據窗口更新。我將我的標識列標記爲OUTPUT參數。在存儲過程中,我在INSERT子句之後調用SELECT @id_column = SCOPE_IDENTITY()。我從來沒有遇到過麻煩。