Есть таблица в БД (ключевое поле — identity)
Необходимо сделать форму, через которую пользователь смог бы добавлять новые записи в таблицу.
Решил использовать FormView для этих целей.
В качестве источника данных решил использовать SqlDataSource.
Предполагал, что когда пользователь заполнить форму и нажмет сохранить, форма перейдет из режима вставки в режим редактирования.
Основная проблема, с которой столкнулся — это получить идентификатор вставленной SqlDataSourc'ом записи.
FormView:
<asp:FormView ID="FormView" runat="server" DataSourceID="DataSource" OnItemInserted="FormView_ItemInserted">
<InsertItemTemplate>
<table style="border: none;">
<tr>
<td>
<asp:Label runat="server" Text='Наименование' />
</td>
<td>
<asp:TextBox ID="fldname" runat="server" Text='<%# Bind("Name") %>'></asp:TextBox>
</td>
</tr>
<tr>...
</tr>
...
</table>
</InsertItemTemplate>
<EditItemTemplate>
...
</EditItemTemplate>
</asp:FormView>
SqlDataSource:
<asp:SqlDataSource ID="DataSource" runat="server" ConnectionString="<%$ ConnectionStrings:SqlConnectionString %>"
ProviderName="<%$ ConnectionStrings:SqlConnectionString.ProviderName %>"
SelectCommand="SELECT * FROM [table] WHERE Id = @Id"
UpdateCommand="UPDATE [table]SET Name = @Name,... WHERE Id = @Id;"
InsertCommand="INSERT [table]VALUES (@Name, ...)"
OnInserted="DataSource_Inserted">
<SelectParameters>
<asp:Parameter Name="Id" />
</SelectParameters>
<InsertParameters>
<asp:Parameter Name="Name" Type="String" />
...
</InsertParameters>
<UpdateParameters>
<asp:Parameter Name="Name" Type="String" />
...
</UpdateParameters>
</asp:SqlDataSource>
protected void FormView_ItemInserted(object sender, FormViewInsertedEventArgs e)
{
FormView.DefaultMode = FormViewMode.Edit;
}
protected void DataSource_Inserted(object sender, SqlDataSourceStatusEventArgs e)
{
// Предполагал сделать здесь редирект на страницу с Id вставленной записи
}
В качестве параметров Insert_Command можно задать и такие:
<asp:Parameter Name="Id" Direction="Output" />
Предполагал, что если напишу
InsertCommand="INSERT [table]VALUES (@Name, ...) SELECT @Id=SCOPE_IDENTITY()"
, то смогу получить идентификатор вставленной записи, однако ни через FormViewInsertedEventArgs, ни через SqlDataSourceStatusEventArgs
подобраться к выходным параметрам нельзя.
Знает ли почтенная публика, как решается подобная задача?
Вообщем сам спросил — сам ответил:
<asp:Parameter Name="Id" Direction="Output" Type="Int32"/>
protected void DataSource_Inserted(object sender, SqlDataSourceStatusEventArgs e)
{
// Редирект на страницу с Id вставленной записи
Response.Redirect("Form.aspx?Id=" + e.Command.Parameters["@Id"].Value);
}
Здравствуйте, Andrey Yakovlev, Вы писали:
AY>Вообщем сам спросил — сам ответил:
AY>AY><asp:Parameter Name="Id" Direction="Output" Type="Int32"/>
AY>
AY>AY>protected void DataSource_Inserted(object sender, SqlDataSourceStatusEventArgs e)
AY>{
AY> // Редирект на страницу с Id вставленной записи
AY> Response.Redirect("Form.aspx?Id=" + e.Command.Parameters["@Id"].Value);
AY>}
AY>
И конечно же необходимо изменить InsertCommand:
InsertCommand="INSERT [table]VALUES (@Name, ...) SET @Id = SCOPE_IDENTITY()"