2016-10-07 37 views
0

我想從2008年vb.net執行一個SQL Server存儲過程,但我得到的錯誤調用SQL Server存儲過程2008錯誤

過程或函數「Sp_Messages_Display」需要參數「 @MsgSno',它沒有提供。

這裏是我的代碼

Public Function Load(ByVal CnnStr As String, ByVal MsgSno As Long, ByVal Msg_Status As eMsgStatus) As ADODB.Recordset 
    Dim Cnn As ADODB.Connection 
    Dim Com As ADODB.Command 
    Cnn = New ADODB.Connection 
    Cnn.CursorLocation = ADODB.CursorLocationEnum.adUseClient 
    Cnn.ConnectionString = CnnStr 
    Cnn.Open() 
    Com = New ADODB.Command 
    Com.ActiveConnection = Cnn 

    With Com 
     .CommandType = ADODB.CommandTypeEnum.adCmdStoredProc 
     .CommandText = "Sp_Messages_Display" 
     .CreateParameter("@MsgSno", ADODB.DataTypeEnum.adBigInt, ADODB.ParameterDirectionEnum.adParamInput, 4, MsgSno) 
     .CreateParameter("@Msg_Status", ADODB.DataTypeEnum.adSmallInt, ADODB.ParameterDirectionEnum.adParamInput, 4, Msg_Status) 
     Load = .Execute(RecordsAffected) 
     SqlError = Err.Description 
    End With 

    If Not Load.EOF Then 
     With Me 
      .MsgSno = Load.Fields("MsgSno").Value 
     End With 
    End If 
    Com.ActiveConnection = Nothing 
    Cnn = Nothing 
End Function 

請幫我在哪裏,我錯了。在此先感謝

+1

旁註:你應該** **不使用'sp_'前綴爲您的ST直接程序。微軟已經保留了這個前綴以供自己使用(參見*命名存儲過程*)](http://msdn.microsoft.com/en-us/library/ms190669%28v=sql.105%29.aspx),以及你將來有可能冒着名字衝突的風險。 [這對你的存儲過程性能也是不利的](http://www.sqlperformance.com/2012/10/t-sql-queries/sp_prefix)。最好只是簡單地避免使用'sp_'並將其他內容用作前綴 - 或者根本沒有前綴! –

+1

您已將此標籤標記爲VB.NET:您最好使用ADO.NET而不是傳統的ADO類型。 – Richard

回答

1

從文檔到CreateParameter

此方法不Parameter對象自動追加到Command對象的參數集合。

您需要將您創建的參數添加到集合中。

+0

我如何追加附加參數..我嘗試了幾次,但沒有工作.. PLZ幫助。謝謝 – srinivasan

2

你需要添加參數Command,則CreateParameter只是沒有將其添加到Command的集合創建一個新的實例:

With Com 
    CommandType = ADODB.CommandTypeEnum.adCmdStoredProc 
    .CommandText = "Sp_Messages_Display" 
    .Parameters.Add("@MsgSno", ADODB.DataTypeEnum.adBigInt, ADODB.ParameterDirectionEnum.adParamInput, 4, MsgSno) 
    .Parameters.Add("@Msg_Status", ADODB.DataTypeEnum.adSmallInt, ADODB.ParameterDirectionEnum.adParamInput, 4, Msg_Status) 
    Load = .Execute(RecordsAffected) 
    SqlError = Err.Description 
End With 

我現在相信你不使用VB.NET,但VB,在這種情況下,這是從MSDN的路要走:

ccmd.parameters.Append ccmd.CreateParameter(, adInteger, adParamReturnValue, , NULL) ' return value 
ccmd.parameters.Append ccmd.CreateParameter("InParam", adVarChar, adParamInput, 20, "hello world") ' input parameter 
ccmd.parameters.Append ccmd.CreateParameter("OutParam", adVarChar, adParamOuput, 20, NULL) ' output parameter 
+0

我如何追加附加參數..我嘗試了幾次,但沒有工作.. PLZ的幫助。謝謝 – srinivasan

+0

@srinivasan不知道你的意思;如果你像上面的例子那樣調用Command.Parameters.Add,它們應該被追加到Command中,並且它已經準備好執行了。 –

+0

如果您想先創建一個參數然後附加它,您可以使用'CreateCommand',將結果存儲在一個變量中,然後使用'Parameter.Add'重載將其添加到'Parameter'對象中。 –