2012-05-31 84 views
0

我正在使用C#進行wix中的自定義操作,該工作正常。自定義操作本質上只是根據傳遞給方法的參數來運行SQL腳本。針對無效轉換拋出的SqlException

一個我運行腳本來填充我的數據表中的一個,如果有什麼也沒有,看起來是這樣的:

IF (SELECT COUNT(*) FROM [dbo].[Table]) = 0 
BEGIN 

INSERT [dbo].[Table] ([ItemId], [Description]) VALUES (N'<<GUID>>', NULL) 
INSERT [dbo].[Table] ([ItemId], [Description]) VALUES (N'<<GUID>>', N'The 2nd Item') 

... 

END 

在這種情況下<<GUID>>是一樣的東西e00104e4-7e5f-4563-9356-30732d5ca57e - 這些腳本是使用相應版本的Management Studio從SQL Server 2008 R2的數據導出生成的。

當我在Management Studio中運行此腳本時,它工作正常,並且如預期的那樣,如果沒有任何內容已經存在,則會插入所有數據。通過C#代碼運行它,但是,我也得到了以下異常:

Conversion failed when converting from a character string to uniqueidentifier

如表中的唯一uniqueidentifier列,這已經是ITEMID列,但我想不通爲什麼這種情況正在發生,或者如何解決這個問題,最後一小時在線搜索也沒有給出任何結果。

編輯

我要補充一點,這些SQL查詢都位於一個文件,它的C#代碼,然後讀取作爲SQL查詢的內容。如果我能幫上忙,我並不想修改它們,因爲它增加了一個不需要的額外步驟。

+1

你能否通過Profiler工具檢查實際傳遞給數據庫的內容?請粘貼它,所以我們可以進一步調查 – Dave

+0

您需要檢查用於在C#代碼中存儲GUID數據的變量中存在哪些值。該變量是否包含正確的值?並檢查相同的值是通過sql中的參數傳遞給查詢的。 –

回答

0

我已經解決了這個問題。結果發現其中一個腳本已過時,並且的ID表已從nvarchar更改爲uniqueidentifier

然後發生了兩件事,第一件事是沒有人更新填充該表默認數據的腳本。第二個是wix(或運行SQL的自定義動作,我不確定究竟是哪個)在第一個腳本之後報告了錯誤,這恰好具有非常類似的表結構。

所以,總而言之,我應該早點發現問題。相反,我不會這麼做,因此我在SA公司做了一個傻瓜。無論如何,感謝您的答案,希望它們對那些在這個問題上磕磕絆絆的人有用。

1

有在T-SQL轉換函數的uniqueidentifier列 這種嘗試:

INSERT [dbo].[Table] ([ItemId], [Description]) VALUES (CONVERT(uniqueidentifier,N'<<GUID>>'), N'The 2nd Item') 
+0

我剛剛更新了原來的問題,爲什麼這不是我所擁有的理想解決方案。它會正常工作,但我仍然覺得奇怪的是,管理工作室運行相同的SQL沒有問題。 – Joeb454

+0

好吧,似乎沒有辦法將這樣的字符串傳遞迴SQLServer。我試圖找到一種方法告訴SSMS在其輸出腳本中插入一個CONVERT,但沒有成功。可能它認爲腳本是爲了自己的副本而使用的。另一方面,如果uniqueidentifier在SqlCommand中以字符串的形式傳遞,則會失敗並出現提及的錯誤。我想你應該在通過ADO.NET提交你的INSERT到SqlServer之前實現一個轉換。 – Steve

0

有趣的問題。你沒有任何機會使用Visual Studio 2008?您正在使用的驅動程序可能已過時。

+0

不,我正在使用VS 2010,無論如何我已經找出問題所在。我應該也可能考慮早點檢查它......請參閱下面的答案 – Joeb454

相關問題