【问题标题】:asp.net sqldatasource parameter not supplied未提供 asp.net sqldatasource 参数
【发布时间】:2014-06-28 16:48:56
【问题描述】:

我正在 asp.net 框架 4 中创建一个非常简单的 CRUD(CREATE、READ、UPDATE、DELETE)测试程序,它需要一个表 id 作为唯一标识符和主键。我决定让 SQLServer 创建唯一标识符。

我需要让删除存储过程工作。

该程序在通过存储过程访问的 Webforms 页面中使用 SQLDatasource 和 FormView。

我可以创建、读取和更新数据,但不能删除数据。尝试删除时收到以下错误:

“程序或函数 '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" />
            &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" />
            &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" />
            &nbsp;<asp:LinkButton ID="DeleteButton" runat="server" CausesValidation="False" 
                CommandName="Delete" Text="Delete" />
            &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 异常, Boolean breakConnection, Action1 wrapCloseInAction) +1767866 System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action1 wrapCloseInAction) +5352418 System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose) +244
System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler、SqlDataReader 数据流、 BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean & dataReady) +1691
System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior,字符串 resetOptionsString) +269
System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior、RunBehavior runBehavior、布尔 returnStream、布尔 异步,Int32 超时,任务和任务,布尔 asyncWrite,SqlDataReader ds) +1406
System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior、RunBehavior、runBehavior、布尔返回流、字符串 方法,TaskCompletionSource1 completion, Int32 timeout, Task&amp; task, Boolean asyncWrite) +177 System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(TaskCompletionSource1 完成,字符串方法名,布尔型 sendToPipe,Int32 超时, 布尔异步写入)+205
System.Data.SqlClient.SqlCommand.ExecuteNonQuery() +160
System.Web.UI.WebControls.SqlDataSourceView.ExecuteDbCommand(DbCommand 命令,DataSourceOperation 操作)+380
System.Web.UI.WebControls.SqlDataSourceView.ExecuteDelete(IDictionary 键,IDictionary oldValues) +568
System.Web.UI.DataSourceView.Delete(IDictionary 键,IDictionary oldValues,DataSourceViewOperationCallback 回调)+84
System.Web.UI.WebControls.FormView.HandleDelete(字符串 commandArg) +793 System.Web.UI.WebControls.FormView.HandleEvent(EventArgs e, Boolean CauseValidation, 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.LinkBut​​ton.OnCommand(CommandEventArgs e) +121 System.Web.UI.WebControls.LinkBut​​ton.RaisePostBackEvent(字符串事件参数)+156
System.Web.UI.WebControls.LinkBut​​ton.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 服务器

创建表

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

存储过程:删除

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

存储过程:添加条目

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

存储过程:READ

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

【问题讨论】:

  • url的查询字符串中是否有名为TestJobID的查询参数?
  • 是的,有。编辑过程工作并从 URL 读取参数。删除不知何故没有拿起它。我尝试过手动编写它,从编辑参数中复制它,甚至从 sqldatasource 配置向导生成它。

标签: c# asp.net sql-server parameters sqldatasource


【解决方案1】:

编辑和删除功能出现问题。

  1. 编辑功能不起作用!原因是 SELECT 存储过程不正确;它将第一条记录放在表中。如果您更改 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 PARAMETER。参数必须是查询字符串;因为它正在从 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. DELETE 过程没有获取@TestJobID,直到我检查了FormView 中的ItemTemplate,我才弄清楚。有 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" />
        &nbsp;<asp:LinkButton ID="DeleteButton" runat="server" CausesValidation="False" 
            CommandName="Delete" Text="Delete" />
        &nbsp;<asp:LinkButton ID="NewButton" runat="server" CausesValidation="False" 
            CommandName="New" Text="New" />
    </ItemTemplate>
    

感谢 Steve Wellens 和 StackOverflow 的帮助。我希望这个正在运行的小 CRUD 测试程序对热衷于使用唯一标识符的 asp.net 开发人员有用。

【讨论】:

    猜你喜欢
    • 2015-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-17
    相关资源
    最近更新 更多