powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Не берет значение из Хранимой процедуры
11 сообщений из 11, страница 1 из 1
Не берет значение из Хранимой процедуры
    #37803840
Solomka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот какая то странность.
Есть рабочая хранимая процедура:
которая через SqlManager возвращает значение:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
ALTER PROCEDURE [dbo].[SelectLastProcentFromTaskFromIdRecord]
	-- Add the parameters for the stored procedure here
	@idRecord int
AS
DECLARE @last int
BEGIN
	-- SET NOCOUNT ON added to prevent extra result sets from
	-- interfering with SELECT statements.
	
	SET @last = (SELECT TOP (1) [Готовность_в_процентах]
				 FROM [Zada4i].[dbo].[Отчет_о_проделанной_работе]
				 WHERE [Задача_ID] = (SELECT [Задача_ID] FROM [Отчет_о_проделанной_работе] WHERE ID = @idRecord)
				 AND [Отчет_о_проделанной_работе].ID < @idRecord
				 ORDER BY  ID DESC)
	SET @last = @last + 0
	RETURN @last
	
END


Смысл её в том что она возвращает конкретное определенное число, если такая запись есть в базе а если нет то возвращает 0.
Через менеджер он возвращает значение, а через код программы не получается вернуть с помощью C#.
Код обращения к хранимой процедуре:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
        int idRecord = System.Convert.ToInt32(((Label)(((TextBox)sender).Parent.Controls[1])).Text);

        System.Data.SqlClient.SqlConnection con = new System.Data.SqlClient.SqlConnection(  StaticClass.NameFirstConnectionString );
        System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand();
        cmd.CommandType = System.Data.CommandType.StoredProcedure;
        cmd.Connection = con;
        cmd.CommandText = "SelectLastProcentFromTaskFromIdRecord";
        cmd.Parameters.AddWithValue("@idRecord", idRecord);
        con.Open();
        object o = cmd.ExecuteScalar();           
        con.Close();


Но вот пчему то О- это всегда null!!!
Почему?
Через менеджер значение нормально возвращается?
_________________________________________________________________________________
Жизнь - это сплошное движение, кто-то шевелит извилинами, а кто-то хлопает ушами...
...
Рейтинг: 0 / 0
Не берет значение из Хранимой процедуры
    #37803871
Deza
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Solomka,

Код: sql
1.
2.
3.
4.
ALTER PROCEDURE [dbo].[SelectLastProcentFromTaskFromIdRecord]
	-- Add the parameters for the stored procedure here
	@idRecord int,
        [color=red]@Last int OUTPUT[/color]
...
Рейтинг: 0 / 0
Не берет значение из Хранимой процедуры
    #37803881
Deza
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Не берет значение из Хранимой процедуры
    #37803951
Solomka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DezaSolomka,

Код: sql
1.
2.
3.
4.
ALTER PROCEDURE [dbo].[SelectLastProcentFromTaskFromIdRecord]
	-- Add the parameters for the stored procedure here
	@idRecord int,
        [color=red]@Last int OUTPUT[/color]



Изменила текст хранимой процедуры:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
ALTER PROCEDURE [dbo].[SelectLastProcentFromTaskFromIdRecord]
	-- Add the parameters for the stored procedure here
	@idRecord int,
	@last int Output
AS
 
		
BEGIN
	-- SET NOCOUNT ON added to prevent extra result sets from
	-- interfering with SELECT statements.
	
	SET @last = (SELECT TOP (1) [Готовность_в_процентах]
				 FROM [Zada4i].[dbo].[Отчет_о_проделанной_работе]
				 WHERE [Задача_ID] = (SELECT [Задача_ID] FROM [Отчет_о_проделанной_работе] WHERE ID = @idRecord)
				 AND [Отчет_о_проделанной_работе].ID < @idRecord
				 ORDER BY  ID DESC)
	SET @last = @last + 0
	RETURN @last
	
END



Обращаюсь к хранимой процедуре:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
        
        int idRecord = System.Convert.ToInt32(((Label)(((TextBox)sender).Parent.Controls[1])).Text);

        System.Data.SqlClient.SqlConnection con = new System.Data.SqlClient.SqlConnection(  StaticClass.NameFirstConnectionString );
        System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand();
        cmd.CommandType = System.Data.CommandType.StoredProcedure;
        cmd.Connection = con;
        cmd.CommandText = "SelectLastProcentFromTaskFromIdRecord";
        cmd.Parameters.AddWithValue("@idRecord", idRecord);
        cmd.Parameters.AddWithValue("@last", 0);
        con.Open();
        object o = cmd.ExecuteScalar();           
        con.Close();





При попытке обратиться к Хранимой процедуре выдается следующая ошибка:
ошибкаОшибка сервера в приложении '/AnotherHost/systemManagerControl'.
Процедура или функция "SelectLastProcentFromTaskFromIdRecord" ожидает параметр "@last", который не был указан.
Описание: Необработанное исключение при выполнении текущего веб-запроса. Изучите трассировку стека для получения дополнительных сведений о данной ошибке и о вызвавшем ее фрагменте кода.

Сведения об исключении: System.Data.SqlClient.SqlException: Процедура или функция "SelectLastProcentFromTaskFromIdRecord" ожидает параметр "@last", который не был указан.

Ошибка источника:

Необработанное исключение при выполнении текущего веб-запроса. Информацию о происхождении и месте возникновения исключения можно получить, используя следующую трассировку стека исключений.

Трассировка стека:

[SqlException (0x80131904): Процедура или функция "SelectLastProcentFromTaskFromIdRecord" ожидает параметр "@last", который не был указан.]
System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection) +2030802
System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection) +5009584
System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning() +234
System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj) +2275
System.Data.SqlClient.SqlDataReader.ConsumeMetaData() +33
System.Data.SqlClient.SqlDataReader.get_MetaData() +86
System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString) +311
System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async) +987
System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result) +162
System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method) +32
System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method) +141
System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior behavior) +12
System.Data.Common.DbCommand.System.Data.IDbCommand.ExecuteReader(CommandBehavior behavior) +10
System.Data.Common.DbDataAdapter.FillInternal(DataSet dataset, DataTable[] datatables, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior) +144
System.Data.Common.DbDataAdapter.Fill(DataSet dataSet, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior) +319
System.Data.Common.DbDataAdapter.Fill(DataSet dataSet, String srcTable) +92
System.Web.UI.WebControls.SqlDataSourceView.ExecuteSelect(DataSourceSelectArguments arguments) +1618
System.Web.UI.DataSourceView.Select(DataSourceSelectArguments arguments, DataSourceViewSelectCallback callback) +21
System.Web.UI.WebControls.DataBoundControl.PerformSelect() +143
System.Web.UI.WebControls.BaseDataBoundControl.DataBind() +74
System.Web.UI.WebControls.DetailsView.DataBind() +4
System.Web.UI.Control.DataBindChildren() +201
System.Web.UI.Control.DataBind(Boolean raiseOnDataBinding) +101
System.Web.UI.Control.DataBind() +15
System.Web.UI.Control.DataBindChildren() +201
System.Web.UI.Control.DataBind(Boolean raiseOnDataBinding) +101
System.Web.UI.Control.DataBind() +15
System.Web.UI.WebControls.GridView.CreateRow(Int32 rowIndex, Int32 dataSourceIndex, DataControlRowType rowType, DataControlRowState rowState, Boolean dataBind, Object dataItem, DataControlField[] fields, TableRowCollection rows, PagedDataSource pagedDataSource) +166
System.Web.UI.WebControls.GridView.CreateChildControls(IEnumerable dataSource, Boolean dataBinding) +3896
System.Web.UI.WebControls.CompositeDataBoundControl.PerformDataBinding(IEnumerable data) +66
System.Web.UI.WebControls.GridView.PerformDataBinding(IEnumerable data) +14
System.Web.UI.WebControls.DataBoundControl.OnDataSourceViewSelectCallback(IEnumerable data) +128
System.Web.UI.DataSourceView.Select(DataSourceSelectArguments arguments, DataSourceViewSelectCallback callback) +33
System.Web.UI.WebControls.DataBoundControl.PerformSelect() +143
System.Web.UI.WebControls.BaseDataBoundControl.DataBind() +74
System.Web.UI.WebControls.GridView.DataBind() +4
System.Web.UI.WebControls.BaseDataBoundControl.EnsureDataBound() +66
System.Web.UI.WebControls.GridView.OnPreRender(EventArgs e) +26
System.Web.UI.Control.PreRenderRecursiveInternal() +103
System.Web.UI.Control.PreRenderRecursiveInternal() +175
System.Web.UI.Control.PreRenderRecursiveInternal() +175
System.Web.UI.Control.PreRenderRecursiveInternal() +175
System.Web.UI.Control.PreRenderRecursiveInternal() +175
System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +2496

Почем говоритья чере параметр не передан, если я его передаю?
...
Рейтинг: 0 / 0
Не берет значение из Хранимой процедуры
    #37803979
Deza
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Solomka,

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
SqlParameter param; 
            System.Data.SqlClient.SqlConnection con = new System.Data.SqlClient.SqlConnection(StaticClass.NameFirstConnectionString);
            System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand();
            cmd.CommandType = System.Data.CommandType.StoredProcedure;
            cmd.Connection = con;
            cmd.CommandText = "SelectLastProcentFromTaskFromIdRecord";

            param = new SqlParameter();

            param.ParameterName = "@idrecord";
            param.SqlDbType = SqlDbType.NVarChar;
            param.Size = 1024;
            param.Direction = ParameterDirection.Input;
            cmd.Parameters.Add(param);

            param = new SqlParameter();
            param.ParameterName = "@last";
            param.SqlDbType = SqlDbType.Int;
            param.Direction = ParameterDirection.Output;
            cmd.Parameters.Add(param);

            con.Open();
            int o = (int)cmd.ExecuteScalar();
            con.Close();




как то так c ADO.NET давно не работаю
...
Рейтинг: 0 / 0
Не берет значение из Хранимой процедуры
    #37803992
Deza
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
забыл для idrecord, добавить

Код: c#
1.
param.value = idRecord
...
Рейтинг: 0 / 0
Не берет значение из Хранимой процедуры
    #37804319
Solomka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dezaзабыл для idrecord, добавить

Код: c#
1.
param.value = idRecord


Возвращается значение снова null.
Однако, если смотреть через отладчик то значение параметра @last изменяется с 0 на правильное значение.
А как сделать чтобы ХП сразу возвращала правильное значение?
...
Рейтинг: 0 / 0
Не берет значение из Хранимой процедуры
    #37804344
Deza
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Solomka,

ХП у тебя возвращает правильное значение, научись работать с переменными на стороне кода

тыц
...
Рейтинг: 0 / 0
Не берет значение из Хранимой процедуры
    #37804368
Deza
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вроде так, попробуй
Код: c#
1.
2.
3.
4.
con.Open();
cmd.ExecuteNonQuery();
int iLast = (int)cmd.Parameters["last"].Value);
con.Close();
...
Рейтинг: 0 / 0
Не берет значение из Хранимой процедуры
    #37806230
Solomka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dezaвроде так, попробуй
Код: c#
1.
2.
3.
4.
con.Open();
cmd.ExecuteNonQuery();
int iLast = (int)cmd.Parameters["last"].Value);
con.Close();


Да у меня вчера так и получилось.
Но меня интересовал вопрос можно это же значение получить с помощью кода:
Код: c#
1.
int o = (int)cmd.ExecuteScalar();


как нужно изменить ХП чтобы заработало...
Ведь в описании сказано, что этот метод возвращает значение первого столбца первой записи.
то есть по идее он должен возвращать новое значение из ХП.
И через Managment Studio ХП тоже возвращает правильное значение.
странно как-то...
...
Рейтинг: 0 / 0
Не берет значение из Хранимой процедуры
    #37806496
Deza
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Solomka,

попробуй

RETURN @last

поменять на Select @last
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Не берет значение из Хранимой процедуры
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]