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 (я использовал @
для и вместо &
)
Ответ 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) outputAS
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)
endelse
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 TRYBEGIN CATCH
ROLLBACK TRANDECLARE @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 Метки нет (Все метки)
Пытаюсь написать хранимую процедуру на подсчет количества пользователей:
Вызываю:
Но пишет ошибку :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 |
В сиквеле параметры в скобках принято указывать
0 |
0 / 0 / 0 Регистрация: 19.05.2012 Сообщений: 59 |
|
26.05.2013, 19:42 [ТС] |
3 |
спасибо)
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();
}