ASP.NET:SqlDataSource插入-标识参数

本文关键字:标识 参数 插入 SqlDataSource NET ASP | 更新日期: 2023-09-27 18:22:02

我有一个asp.net应用程序,在该应用程序中,我将使用链接到SqlDataSource的GridView插入sql表。问题是我不知道插入时要使用的"Identity"参数。"Identity"列应该自动递增,但是在插入时,我得到一个异常,即Identity参数不能为null。我如何制作insert语句以使其工作,或者如何获得要指定的下一个正确标识#?谢谢

这是我的SqlDataSource代码:

 <asp:SqlDataSource ID="VehiclesSqlDS" runat="server" 
        ConnectionString="<%$ ConnectionStrings:RamRideOpsConnectionString %>" 
        SelectCommand="SELECT * FROM [Vehicles]" 
        ConflictDetection="CompareAllValues" 
        InsertCommand="INSERT INTO [Vehicles] ([Identity], [CarNum], [MaxPassengers], [Status], [CurrPassengers], [StartAdd], [EndAdd], [AvgRideTime], [numRides]) VALUES (@Identity, @CarNum, @MaxPassengers, @Status, @CurrPassengers, @StartAdd, @EndAdd, @AvgRideTime, @numRides)" 
        OnInserting="VehiclesSqlDS_Insert"
        OldValuesParameterFormatString="original_{0}">         
        <InsertParameters>
            <asp:Parameter Name="Identity" Type="Int32 "/>
            <asp:Parameter Name="CarNum" Type="Int32" DefaultValue="-1"/>
            <asp:Parameter Name="MaxPassengers" Type="Int32" DefaultValue="3" />
            <asp:Parameter Name="Status" Type="String" DefaultValue="Ready" />
            <asp:Parameter Name="CurrPassengers" Type="Int32" DefaultValue="0" />
            <asp:Parameter Name="StartAdd" Type="String" />
            <asp:Parameter Name="EndAdd" Type="String" />
            <asp:Parameter DbType="Time" Name="AvgRideTime" />
            <asp:Parameter Name="numRides" Type="Int32" DefaultValue="0" />
        </InsertParameters>        
    </asp:SqlDataSource>

ASP.NET:SqlDataSource插入-标识参数

您需要将参数方向设置为OUTPut,以获得标识值。来自MSDN

并处理要获取的插入事件,标识值

protected void SqlDataSource1_Inserted(object sender, SqlDataSourceStatusEventArgs e)
    {
        string sID = e.Command.Parameters["@Identity"].Value.ToString();
       //Display new ID
    }

你可以这样试试。

<asp:sqlDataSource ID="Datasource" 
  SelectCommand="SELECT EmployeeID, LastName, FirstName FROM Employees WHERE EmployeeID = @EmpID"
  InsertCommand="INSERT INTO Employees(LastName, FirstName) VALUES (@LastName, @FirstName); 
                 SELECT @EmpID = SCOPE_IDENTITY()"
  UpdateCommand="UPDATE Employees SET LastName=@LastName, FirstName=@FirstName 
                   WHERE EmployeeID=@EmployeeID"
  DeleteCommand="DELETE Employees WHERE EmployeeID=@EmployeeID"
  ConnectionString="<%$ ConnectionStrings:NorthwindConnection %>"
  OnInserted="EmployeeDetailsSqlDataSource_OnInserted"
  RunAt="server">
  <SelectParameters>
    <asp:Parameter Name="EmpID" Type="Int32" DefaultValue="0" />
  </SelectParameters>
  <InsertParameters>
    <asp:Parameter Name="EmpID" Direction="Output" Type="Int32" DefaultValue="0" />
  </InsertParameters>
</asp:sqlDataSource>

您应该从insert语句中省略Identity列。仅包括数据列。Sql Server将创建自动增量。

INSERT INTO [Vehicles] ([CarNum], [MaxPassengers], [Status], [CurrPassengers], [StartAdd], [EndAdd], [AvgRideTime], [numRides]) VALUES (@CarNum, @MaxPassengers, @Status, @CurrPassengers, @StartAdd, @EndAdd, @AvgRideTime, @numRides)

Ever Present,即假设Identity是一个自动递增的列。它可以只是一个常规的专栏。

在尝试插入之前,您需要先以某种方式检索最新的标识。

或者,您可以在数据库上编写一个触发器,在添加新项目时自动更新"标识"列。

这些片段可能会有所帮助:

<InsertParameters>
   <asp:Parameter Name="SalesRepID" Type="Int32" />
   ...more params
    <asp:Parameter Name="QuoteID" Type="Int32" Direction="Output" />            
</InsertParameters>

注意添加的第二个命令

InsertCommand="INSERT INTO [MyTable] (fields); SET @QuoteID = Scope_Identity();"