2017-05-31 63 views
4

我試圖Visual Studio 2010中另一個沒有爲一個或多個必需參數問題

我在運行時創建一個選擇查詢應返回1行中在VB中取出數據的訪問數據庫的給定值。然後我從返回的行中收集數據並將其放置在屏幕上。

此生成該查詢的代碼。

Dim ls_querystring as string 

ls_querystring = "SELECT Horses.Name, " 
ls_querystring = ls_querystring & "Horses.Horseid, " 
ls_querystring = ls_querystring & "Horses.Regno, " 
ls_querystring = ls_querystring & "Horses.HorseType, " 
ls_querystring = ls_querystring & "Horses.Sex, " 
ls_querystring = ls_querystring & "Horses.Colour, " 
ls_querystring = ls_querystring & "Horses.Ownerid, " 
ls_querystring = ls_querystring & "Horses.Notes, " 
ls_querystring = ls_querystring & "Horses.Sireno, " 
ls_querystring = ls_querystring & "Horses.Damno, " 
ls_querystring = ls_querystring & "Horses.Birthdate, " 
ls_querystring = ls_querystring & "Horses.DNA, " 
ls_querystring = ls_querystring & "Horses.Inscribe, " 
ls_querystring = ls_querystring & "Horses.Revised, " 
ls_querystring = ls_querystring & "Horses_1.Name as SireName, " 
ls_querystring = ls_querystring & "Horses_2.Name as DamName, " 
ls_querystring = ls_querystring & "Horses.IMAGE, " 
ls_querystring = ls_querystring & "Associates.Name1 as Breeder " 
ls_querystring = ls_querystring & " FROM ((Horses INNER JOIN Horses AS 
Horses_1 ON Horses.Sireno = Horses_1.Regno) INNER JOIN Horses AS Horses_2 " 
ls_querystring = ls_querystring & " ON Horses.Damno = Horses_2.Regno) INNER 
JOIN Associates ON Horses.Breederid = Associates.AssocID " 
ls_querystring = ls_querystring & " WHERE Horses.Regno = " 
& Chr(34) & ls_RegNo & Chr(34) 

變量ls_Regno被定義爲一個字符串,並且在創建ls_querystring時具有一個值。

在運行此ls_querystring包含:

SELECT Horses.Name, Horses.Horseid, Horses.Regno, Horses.HorseType, 
Horses.Sex, Horses.Colour, Horses.Ownerid, 
Horses.Notes, Horses.Sireno, Horses.Damno, Horses.Birthdate, Horses.DNA, 
Horses.Inscribe, 
Horses.Revised, Horses_1.Name as SireName, Horses_2.Name as DamName, 
Horses.IMAGE, 
Associates.Name1 as Breeder 
FROM ((Horses INNER JOIN Horses AS Horses_1 ON Horses.Sireno = 
Horses_1.Regno) 
INNER JOIN Horses AS Horses_2 ON Horses.Damno = Horses_2.Regno) 
INNER JOIN Associates ON Horses.Breederid = Associates.AssocID 
WHERE Horses.Regno = "SO0324" 

如果我運行這個反對它返回預期單列Access數據庫。

但是,當我將它包含在下面的代碼中時,它會失敗, 在da.Fill(datat)語句中沒有給出一個或多個必需參數問題消息的值。

Dim cn As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=e:\Web\horsebook.mdb") 
Dim datat As New DataTable 
Dim da As New OleDbDataAdapter(ls_querystring, cn) 

da.Fill(datat) 
da.Dispose() 
cn.Dispose() 

如果我更換由ls_querystring進程與良性腳本生成的查詢,如「選擇從馬*」它的工作原理沒有問題。所以看起來問題出現在查詢生成中,但是如果只是在訪問中運行,那麼它會按預期工作,這使我感到困惑。

所以這樣看來,有是訪問接受並通過一個OleDbDataAdapter提交到同一個數據庫查詢之間的脫節。

我會很感激,如果任何人都可以看到我的方式錯誤。

謝謝

+0

難道是因爲在使用'Fill()'時缺少參數嗎? [MSDN](https://msdn.microsoft.com/en-us/library/system.data.common.dataadapter.fill(v = vs.110).aspx)不顯示只接受數據表。另外,確保一切都是[拼寫正確並且正確的情況](https://stackoverflow.com/questions/2378763/no-value-given-for-one-or-more-required-parameters?rq=1)。也許你在SELECT中拼寫錯誤的列名引用。 –

+2

'.Name' - 名稱是保留字,請嘗試使用'。[Name]'或(更好)避免此列名稱。這也可能適用於'.IMAGE'。 – Andre

+3

P.S. +1包含實際生成的SQL,所以很少有人在提出有關動態SQL的問題時這樣做。 – Andre

回答

0

感謝您的所有建議。我花了最後4個小時嘗試你的每一個建議。在回答Timothy G時,我在這個應用程序的其他地方使用了完全相同的語法,並且對fill()語句的語法感到滿意。

在回答安德烈的評論我已經使用了名字和形象在應用程序的其他部分並沒有問題與此有關。我已經更改了這些字段的名稱,但我仍然遇到問題。

我在XMLliterals簡單的介紹一下,我猜你是它的什麼最舒服。這是我創建15年的運行時間查詢的方式,所以我想很難教老狗新的技巧。我不得不不同意它使你的SQL更具可讀性。我在日常工作中遇到XML代碼,我發現它非常冗長,並且通常使簡單任務過於複雜。我們只好同意不同意:)

要切成我已經找到了問題的追逐,這是我的錯。這歸結於Timothy G提出的一個簡單的拼寫問題,因爲我對一個數據庫運行應用程序,並針對同一數據庫的副本測試查詢。

這是罪魁禍首

Associates.Name1 as Breeder 

它應該是

Associates.FamilyName as Breeder 

再次三江源所有。

Peter

+1

...頑固。 :)不過,我建議使用'。[Name]'來避免任何潛在的問題。 – Andre

+0

我已經。謝謝彼得 – destino

相關問題