Ошибка which was not supplied

I come across similar problem while calling stored procedure

CREATE PROCEDURE UserPreference_Search
    @UserPreferencesId int,
    @SpecialOfferMails char(1),
    @NewsLetters char(1),
    @UserLoginId int,
    @Currency varchar(50)
AS
DECLARE @QueryString nvarchar(4000)

SET @QueryString = 'SELECT UserPreferencesId,SpecialOfferMails,NewsLetters,UserLoginId,Currency FROM UserPreference'
IF(@UserPreferencesId IS NOT NULL)
BEGIN
SET @QueryString = @QueryString + ' WHERE UserPreferencesId = @DummyUserPreferencesId';
END

IF(@SpecialOfferMails IS NOT NULL)
BEGIN
SET @QueryString = @QueryString + ' WHERE SpecialOfferMails = @DummySpecialOfferMails';
END

IF(@NewsLetters IS NOT NULL)
BEGIN
SET @QueryString = @QueryString + ' WHERE NewsLetters = @DummyNewsLetters';
END

IF(@UserLoginId IS NOT NULL)
BEGIN
SET @QueryString = @QueryString + ' WHERE UserLoginId = @DummyUserLoginId';
END

IF(@Currency IS NOT NULL)
BEGIN
SET @QueryString = @QueryString + ' WHERE Currency = @DummyCurrency';
END

EXECUTE SP_EXECUTESQL @QueryString
                     ,N'@DummyUserPreferencesId int, @DummySpecialOfferMails char(1), @DummyNewsLetters char(1), @DummyUserLoginId int, @DummyCurrency varchar(50)'
                     ,@DummyUserPreferencesId=@UserPreferencesId
                     ,@DummySpecialOfferMails=@SpecialOfferMails
                     ,@DummyNewsLetters=@NewsLetters
                     ,@DummyUserLoginId=@UserLoginId
                     ,@DummyCurrency=@Currency;

Which dynamically constructing the query for search I was calling above one by:

public DataSet Search(int? AccessRightId, int? RoleId, int? ModuleId, char? CanAdd, char? CanEdit, char? CanDelete, DateTime? CreatedDatetime, DateTime? LastAccessDatetime, char? Deleted)
    {
        dbManager.ConnectionString = ConfigurationManager.ConnectionStrings["MSSQL"].ToString();
        DataSet ds = new DataSet();
        try
        {
            dbManager.Open();
            dbManager.CreateParameters(9);
            dbManager.AddParameters(0, "@AccessRightId", AccessRightId, ParameterDirection.Input);
            dbManager.AddParameters(1, "@RoleId", RoleId, ParameterDirection.Input);
            dbManager.AddParameters(2, "@ModuleId", ModuleId, ParameterDirection.Input);
            dbManager.AddParameters(3, "@CanAdd", CanAdd, ParameterDirection.Input);
            dbManager.AddParameters(4, "@CanEdit", CanEdit, ParameterDirection.Input);
            dbManager.AddParameters(5, "@CanDelete", CanDelete, ParameterDirection.Input);
            dbManager.AddParameters(6, "@CreatedDatetime", CreatedDatetime, ParameterDirection.Input);
            dbManager.AddParameters(7, "@LastAccessDatetime", LastAccessDatetime, ParameterDirection.Input);
            dbManager.AddParameters(8, "@Deleted", Deleted, ParameterDirection.Input);
            ds = dbManager.ExecuteDataSet(CommandType.StoredProcedure, "AccessRight_Search");
            return ds;
        }
        catch (Exception ex)
        {
        }
        finally
        {
            dbManager.Dispose();
        }
        return ds;
    }

Then after lot of head scratching I modified stored procedure to:

ALTER PROCEDURE [dbo].[AccessRight_Search]
    @AccessRightId int=null,
    @RoleId int=null,
    @ModuleId int=null,
    @CanAdd char(1)=null,
    @CanEdit char(1)=null,
    @CanDelete char(1)=null,
    @CreatedDatetime datetime=null,
    @LastAccessDatetime datetime=null,
    @Deleted char(1)=null
AS
DECLARE @QueryString nvarchar(4000)
DECLARE @HasWhere bit
SET @HasWhere=0

SET @QueryString = 'SELECT a.AccessRightId, a.RoleId,a.ModuleId, a.CanAdd, a.CanEdit, a.CanDelete, a.CreatedDatetime, a.LastAccessDatetime, a.Deleted, b.RoleName, c.ModuleName FROM AccessRight a, Role b, Module c WHERE a.RoleId = b.RoleId AND a.ModuleId = c.ModuleId'

SET @HasWhere=1;

IF(@AccessRightId IS NOT NULL)
    BEGIN
        IF(@HasWhere=0) 
            BEGIN
                SET @QueryString = @QueryString + ' WHERE a.AccessRightId = @DummyAccessRightId';
                SET @HasWhere=1;
            END
        ELSE                SET @QueryString = @QueryString + ' AND a.AccessRightId = @DummyAccessRightId';
    END

IF(@RoleId IS NOT NULL)
    BEGIN
        IF(@HasWhere=0)
            BEGIN   
                SET @QueryString = @QueryString + ' WHERE a.RoleId = @DummyRoleId';
                SET @HasWhere=1;
            END
        ELSE            SET @QueryString = @QueryString + ' AND a.RoleId = @DummyRoleId';
    END

IF(@ModuleId IS NOT NULL)
BEGIN
    IF(@HasWhere=0) 
            BEGIN   
                SET @QueryString = @QueryString + ' WHERE a.ModuleId = @DummyModuleId';
                SET @HasWhere=1;
            END
    ELSE SET @QueryString = @QueryString + ' AND a.ModuleId = @DummyModuleId';
END

IF(@CanAdd IS NOT NULL)
BEGIN
    IF(@HasWhere=0) 
            BEGIN       
                SET @QueryString = @QueryString + ' WHERE a.CanAdd = @DummyCanAdd';
                SET @HasWhere=1;
            END
    ELSE SET @QueryString = @QueryString + ' AND a.CanAdd = @DummyCanAdd';
END

IF(@CanEdit IS NOT NULL)
BEGIN
    IF(@HasWhere=0) 
        BEGIN
            SET @QueryString = @QueryString + ' WHERE a.CanEdit = @DummyCanEdit';
            SET @HasWhere=1;
        END
    ELSE SET @QueryString = @QueryString + ' AND a.CanEdit = @DummyCanEdit';
END

IF(@CanDelete IS NOT NULL)
BEGIN
    IF(@HasWhere=0) 
        BEGIN
            SET @QueryString = @QueryString + ' WHERE a.CanDelete = @DummyCanDelete';
            SET @HasWhere=1;
        END
    ELSE SET @QueryString = @QueryString + ' AND a.CanDelete = @DummyCanDelete';
END

IF(@CreatedDatetime IS NOT NULL)
BEGIN
    IF(@HasWhere=0) 
    BEGIN
        SET @QueryString = @QueryString + ' WHERE a.CreatedDatetime = @DummyCreatedDatetime';
        SET @HasWhere=1;
    END
    ELSE SET @QueryString = @QueryString + ' AND a.CreatedDatetime = @DummyCreatedDatetime';
END

IF(@LastAccessDatetime IS NOT NULL)
BEGIN
    IF(@HasWhere=0) 
        BEGIN
            SET @QueryString = @QueryString + ' WHERE a.LastAccessDatetime = @DummyLastAccessDatetime';
            SET @HasWhere=1;
        END
    ELSE SET @QueryString = @QueryString + ' AND a.LastAccessDatetime = @DummyLastAccessDatetime';
END

IF(@Deleted IS NOT NULL)
BEGIN
  IF(@HasWhere=0)   
    BEGIN
        SET @QueryString = @QueryString + ' WHERE a.Deleted = @DummyDeleted';
        SET @HasWhere=1;
    END
  ELSE SET @QueryString = @QueryString + ' AND a.Deleted = @DummyDeleted';
END

PRINT @QueryString

EXECUTE SP_EXECUTESQL @QueryString
                      ,N'@DummyAccessRightId int, @DummyRoleId int, @DummyModuleId int, @DummyCanAdd char(1), @DummyCanEdit char(1), @DummyCanDelete char(1), @DummyCreatedDatetime datetime, @DummyLastAccessDatetime datetime, @DummyDeleted char(1)'
                      ,@DummyAccessRightId=@AccessRightId
                      ,@DummyRoleId=@RoleId
                      ,@DummyModuleId=@ModuleId
                      ,@DummyCanAdd=@CanAdd
                      ,@DummyCanEdit=@CanEdit
                      ,@DummyCanDelete=@CanDelete
                      ,@DummyCreatedDatetime=@CreatedDatetime
                      ,@DummyLastAccessDatetime=@LastAccessDatetime
                      ,@DummyDeleted=@Deleted;

HERE I am Initializing the Input Params of Stored Procedure to null as Follows

    @AccessRightId int=null,
@RoleId int=null,
@ModuleId int=null,
@CanAdd char(1)=null,
@CanEdit char(1)=null,
@CanDelete char(1)=null,
@CreatedDatetime datetime=null,
@LastAccessDatetime datetime=null,
@Deleted char(1)=null

that did the trick for Me.

I hope this will be helpfull to someone who fall in similar trap.

Я получаю сообщение об ошибке при доступе к хранимой процедуре в SQL Server

Server Error in '/' Application.
Procedure or function 'ColumnSeek' expects parameter '@template', which was not supplied. 

Это происходит, когда я вызываю хранимую процедуру с параметром через .net-подключение данных к sql (System.data.SqlClient), хотя я поставляю параметр. Вот мой код.

SqlConnection sqlConn = new SqlConnection(connPath);
sqlConn.Open();

//METADATA RETRIEVAL
string sqlCommString = "QCApp.dbo.ColumnSeek";
SqlCommand metaDataComm = new SqlCommand(sqlCommString, sqlConn);
metaDataComm.CommandType = CommandType.StoredProcedure;
SqlParameter sp = metaDataComm.Parameters.Add("@template",SqlDbType.VarChar,50);
sp.Value = Template;

SqlDataReader metadr = metaDataComm.ExecuteReader();

И моя сохраненная процедура:

   USE [QCApp]
   GO
   SET ANSI_NULLS ON
   GO
   SET QUOTED_IDENTIFIER ON
   GO

   ALTER PROCEDURE [dbo].[ColumnSeek] 
       @template varchar(50)
   AS
   EXEC('SELECT Column_Name, Data_Type 
   FROM [QCApp].[INFORMATION_SCHEMA].[COLUMNS] 
   WHERE TABLE_NAME = ' + @template);

Я пытаюсь понять, что я делаю неправильно здесь.

Изменить: Как выясняется, шаблон был пустым, потому что я получал его значение от параметра, прошедшего через URL-адрес, и я напортачил с параметром url param (я использовал @ для и вместо &)

4b9b3361

Ответ 1

Я бы проверил код приложения и посмотрел, какое значение вы задаете для @template. Я подозреваю, что это нуль, и в этом проблема.

Ответ 2

В дополнение к другим ответам здесь, если вы забыли поставить:

cmd.CommandType = CommandType.StoredProcedure;

Затем вы также получите эту ошибку.

Ответ 3

Эта проблема обычно вызвана установкой значения параметра равным null как HLGEM, упомянутого выше. Я думал, что буду подробно останавливаться на некоторых решениях этой проблемы, которые я нашел полезными в интересах людей, новых для этой проблемы.

Решение, которое я предпочитаю, заключается в том, что по умолчанию параметры хранимой процедуры равны NULL (или любое другое значение, которое вы хотите), о чем упоминалось выше sangram, но может быть пропущено, потому что ответ очень подробный. Что-то вроде:

CREATE PROCEDURE GetEmployeeDetails
    @DateOfBirth    DATETIME = NULL,
    @Surname        VARCHAR(20),
    @GenderCode     INT = NULL,
AS

Это означает, что если в некоторых случаях параметр будет установлен в код равным null,.NET не будет устанавливать этот параметр, а хранимая процедура будет использовать значение по умолчанию, которое оно определило. Другое решение, если вы действительно хотите решить проблему в коде, должно было бы использовать метод расширения, который обрабатывает проблему для вас, например:

public static SqlParameter AddParameter<T>(this SqlParameterCollection parameters, string parameterName, T value) where T : class
{
    return value == null ? parameters.AddWithValue(parameterName, DBNull.Value) : parameters.AddWithValue(parameterName, value);
}

Мэтт Хэмилтон имеет хороший пост здесь, в котором перечислены некоторые более большие методы расширения при работе с этой областью.

Ответ 4

У меня возникла проблема, когда я получил ошибку, когда я поставил 0 в целочисленный параметр. И обнаружил, что:

cmd.Parameters.AddWithValue("@Status", 0);

работает, но это не так:

cmd.Parameters.Add(new SqlParameter("@Status", 0));

Ответ 5

Я сталкиваюсь с подобной проблемой при вызове хранимой процедуры

CREATE PROCEDURE UserPreference_Search
    @UserPreferencesId int,
    @SpecialOfferMails char(1),
    @NewsLetters char(1),
    @UserLoginId int,
    @Currency varchar(50)
AS
DECLARE @QueryString nvarchar(4000)

SET @QueryString = 'SELECT UserPreferencesId,SpecialOfferMails,NewsLetters,UserLoginId,Currency FROM UserPreference'
IF(@UserPreferencesId IS NOT NULL)
BEGIN
SET @QueryString = @QueryString + ' WHERE UserPreferencesId = @DummyUserPreferencesId';
END

IF(@SpecialOfferMails IS NOT NULL)
BEGIN
SET @QueryString = @QueryString + ' WHERE SpecialOfferMails = @DummySpecialOfferMails';
END

IF(@NewsLetters IS NOT NULL)
BEGIN
SET @QueryString = @QueryString + ' WHERE NewsLetters = @DummyNewsLetters';
END

IF(@UserLoginId IS NOT NULL)
BEGIN
SET @QueryString = @QueryString + ' WHERE UserLoginId = @DummyUserLoginId';
END

IF(@Currency IS NOT NULL)
BEGIN
SET @QueryString = @QueryString + ' WHERE Currency = @DummyCurrency';
END

EXECUTE SP_EXECUTESQL @QueryString
                     ,N'@DummyUserPreferencesId int, @DummySpecialOfferMails char(1), @DummyNewsLetters char(1), @DummyUserLoginId int, @DummyCurrency varchar(50)'
                     ,@[email protected]
                     ,@[email protected]
                     ,@[email protected]
                     ,@[email protected]
                     ,@[email protected];

Какое динамическое построение запроса для поиска я вызывал выше одного:

public DataSet Search(int? AccessRightId, int? RoleId, int? ModuleId, char? CanAdd, char? CanEdit, char? CanDelete, DateTime? CreatedDatetime, DateTime? LastAccessDatetime, char? Deleted)
    {
        dbManager.ConnectionString = ConfigurationManager.ConnectionStrings["MSSQL"].ToString();
        DataSet ds = new DataSet();
        try
        {
            dbManager.Open();
            dbManager.CreateParameters(9);
            dbManager.AddParameters(0, "@AccessRightId", AccessRightId, ParameterDirection.Input);
            dbManager.AddParameters(1, "@RoleId", RoleId, ParameterDirection.Input);
            dbManager.AddParameters(2, "@ModuleId", ModuleId, ParameterDirection.Input);
            dbManager.AddParameters(3, "@CanAdd", CanAdd, ParameterDirection.Input);
            dbManager.AddParameters(4, "@CanEdit", CanEdit, ParameterDirection.Input);
            dbManager.AddParameters(5, "@CanDelete", CanDelete, ParameterDirection.Input);
            dbManager.AddParameters(6, "@CreatedDatetime", CreatedDatetime, ParameterDirection.Input);
            dbManager.AddParameters(7, "@LastAccessDatetime", LastAccessDatetime, ParameterDirection.Input);
            dbManager.AddParameters(8, "@Deleted", Deleted, ParameterDirection.Input);
            ds = dbManager.ExecuteDataSet(CommandType.StoredProcedure, "AccessRight_Search");
            return ds;
        }
        catch (Exception ex)
        {
        }
        finally
        {
            dbManager.Dispose();
        }
        return ds;
    }

Затем после многократного царапины головы я изменил хранимую процедуру на:

ALTER PROCEDURE [dbo].[AccessRight_Search]
    @AccessRightId int=null,
    @RoleId int=null,
    @ModuleId int=null,
    @CanAdd char(1)=null,
    @CanEdit char(1)=null,
    @CanDelete char(1)=null,
    @CreatedDatetime datetime=null,
    @LastAccessDatetime datetime=null,
    @Deleted char(1)=null
AS
DECLARE @QueryString nvarchar(4000)
DECLARE @HasWhere bit
SET @HasWhere=0

SET @QueryString = 'SELECT a.AccessRightId, a.RoleId,a.ModuleId, a.CanAdd, a.CanEdit, a.CanDelete, a.CreatedDatetime, a.LastAccessDatetime, a.Deleted, b.RoleName, c.ModuleName FROM AccessRight a, Role b, Module c WHERE a.RoleId = b.RoleId AND a.ModuleId = c.ModuleId'

SET @HasWhere=1;

IF(@AccessRightId IS NOT NULL)
    BEGIN
        IF(@HasWhere=0) 
            BEGIN
                SET @QueryString = @QueryString + ' WHERE a.AccessRightId = @DummyAccessRightId';
                SET @HasWhere=1;
            END
        ELSE                SET @QueryString = @QueryString + ' AND a.AccessRightId = @DummyAccessRightId';
    END

IF(@RoleId IS NOT NULL)
    BEGIN
        IF(@HasWhere=0)
            BEGIN   
                SET @QueryString = @QueryString + ' WHERE a.RoleId = @DummyRoleId';
                SET @HasWhere=1;
            END
        ELSE            SET @QueryString = @QueryString + ' AND a.RoleId = @DummyRoleId';
    END

IF(@ModuleId IS NOT NULL)
BEGIN
    IF(@HasWhere=0) 
            BEGIN   
                SET @QueryString = @QueryString + ' WHERE a.ModuleId = @DummyModuleId';
                SET @HasWhere=1;
            END
    ELSE SET @QueryString = @QueryString + ' AND a.ModuleId = @DummyModuleId';
END

IF(@CanAdd IS NOT NULL)
BEGIN
    IF(@HasWhere=0) 
            BEGIN       
                SET @QueryString = @QueryString + ' WHERE a.CanAdd = @DummyCanAdd';
                SET @HasWhere=1;
            END
    ELSE SET @QueryString = @QueryString + ' AND a.CanAdd = @DummyCanAdd';
END

IF(@CanEdit IS NOT NULL)
BEGIN
    IF(@HasWhere=0) 
        BEGIN
            SET @QueryString = @QueryString + ' WHERE a.CanEdit = @DummyCanEdit';
            SET @HasWhere=1;
        END
    ELSE SET @QueryString = @QueryString + ' AND a.CanEdit = @DummyCanEdit';
END

IF(@CanDelete IS NOT NULL)
BEGIN
    IF(@HasWhere=0) 
        BEGIN
            SET @QueryString = @QueryString + ' WHERE a.CanDelete = @DummyCanDelete';
            SET @HasWhere=1;
        END
    ELSE SET @QueryString = @QueryString + ' AND a.CanDelete = @DummyCanDelete';
END

IF(@CreatedDatetime IS NOT NULL)
BEGIN
    IF(@HasWhere=0) 
    BEGIN
        SET @QueryString = @QueryString + ' WHERE a.CreatedDatetime = @DummyCreatedDatetime';
        SET @HasWhere=1;
    END
    ELSE SET @QueryString = @QueryString + ' AND a.CreatedDatetime = @DummyCreatedDatetime';
END

IF(@LastAccessDatetime IS NOT NULL)
BEGIN
    IF(@HasWhere=0) 
        BEGIN
            SET @QueryString = @QueryString + ' WHERE a.LastAccessDatetime = @DummyLastAccessDatetime';
            SET @HasWhere=1;
        END
    ELSE SET @QueryString = @QueryString + ' AND a.LastAccessDatetime = @DummyLastAccessDatetime';
END

IF(@Deleted IS NOT NULL)
BEGIN
  IF(@HasWhere=0)   
    BEGIN
        SET @QueryString = @QueryString + ' WHERE a.Deleted = @DummyDeleted';
        SET @HasWhere=1;
    END
  ELSE SET @QueryString = @QueryString + ' AND a.Deleted = @DummyDeleted';
END

PRINT @QueryString

EXECUTE SP_EXECUTESQL @QueryString
                      ,N'@DummyAccessRightId int, @DummyRoleId int, @DummyModuleId int, @DummyCanAdd char(1), @DummyCanEdit char(1), @DummyCanDelete char(1), @DummyCreatedDatetime datetime, @DummyLastAccessDatetime datetime, @DummyDeleted char(1)'
                      ,@[email protected]
                      ,@[email protected]
                      ,@[email protected]
                      ,@[email protected]
                      ,@[email protected]
                      ,@[email protected]
                      ,@[email protected]
                      ,@[email protected]
                      ,@[email protected];

ЗДЕСЬ Я инициализирую входные пары хранимой процедуры нулевым, как указано ниже

    @AccessRightId int=null,
@RoleId int=null,
@ModuleId int=null,
@CanAdd char(1)=null,
@CanEdit char(1)=null,
@CanDelete char(1)=null,
@CreatedDatetime datetime=null,
@LastAccessDatetime datetime=null,
@Deleted char(1)=null

который сделал трюк для Меня.

Я надеюсь, что это будет полезно для тех, кто попадает в подобную ловушку.

Ответ 6

В моем случае мне пришлось передать DBNULL.Value (используя условие else) из кода для параметра хранимых процедур, которые не определены null, но значение null.

Ответ 7

Если шаблон не установлен (то есть == null), эта ошибка также будет поднята.

Другие комментарии:

Если вы знаете значение параметра к моменту добавления параметров, вы также можете использовать AddWithValue

EXEC не требуется. Вы можете напрямую ссылаться на параметр @template в SELECT.

Ответ 8

Во-первых — почему это EXEC? Разве это не должно быть

AS
SELECT Column_Name, ...
FROM ...
WHERE TABLE_NAME = @template

Текущий SP не имеет смысла? В частности, это будет искать столбец, соответствующий @template, а не значение varchar @template. то есть, если @template является 'Column_Name', он будет искать WHERE TABLE_NAME = Column_Name, что очень редко (для того, чтобы таблица и столбец совпадали).

Кроме того, если вам нужно использовать динамический SQL, вы должны использовать EXEC sp_ExecuteSQL (сохраняя значения как параметры), чтобы предотвратить атаки на инъекции (а не конкатенацию ввода). Но в этом случае это не обязательно.

Реальная проблема — это выглядит хорошо с первого взгляда; вы уверены, что у вас нет другой копии SP, висящей вокруг? Это обычная ошибка…

Ответ 9

У меня была одна и та же проблема: для ее решения просто добавьте точно такое же имя параметра в коллекцию параметров, как и в ваших хранимых процедурах.

Пример

Предположим, вы создали хранимую процедуру:

create procedure up_select_employe_by_ID 
     (@ID int) 
as
    select * 
    from employe_t 
    where employeID = @ID

Поэтому не забудьте указать свой параметр точно так же, как в хранимой процедуре, это будет

cmd.parameter.add("@ID", sqltype,size).value = @ID

если вы идете

cmd.parameter.add("@employeID", sqltype,size).value = @employeid 

то произойдет ошибка.

Ответ 10

Я столкнулся с этой ошибкой сегодня, когда нулевые значения были переданы моим параметрам хранимой процедуры. Я смог легко исправить, изменив хранимую процедуру, добавив значение по умолчанию = null.

Ответ 11

Необходимо сказать, что хранимый процесс вызывается:

comm.CommandType = CommandType.StoredProcedure;

User-1392077014 posted

Hello This is my error Help me
Procedure or function 'SP_tbl_Persons_Insert' expects parameter '@MessageText', which was not supplied.
namespace BLL.Programmibility.SP
{

	public static class SP_tbl_Persons_Insert
	{
		/// <summary>
		/// این تابع تمامی اطلاعات را از ما دریافت میکند 
		/// </summary>
		/// <param name="person_FirstName"></param>
		/// <param name="Person_LastName"></param>
		/// <param name="person_Gender"></param>
		/// <param name="fk_City_ID"></param>
		/// <param name="person_PostalCode"></param>
		/// <param name="person_Email"></param>
		/// <param name="person_WebPage"></param>
		/// <param name="person_ImageUrl"></param>
		/// <param name="person_MobileNumber"></param>
		/// <param name="person_PhoneNumber"></param>
		/// <param name="person_GUID"></param>
		/// <param name="person_NationalCode"></param>
		/// <param name="person_Birthdate"></param>
		/// <param name="person_CreatedDate"></param>
		/// <param name="person_Address"></param>
		/// <returns> به ما بر میگرداند برای استفاده در بقیه جدول ها PersonID مقدار  </returns>
		public static int Execute
			(
			string person_FirstName,
			string Person_LastName,
			int person_Gender,
			int fk_City_ID,
			string person_PostalCode,
			string person_Email,
			string person_WebPage,
			string person_ImageUrl,
			string person_MobileNumber,
			string person_PhoneNumber,
			System.Guid person_GUID,
			string person_NationalCode,
			System.DateTime person_Birthdate,
			System.DateTime person_CreatedDate,
			string person_Address
			)
		{
			try
			{
				//Sense database provider
				Enumeration.DataBaseProviders provider =
					DataBase.Adviser.DataBaseProvider;

				System.Data.IDbCommand command = DataBase.Adviser.Command;
				command.CommandType = System.Data.CommandType.StoredProcedure;


				//Configure Procedure Name In CommandText
				command.CommandText = "[dbo].[SP_tbl_Persons_Insert]";


				//Set Procedure Parameters

				//This is output Parametrs
				System.Data.SqlClient.SqlParameter param = new System.Data.SqlClient.SqlParameter("@person_ID", System.Data.SqlDbType.Int, 1);
				param.Direction = System.Data.ParameterDirection.Output;
				command.Parameters.Add(param);

				System.Data.SqlClient.SqlParameter paramMessageText = new System.Data.SqlClient.SqlParameter("@messageText", System.Data.SqlDbType.NVarChar, 1);
				param.Direction = System.Data.ParameterDirection.Output;
				command.Parameters.Add(paramMessageText);

				command.Parameters.Add
					(DataBase.ParameterFactory.GetParameter
					("@person_FirstName", person_FirstName, provider));

				command.Parameters.Add
					(DataBase.ParameterFactory.GetParameter
					("@Person_LastName", Person_LastName, provider));

				command.Parameters.Add
					(DataBase.ParameterFactory.GetParameter
					("@person_Gender", person_Gender, provider));

				command.Parameters.Add
					(DataBase.ParameterFactory.GetParameter
					("@fk_City_ID", fk_City_ID, provider));

				command.Parameters.Add
					(DataBase.ParameterFactory.GetParameter
					("@person_PostalCode", person_PostalCode, provider));

				command.Parameters.Add
					(DataBase.ParameterFactory.GetParameter
					("@person_Email", person_Email, provider));

				command.Parameters.Add
					(DataBase.ParameterFactory.GetParameter
					("@person_WebPage", person_WebPage, provider));

				command.Parameters.Add
					(DataBase.ParameterFactory.GetParameter
					("@person_ImageUrl", person_ImageUrl, provider));

				command.Parameters.Add
					(DataBase.ParameterFactory.GetParameter
					("@person_MobileNumber", person_MobileNumber, provider));

				command.Parameters.Add
					(DataBase.ParameterFactory.GetParameter
					("@person_PhoneNumber", person_PhoneNumber, provider));

				command.Parameters.Add
					(DataBase.ParameterFactory.GetParameter
					("@person_GUID", person_GUID.ToString(), provider));

				command.Parameters.Add
					(DataBase.ParameterFactory.GetParameter
					("@person_NationalCode", person_NationalCode, provider));

				command.Parameters.Add
					(DataBase.ParameterFactory.GetParameter
					("@person_Birthdate", person_Birthdate, provider));

				command.Parameters.Add
					(DataBase.ParameterFactory.GetParameter
					("@person_CreatedDate", person_CreatedDate, provider));

				command.Parameters.Add
					(DataBase.ParameterFactory.GetParameter
					("@person_Address", person_Address, provider));

				command.ExecuteNonQuery();

				//Return PersonID
				if (param != null)
				{

					return (-1);
				}

				if ((string.IsNullOrEmpty((string)paramMessageText.Value)))
				{
					throw (new Applications.ApplicationException((string)paramMessageText.Value));
				}
				return(System.Convert.ToInt32(param.Value));

			}
			catch (Applications.ApplicationException ex)
			{
				SystemMessageProvider SystemMessageProvider =
					   new SystemMessageProvider();
				SystemMessageProvider.GetMessage(ex.Message);
				throw (ex);
			}
			catch (System.Exception ex)
			{
			
				throw (ex);
			}
		}
	}
}
USE [OmidPaymak]
GO
/****** Object: StoredProcedure [dbo].[SP_tbl_Persons_Insert] Script Date: 07/13/2011 05:58:33 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

/*
==================================
Author : <Author,,Mohammad Jafari>
Create date : <Create Date,6.4.1390,>
Description : <Description,OmidPaymakSPV2,>
==================================
*/

-- [dbo].[SP_tbl_Persons_Insert] @Person_ID = 1, @Person_FirstName = 'Person_FirstName', @Person_LastName = 'Person_LastName', @Person_CreatedDate = '2011-07-01', @Person_GUID = '00000000-0000-0000-0000-000000000000', @Person_Email = 'Person_Email', @Person_PhoneNumber = 'Person_PhoneNumber', @Person_PostalCode = 'Person_PostalCode', @Person_NationalCode = 'Person_NationalCode', @Person_Address = 'Person_Address', @Person_ImageUrl = 'Person_ImageUrl', @Person_Birthdate = '2011-07-01', @Person_WebPage = 'Person_WebPage', @Person_MobileNumber = 'Person_MobileNumber', @fk_City_ID = 1, @Person_Gender = 1

ALTER PROCEDURE [dbo].[SP_tbl_Persons_Insert]

@Person_ID int OUTPUT
,@Person_FirstName nvarchar (50)
,@Person_LastName nvarchar (50)
,@Person_CreatedDate date
,@Person_GUID uniqueidentifier
,@Person_Email nvarchar (255)
,@Person_PhoneNumber nvarchar (12)
,@Person_PostalCode nvarchar (10)
,@Person_NationalCode nvarchar (10)
,@Person_Address nvarchar (1000)
,@Person_ImageUrl nvarchar (500)
,@Person_Birthdate date
,@Person_WebPage nvarchar (255)
,@Person_MobileNumber nvarchar (12)
,@fk_City_ID int
,@Person_Gender int
,@MessageText nvarchar(50) output

AS

SET NOCOUNT ON;

BEGIN TRY

declare @HasError bit
BEGIN TRAN

/*بررسی شماره موبایل*/
if(
select top 1 tbl_Persons.Person_ID
From tbl_Persons
Where tbl_Persons.Person_MobileNumber= @Person_MobileNumber)>0
begin
/* مقدار شماره موبایل وارد شده قبلا در سیستم موجود می باشد.*/
set @MessageText= (select CONVERT(nvarchar, SystemMessage_ID) from tbl_SystemMessages where SystemMessage_ID=2)
set @HasError=1
end

/*بررسی ایمیل */
if(
select top 1 tbl_Persons.Person_ID
From tbl_Persons
Where tbl_Persons.Person_Email= @Person_Email)>0
begin
/*ایمیل وارد شده قبلا در سیستم ثبت گردیده است*/
set @MessageText+= ','+(select CONVERT(nvarchar,SystemMessage_ID) from tbl_SystemMessages where SystemMessage_ID=4)
set @HasError=1
end

/*بررسی کد ملی*/
if(
select top 1 tbl_Persons.Person_ID
From tbl_Persons
Where tbl_Persons.Person_NationalCode= @Person_NationalCode)>0
begin

/* کد ملی وارد شده قبلا در سیستم ثبت گردیده است */
set @MessageText+= ','+ (select CONVERT(nvarchar,SystemMessage_ID) from tbl_SystemMessages where SystemMessage_ID=12)
set @HasError=1
end
if @HasError=1
begin
raiserror(@MessageText,16,1)
end

else
begin
INSERT [dbo].[tbl_Persons]
(
[Person_FirstName]
,[Person_LastName]
,[Person_CreatedDate]
,[Person_GUID]
,[Person_Email]
,[Person_PhoneNumber]
,[Person_PostalCode]
,[Person_NationalCode]
,[Person_Address]
,[Person_ImageUrl]
,[Person_Birthdate]
,[Person_WebPage]
,[Person_MobileNumber]
,[fk_City_ID]
,[Person_Gender]
)
VALUES
(
@Person_FirstName
,@Person_LastName
,@Person_CreatedDate
,@Person_GUID
,@Person_Email
,@Person_PhoneNumber
,@Person_PostalCode
,@Person_NationalCode
,@Person_Address
,@Person_ImageUrl
,@Person_Birthdate
,@Person_WebPage
,@Person_MobileNumber
,@fk_City_ID
,@Person_Gender
)

SET @Person_ID = @@IDENTITY

end

COMMIT TRAN
END TRY

BEGIN CATCH
ROLLBACK TRAN

DECLARE @ErrorNumber_INT INT;
DECLARE @ErrorSeverity_INT INT;
DECLARE @ErrorProcedure_VC VARCHAR(200);
DECLARE @ErrorLine_INT INT;
DECLARE @ErrorMessage_NVC NVARCHAR(4000);

SELECT
@ErrorMessage_NVC = ERROR_MESSAGE(),
@ErrorSeverity_INT = ERROR_SEVERITY(),
@ErrorNumber_INT = ERROR_NUMBER(),
@ErrorProcedure_VC = ERROR_PROCEDURE(),
@ErrorLine_INT = ERROR_LINE()

RAISERROR(@ErrorMessage_NVC,@ErrorSeverity_INT,1);

END CATCH

Shauna

0 / 0 / 0

Регистрация: 19.05.2012

Сообщений: 59

1

26.05.2013, 19:01. Показов 13900. Ответов 3

Метки нет (Все метки)


Студворк — интернет-сервис помощи студентам

Пытаюсь написать хранимую процедуру на подсчет количества пользователей:

T-SQL
1
2
3
4
5
6
7
8
9
CREATE PROCEDURE p1
 @count_polz int output
    
AS
BEGIN
    
    SELECT @count_polz = count(*) from polzovatel
END
GO

Вызываю:

T-SQL
1
2
use sait
exec p1

Но пишет ошибку :Procedure or function ‘p1’ expects parameter ‘@count_polz’, which was not supplied.



0



1607 / 1116 / 165

Регистрация: 23.07.2010

Сообщений: 6,474

26.05.2013, 19:33

2

В сиквеле параметры в скобках принято указывать
+ в exec передайте уже что-нибудь



0



0 / 0 / 0

Регистрация: 19.05.2012

Сообщений: 59

26.05.2013, 19:42

 [ТС]

3

спасибо)
но при вызове написал Could not find stored procedure ‘p1’.



0



414 / 265 / 25

Регистрация: 03.10.2011

Сообщений: 1,079

27.05.2013, 08:14

4

Значит процедура не создалась или при вызове (создании) в названии функции введены похожие буквы из русского алфавита.



0



i bet, you are trying to return a sql result set and an output parameter, right? if so, then try the code below:

protected void btnsearch_Click(object sender, EventArgs e)
{
    SqlConnection con = Connection.DBconnection();

    SqlCommand com = new SqlCommand("sp_studentresult", con);
    com.CommandType = CommandType.StoredProcedure;

    com.Parameters.AddWithValue("@id", textstudentid.Text);
    com.Parameters.AddWithValue("@id_student", textIDStudent.Text);
    SqlParameter retval2 = new SqlParameter("@output", SqlDbType.VarChar, 50);
    retval2.Direction = ParameterDirection.Output;
    com.Parameters.Add(retval2);

    SqlDataAdapter adp = new SqlDataAdapter(com);
    DataSet ds = new DataSet();
    adp.Fill(ds);

    if (ds.Tables[0].Rows.Count > 0)
    {
        txtid.Text = ds.Tables[0].Rows[0]["id"].ToString();
        txttamil.Text = ds.Tables[0].Rows[0]["Tamil"].ToString();
        txtenglish.Text = ds.Tables[0].Rows[0]["English"].ToString();
        txtmaths.Text = ds.Tables[0].Rows[0]["Maths"].ToString();
        txtscience.Text = ds.Tables[0].Rows[0]["Science"].ToString();
        txtsocialscience.Text = ds.Tables[0].Rows[0]["SocialScience"].ToString();
    }

    SqlParameter retval = new SqlParameter("@output", SqlDbType.VarChar, 50);
    retval.Direction = ParameterDirection.Output;
    com.Parameters.Add(retval);
    com.Parameters.AddWithValue("@id", textstudentid.Text);
    com.Parameters.AddWithValue("@id_student", textIDStudent.Text);

    com.ExecuteNonQuery();

    string Output = retval.Value.ToString();
}

Понравилась статья? Поделить с друзьями:
  • Ошибка whatsapp неправильная дата как исправить
  • Ошибка whatsapp не удается подключиться повторите попытку позже
  • Ошибка whatsapp не отправляет сообщения
  • Ошибка whatsapp на телефоне стоит неправильная дата
  • Ошибка wf has stopped working как исправить