FormView + SqlDataSource + IDENTITY
От: Andrey Yakovlev Россия  
Дата: 18.04.08 08:03
Оценка:
Есть таблица в БД (ключевое поле — 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
подобраться к выходным параметрам нельзя.

Знает ли почтенная публика, как решается подобная задача?
Чего-то в этом супе не хватает...
Re: FormView + SqlDataSource + IDENTITY
От: Andrey Yakovlev Россия  
Дата: 18.04.08 10:48
Оценка:
Вообщем сам спросил — сам ответил:

<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);
}
Чего-то в этом супе не хватает...
Re[2]: FormView + SqlDataSource + IDENTITY
От: Andrey Yakovlev Россия  
Дата: 18.04.08 10:52
Оценка:
Здравствуйте, 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()"
Чего-то в этом супе не хватает...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.