我有一个asp.net应用程序,我在其中使用链接到SqlDataSource的GridView插入到sql表中。问题是我不知道插入时使用的'Identity'参数。 'Identity'列应该自动递增,但是在插入时,我得到一个异常,即Identity param不能为null。我如何制作插入语句以使其有效或如何获得下一个正确的标识#来指定?感谢。
这是我的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>
答案 0 :(得分:3)
您需要将参数方向设置为OUTPut,以获取标识值。来自MSDN
并处理onInserted事件以获取身份值
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>
答案 1 :(得分:1)
您应该从insert语句中省略Identity列。仅包含数据列。然后,Sql Server将创建自动增量。
INSERT INTO [Vehicles] ([CarNum], [MaxPassengers], [Status], [CurrPassengers], [StartAdd], [EndAdd], [AvgRideTime], [numRides]) VALUES (@CarNum, @MaxPassengers, @Status, @CurrPassengers, @StartAdd, @EndAdd, @AvgRideTime, @numRides)
答案 2 :(得分:1)
Ever Present,假设Identity是一个自动增加的列。它可能只是一个常规列。
在尝试插入之前,您需要先以某种方式检索最新的Identity。
或者,您可以在数据库上编写一个触发器,在添加新项目时自动更新Identity列。
答案 3 :(得分:1)
这些片段可能会有所帮助:
<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();"