2010-06-30 70 views
0

我有這樣的查詢:在ASP(VBS)ADO LIKE查詢

SELECT TaFellesVaktjournal.*, TaBygg.ByggNavn 
FROM TaFellesVaktjournal LEFT JOIN TaBygg ON 
TaFellesVaktjournal.VaktFellesByggNavnId = 
TaBygg.ByggBudsjtilstEiendom WHERE VaktjFellesDato 
>= @dtfr AND VaktjFellesDato <= @dttl AND (VaktFellesSak 
= @sok OR VaktjFellesHendelse = @sok) ORDER BY 
VaktjFellesDato DESC, VaktjFellesTid DESC 

不過,我得到指出的錯誤No value given for one or more required parameters.。 我爲@dtfr,@dttl和@sok指定了值。此外,如果我將包含@sok的部分(@dttl後的所有內容)移除到ORDER BY,則錯誤消失。

我已經讓舒爾指定了sok的值,並且它不是空的。我甚至試過指定2個名爲sok的參數(因爲它們是兩個地方)。任何人都知道我可以做到這一點?

我用它來創建參數的代碼如下:

Dim conn, cmd, param 
set cmd = server.createobject("adodb.command") 
set param = server.createobject("adodb.parameter") 
set param = cmd.createparameter("@sok", adVarChar, adParamInput, 255, sok) 
cmd.parameters.append param 
+0

你確定這個類型(adVarChar)嗎? – Fionnuala 2010-06-30 08:31:35

+0

另外,不要指定255作爲長度,而要做len(sok)。您也可以在1行代碼中添加參數。這是我總是這樣做的:AdoCmd.Parameters.Append AdoCmd.CreateParameter(「@ name」,adVarChar,adParamInput,Len(Name),Name) – Rob 2010-06-30 08:39:47

+0

是的,adVarChar是正確的。我知道你可以在一行中做到這一點,但我寧願添加一個函數,該函數需要cmd,名稱,類型,長度和值,並且這會對我產生影響。我覺得它更容易閱讀:) – Alxandr 2010-06-30 08:42:52

回答

0

它適用於類似於存儲過程的「正常」sql語句。你必須將命令對象的CommandType屬性設置爲「正常」sql語句的adCmdText,並且你必須使用q questionmark「?」。而不是參數名稱。

你不需要刷新方法ado會自動爲你做。 (它只對存儲過程有用)

dim sql 
dim cmd : set cmd = server.createObject("ADODB.Command") 
dim param, rs 

sql = "SELECT TaFellesVaktjournal.*, TaBygg.ByggNavn" &_ 
     " FROM TaFellesVaktjournal" &_ 
     " LEFT JOIN TaBygg ON TaFellesVaktjournal.VaktFellesByggNavnId = TaBygg.ByggBudsjtilstEiendom" &_ 
     " WHERE VaktjFellesDato >= ?" &_ 
     " AND VaktjFellesDato <= ?" &_ 
     " AND (VaktFellesSak= ? OR VaktjFellesHendelse = ?)" &_ 
     " ORDER BY VaktjFellesDato DESC, VaktjFellesTid DESC" 

cmd.ActiveConnection = conn 
cmd.CommandType = adCmdText 

set param = cmd.CreateParameter("dtfr", adVarChar, , 255, dtfr) 
cmd.Parameters.Append param 

set param = cmd.CreateParameter("dtfr2", adVarChar, , 255, dtfr) 
cmd.Parameters.Append param 

set param = cmd.CreateParameter("dttl", adVarChar, , 255, dttl) 
cmd.Parameters.Append param 

set param = cmd.CreateParameter("sok", adVarChar, , 255, sok) 
cmd.Parameters.Append param 

cmd.CommandText = sql 

set rs = cmd.execute 

set param = nothing 
set cmd = nothing 
0

您可以嘗試使用填充刷新命令參數採集。

Set cmd.ActiveConnection = oConn 
oCmd.CommandType=adCmdStoredProc 
oCmd.CommandText="ap_Your_spName" 
oCmd.Parameters.Refresh 
oCmd.Parameters("@dtfr") = dtfr 
oCmd.Parameters("@dttl") = dttl 
oCmd.Parameters("@sok") = sok 
oCmd.Execute 

會招致往返服務器,但現代計算機應該應付它!

+0

首先它不是一個存儲過程,所以這項工作?其次,oCmd.Parameters.Refresh究竟做了什麼?是否在查詢中查找所需的參數?第三,如果是這樣,我能否以某種方式打印該列表? – Alxandr 2010-07-01 07:30:44

+0

你是怎麼調用SQL的? 刷新調用SQL Server數據庫,並枚舉存儲過程所需的所有參數。 – Simmo 2010-07-01 12:49:09