asp.net параметр sqldatasource не указан

#c# #asp.net #sql-server #parameters #sqldatasource

#c# #asp.net #sql-сервер #параметры #sqldatasource

Вопрос:

Я создаю очень простую тестовую программу CRUD (СОЗДАНИЕ, ЧТЕНИЕ, ОБНОВЛЕНИЕ, УДАЛЕНИЕ) в asp.net фреймворк 4, который должен иметь идентификатор таблицы в качестве уникального идентификатора и первичного ключа. Я решил позволить SQLServer создать уникальный идентификатор.

Мне нужно заставить работать хранимую процедуру удаления.

Программа использует SqlDataSource и FormView на странице Webforms, доступ к которой осуществляется через хранимые процедуры.

Я могу СОЗДАВАТЬ, ЧИТАТЬ И ОБНОВЛЯТЬ данные, но НЕ УДАЛЯТЬ данные. При попытке удалить я получаю следующую ошибку:

«Процедура или функция’DeleteTestJobID’ ожидает параметр’@TestJobID’, который не был указан».

Я включил разметку, описание, исключение, ошибку источника, трассировку стека, а также SQLTable и хранимые процедуры.

Я много искал в течение последних 48 часов на сайте MSDN, но не могу найти решение.

ASP.NET страница веб-форм:

    <asp:SqlDataSource ID="testjobSqlDataSource1" runat="server" 
        ConnectionString="<%$ ConnectionStrings:TestJobSiteConnectionString %>" 
        DeleteCommand="DeleteTestJobID" DeleteCommandType="StoredProcedure" 
        InsertCommand="AddTestJobID" InsertCommandType="StoredProcedure" 
        SelectCommand="SelectAllTestJob" SelectCommandType="StoredProcedure" 
        UpdateCommand="UpdateTestJob" UpdateCommandType="StoredProcedure">
        <DeleteParameters>
            <asp:QueryStringParameter Name="TestJobID" QueryStringField="TestJobID" 
               Type="String" />
        </DeleteParameters>
        <InsertParameters>
            <asp:ControlParameter ControlID="testjobFormView1" Name="Name" 
                PropertyName="SelectedValue" Type="String" />
        </InsertParameters>
        <UpdateParameters>
            <asp:QueryStringParameter Name="TestJobID" QueryStringField="TestJobID" 
                Type="String" />
            <asp:ControlParameter ControlID="testjobFormView1" Name="Name" 
                PropertyName="SelectedValue" Type="String" />
        </UpdateParameters>
    </asp:SqlDataSource>
    <asp:FormView ID="testjobFormView1" runat="server" 
        DataSourceID="testjobSqlDataSource1">
        <EditItemTemplate>
            TestJobID:
            <asp:TextBox ID="TestJobIDTextBox" runat="server" 
                Text='<%# Bind("TestJobID") %>' />
            <br />
            Name:
            <asp:TextBox ID="NameTextBox" runat="server" Text='<%# Bind("Name") %>' />
            <br />
            <asp:LinkButton ID="UpdateButton" runat="server" CausesValidation="True" 
                CommandName="Update" Text="Update" />
            amp;nbsp;<asp:LinkButton ID="UpdateCancelButton" runat="server" 
                CausesValidation="False" CommandName="Cancel" Text="Cancel" />
        </EditItemTemplate>
        <InsertItemTemplate>

            Name:
            <asp:TextBox ID="NameTextBox" runat="server" Text='<%# Bind("Name") %>' />
            <br />
            <asp:LinkButton ID="InsertButton" runat="server" CausesValidation="True" 
                CommandName="Insert" Text="Insert" />
            amp;nbsp;<asp:LinkButton ID="InsertCancelButton" runat="server" 
                CausesValidation="False" CommandName="Cancel" Text="Cancel" />
        </InsertItemTemplate>
        <ItemTemplate>
            TestJobID:
            <asp:Label ID="TestJobIDLabel" runat="server" Text='<%# Bind("TestJobID") %>' />
            <br />
            Name:
            <asp:Label ID="NameLabel" runat="server" Text='<%# Bind("Name") %>' />
            <br />
            <asp:LinkButton ID="EditButton" runat="server" CausesValidation="False" 
                CommandName="Edit" Text="Edit" />
            amp;nbsp;<asp:LinkButton ID="DeleteButton" runat="server" CausesValidation="False" 
                CommandName="Delete" Text="Delete" />
            amp;nbsp;<asp:LinkButton ID="NewButton" runat="server" CausesValidation="False" 
                CommandName="New" Text="New" />
        </ItemTemplate>
    </asp:FormView>
  

СООБЩЕНИЕ ОБ ОШИБКЕ:

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

Сведения об исключении: System.Data.SqlClient.SQLException: процедура или функция ‘DeleteTestJobID’ ожидает параметр ‘@TestJobID’, который не был предоставлен.

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

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

[Исключение SQLException (0x80131904): процедура или функция ‘DeleteTestJobID’ ожидает параметр ‘@TestJobID’, который не был предоставлен.]
System.Data.SqlClient.SqlConnection.Ошибка onError(исключение SQLException, логическое прерывание соединения, действие 1 wrapCloseInAction) 1767866 System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action 1 wrapCloseInAction) 5352418 System.Data.SqlClient.TdsParser.Throw exceptionandwarning(TdsParserStateObject stateObj, логический callerHasConnectionLock, логический asyncClose) 244
System.Data.SqlClient.TdsParser.Попробуйте выполнить (RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Booleanamp; dataReady) 1691
System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, строка resetOptionsString) 269
System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, логический поток возврата, логическая асинхронность, тайм-аут Int32, задача и задача, логический asyncWrite, SqlDataReader ds ) 1406
System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, логический поток возврата, строковый метод, TaskCompletionSource 1 completion, Int32 timeout, Taskamp; task, Boolean asyncWrite) 177 System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(TaskCompletionSource 1 завершение, строковое имя метода, логическое значение sendToPipe, тайм-аут Int32, логическое значение asyncWrite) 205
System.Data.SqlClient.SqlCommand.ExecuteNonQuery() 160
System.Web.UI.WebControls.SqlDataSourceView.ExecuteDbCommand(команда DbCommand, операция DataSourceOperation) 380
System.Web.UI.WebControls.SqlDataSourceView.ExecuteDelete(IDictionary keys, IDictionary oldValues) 568
System.Web.UI.DataSourceView.Удалить (IDictionary keys, IDictionary oldValues, обратный вызов DataSourceViewOperationCallback) 84
System.Web.UI.WebControls.FormView.Обработано удаление (строка commandArg) 793 System.Web.UI.WebControls.FormView.handleEvent(EventArgs e, Boolean CausesValidation, String ValidationGroup) 519
System.Web.UI.WebControls.FormView.OnBubbleEvent(источник объекта, EventArgs e) 89 System.Web.UI.Control.RaiseBubbleEvent(источник объекта, аргументы EventArgs) 37
System.Web.UI.WebControls.FormViewRow.OnBubbleEvent(источник объекта, EventArgs e) 80 System.Web.UI.Control.RaiseBubbleEvent(источник объекта, аргументы EventArgs) 37
System.Web.UI.WebControls.LinkButton.OnCommand(CommandEventArgs e) 121 System.Web.UI.WebControls.LinkButton.RaisePostBackEvent(строка eventArgument) 156
System.Web.UI.WebControls.LinkButton.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(строка eventArgument) 10
System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler SourceControl, строка eventArgument) 13
System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData) 9528682 System.Web.UI.Page.ProcessRequestMain(логическое значение includeStagesBeforeAsyncPoint, логическое значение includeStagesAfterAsyncPoint) 1724

SQL Server

CREATE TABLE

 USE [TestJobSite]
GO

/****** Object:  Table [dbo].[TestJob]    Script Date: 28/06/2014 17:27:55 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[TestJob](
    [TestJobID] [uniqueidentifier] NULL,
    [Name] [nchar](100) NOT NULL
) ON [PRIMARY]

GO

ALTER TABLE [dbo].[TestJob] ADD  CONSTRAINT [DF_TestJob_TestJobID]  DEFAULT (newid()) FOR [TestJobID]
GO
  

Stored procedure: DELETE

 USE [TestJobSite]
GO

/****** Object:  StoredProcedure [dbo].[DeleteA]    Script Date: 27/06/2014 18:19:28 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

        ALTER PROCEDURE [dbo].[DeleteTestJobID]
        @TestJobID nchar(100)
        AS

        DELETE FROM
        TestJob
        WHERE
        TestJobID=@TestJobID

GO
  

Stored procedure: ADD ENTRY

 USE [TestJobSite]
GO

/****** Object:  StoredProcedure [dbo].[AddAgency]    Script Date: 27/06/2014 18:02:03 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

        ALTER PROCEDURE [dbo].[AddTestJobID]
        -- Add the parameters for the stored procedure here
        @Name nchar(100)

        AS
        BEGIN
        -- SET NOCOUNT ON added to prevent extra result sets from
        -- interfering with SELECT statements.
        SET NOCOUNT ON;

        -- Insert statements for procedure here
        INSERT INTO TestJob (Name)

        VALUES (@Name);
        END

GO
  

Хранимая процедура: ЧТЕНИЕ

 USE [TestJobSite]
GO

/****** Object:  StoredProcedure [dbo].[SelectAllTestJob]    Script Date: 27/06/2014 18:22:46 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

        CREATE PROCEDURE [dbo].[SelectAllTestJob]
        AS

        SELECT *  FROM
        TestJob

GO
  

Хранимая процедура: ОБНОВЛЕНИЕ

 /****** Object:  StoredProcedure [dbo].[UpdateTestJob]    Script Date: 27/06/2014 18:24:49 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

        CREATE PROCEDURE [dbo].[UpdateTestJob]
        @TestJobID nchar(100),
        @Name nchar(100)

        AS

        UPDATE TestJob
                    
        SET
        Name=@Name

        WHERE 
        TestJobID=@TestJobID;
GO
  

Комментарии:

1. Есть ли параметр запроса с именем TestJobID в строке запроса URL-адреса?

2. Да, есть. Процедура редактирования работает и считывает параметр из URL. Удаление каким-то образом не распознает его. Я пытался вручную записать его, скопировать его из параметров редактирования и даже сгенерировать его с помощью мастера настройки sqldatasource.

Ответ №1:

Возникла проблема с функцией редактирования и удаления.

  1. Функция редактирования не сработала! Причина заключалась в том, что хранимая процедура SELECT была неверной; она помещает первую запись в таблицу. Если вы измените uniqueidentifier в URL-адресе, он всегда отображает первую запись в таблице, а затем обновляет это содержимое, которое вы вводите в текстовое поле (имя).

    Чтобы решить эту проблему, просто измените выбранный сохраненный процесс на этот:

      SET ANSI_NULLS ON
     GO
    
     SET QUOTED_IDENTIFIER ON
     GO
             CREATE PROCEDURE [dbo].[SelectTestJob]
             @TestJobID nchar(100)
             AS
    
             SELECT *  FROM
             TestJob
             WHERE
             TestJobID=@TestJobID
     GO
      

    При этом из таблицы будет выбрана только одна запись. Убедитесь, что разметка в sqldatasource теперь выглядит так; обратите внимание на оператор SELECT и его тип, затем проверьте ПАРАМЕТР SELECT . Параметр должен быть строкой запроса; поскольку он считывается из URL.

      <asp:SqlDataSource ID="TestJobSqlDataSource" runat="server" 
         ConnectionString="<%$ ConnectionStrings:TestJobSiteConnectionString %>" 
         DeleteCommand="DeleteTestJob" DeleteCommandType="StoredProcedure" 
         InsertCommand="AddTestJobID" InsertCommandType="StoredProcedure" 
         SelectCommand="SelectTestJob" SelectCommandType="StoredProcedure" 
         UpdateCommand="UpdateTestJob" UpdateCommandType="StoredProcedure">
         <DeleteParameters>
             <asp:QueryStringParameter Name="TestJobID" QueryStringField="TestJobID" 
                 Type="String" />
         </DeleteParameters>
         <InsertParameters>
             <asp:ControlParameter ControlID="testjobFormView1" Name="Name" 
                 PropertyName="SelectedValue" Type="String" />
         </InsertParameters>
         <SelectParameters>
             <asp:QueryStringParameter Name="TestJobID" QueryStringField="TestJobID" 
                 Type="String" />
         </SelectParameters>
         <UpdateParameters>
             <asp:QueryStringParameter Name="TestJobID" QueryStringField="TestJobID" 
                 Type="String" />
             <asp:ControlParameter ControlID="testjobFormView1" Name="Name" 
                 PropertyName="SelectedValue" Type="String" />
         </UpdateParameters>
     </asp:SqlDataSource>
      
  2. Процедура УДАЛЕНИЯ не получала @TestJobID, и я не мог понять, пока не проверил ItemTemplate в FormView. Есть 2 ссылки (метка формы и URL); Я просто удалил TestJobID, отображаемый в виде метки в форме, сохранил и перестроил, и это сработало! Исправленная форма теперь отображается ниже.

     <ItemTemplate>
        TestJobID:
    
        <br />
        Name:
        <asp:Label ID="NameLabel" runat="server" Text='<%# Bind("Name") %>' />
        <br />
        <asp:LinkButton ID="EditButton" runat="server" CausesValidation="False" 
            CommandName="Edit" Text="Edit" />
        amp;nbsp;<asp:LinkButton ID="DeleteButton" runat="server" CausesValidation="False" 
            CommandName="Delete" Text="Delete" />
        amp;nbsp;<asp:LinkButton ID="NewButton" runat="server" CausesValidation="False" 
            CommandName="New" Text="New" />
    </ItemTemplate>
      

Спасибо Стиву Уэлленсу и StackOverflow за вашу помощь. Я надеюсь, что эта работающая сейчас небольшая тестовая программа CRUD пригодится для asp.net разработчики, которые стремятся использовать уникальные идентификаторы.