#sql #vb.net #sql-server-2008 #stored-procedures #declare
#sql #vb.net #sql-server-2008 #хранимые процедуры #объявить
Вопрос:
Я работаю над проектом, который использует хранимую процедуру. Когда я пытаюсь использовать хранимую процедуру в проекте, я получаю эту ошибку:
The formal parameter "@Mode" was not declared as an OUTPUT parameter, but the actual parameter passed in requested output.
Пожалуйста, помогите мне в решении этой проблемы.
Это моя хранимая процедура:
alter PROCEDURE [ITAssets_sp_IT_Assets]
-- Add the parameters for the stored procedure here
(@Mode varchar(12)='ADD',
@ID integer , @AssetCode nvarchar(20)=null, @Description nvarchar(70)=null,
@Site nvarchar(10)=null)
AS
Begin
IF @Mode='ADD'
Begin
Begin Tran
INSERT INTO [IT_Assets]
([ID]
,[AssetCode]
,[Description]
,[Site])
values
(@ID, @AssetCode, @Description, @Site
)
If @@ERROR <> 0
ROLLBACK TRAN
Else
COMMIT TRAN
Select @ID
End
ELSE
Begin
Begin Tran
UPDATE [IT_Assets]
SET
AssetCode = @AssetCode, Description = @Description, Site = @Site
WHERE ID = @ID
If @@ERROR <> 0
ROLLBACK TRAN
Else
COMMIT TRAN
Select @ID
End
End
Я вызываю хранимую процедуру в приведенном ниже коде:
Dim ht As New Hashtable
ht.Add("@Mode", "ADD")
ht.Add("@ID", txtID.Text)
ht.Add("@AssetCode", txtAssetCode.Text)
ht.Add("@Description", txtDescription)
ht.Add("@Site", ddlSite.SelectedValue.ToString())
AppExecuteNonQuery(CommandType.StoredProcedure, "IT_Assets", , ht)
AppExecuteNonQuery код:
Public Shared Function AppExecuteNonQuery(ByVal SQLCommandType As CommandType, ByVal Command As String, Optional ByVal ParamTable As Hashtable = Nothing, Optional ByRef OutputParamTable As Hashtable = Nothing, Optional ByVal UsePrimaryConnection As Boolean = True, Optional ByVal ConnName As String = "", Optional ByVal ConnString As String = "") As Integer
Dim cmd As SqlCommand
Try
If UsePrimaryConnection Then
cmd = AppGetSQLCommand(SQLCommandType, Command, ParamTable, OutputParamTable, AppProperties.ConnectionString, True, UsePrimaryConnection, ConnName, ConnString)
Else
cmd = AppGetSQLCommand(SQLCommandType, Command, ParamTable, OutputParamTable, AppProperties.ConnectionString1, True, UsePrimaryConnection, ConnName, ConnString)
End If
Dim res As Integer = cmd.ExecuteNonQuery
For Each param As SqlParameter In cmd.Parameters
If param.Direction = ParameterDirection.Output Then
OutputParamTable(param.ParameterName) = param.Value
End If
Next
Return res
Finally
If Not cmd Is Nothing Then
If Not cmd.Connection Is Nothing Then
If cmd.Connection.State = ConnectionState.Open Then
cmd.Connection.Close()
End If
End If
End If
End Try
End Function
Комментарии:
1. Как вы вызываете хранимую процедуру?
2. @shree.pat18 отредактированный вопрос
3. И не могли бы вы также поделиться кодом
AppExecuteNonQuery
метода? Ошибка, похоже, указывает на то, что оператор, вызывающий вашу процедуру, имеет проблемы.4. Это может быть стандартизировано, но это не значит, что это не источник ошибки. Ошибка явно указывает на «фактический параметр, переданный в запрошенном выводе» — поэтому нам нужно увидеть код, который генерирует фактические параметры.
5. @Damien_The_Unbeliever ответ отредактирован
Ответ №1:
У вас есть это в вашем коде:
AppExecuteNonQuery(CommandType.StoredProcedure, "IT_Assets", , ht)
Поскольку ht
находится в позиции 4, ей присваивается OutputParamTable
значение, которое добавляет OUTPUT
параметры в хранимую процедуру. Это именно то, что говорится и в сообщении об ошибке.
Чтобы исправить это, переместите ее в позицию 3, т.е.
AppExecuteNonQuery(CommandType.StoredProcedure, "IT_Assets", ht)
Комментарии:
1. Я получил эту ошибку
No mapping exists from object type System.Web.UI.WebControls.TextBox to a known managed provider native type.
2. @7alhashmi — это потому, что вы добавляете
txtDescription
, а неtxtDescription.Text
в качестве@Description
параметра.3. @Damien_The_Unbeliever Спасибо! Я пропустил это.