您的位置:首页 > 产品设计 > UI/UE

使用DetailsView的数据插入功能时,如何初始化参数,如何取得新纪录的主键(主键类型为uniqueidentifier)

2006-02-17 18:29 961 查看
当我们使用ASP.NET2.0的数据插入功能时,数据表必须有主键。很多情况下,我们需要得到新纪录的主键值。这里介绍一下我遇到的一个问题。以及如何解决的。

我的数据显示控件是DetailsView1,通过一个SqlDataSource2数据控件和SQL数据库连接。对数据表ContactInfo进行插入修改删除操作。主键是ContactID,数据类型是uniqueidentifier。SqlDataSource2的插入操作调用一个存储过程spContactInfo_ContactAdd来完成,其中最后一个参数返回的是新纪录的主键值。

1 在程序中如何取得主键值。

SqlDataSource有两个事件

On_Inserting:事件在开始插入前执行,我们在这个事件中初始化参数,

On_Inserted:这个事件法在插入操作完成后触发,我们在这个事件中取返回参数的值

protected void SqlDataSource2_Inserted(object sender, SqlDataSourceStatusEventArgs e)
{
ViewState["ContactID"] = e.Command.Parameters["@ContactID"].Value.ToString();
}

2 如果主键不是int值,需要先初始化返回参数,才能正确接收返回参数。

需要注意的是,当你在VS2005中通过Wizard配置SqlDataSource2的时候,如果选择的是存储过程,系统会自动为你创建所有的插入参数。不需要你手工创建。而且系统会自动为你初始化这些参数。不过,有些列不是直接通过textbox输入的,如一些需要从dropdownlist中选取的外键值,这种情况系统不会为你自动初始化这些值,需要你在On_Inserting事件中自己处理。对于返回参数也是这样的,系统不会自动为你的参数复制。而且最可恼的是,如果返回参数是字符串,你一定要在初始化时给出足够的空间,否则超出的部分会被自动截断!

下面是我的程序

protected void SqlDataSource2_Inserting(object sender, SqlDataSourceCommandEventArgs e)
{

//取得城市列表中选中的值,赋给Parameters["@City"]。
DetailsViewRow row = DetailsView1.Rows[DetailsView1.Rows.Count - 3];
DropDownList listcity = (DropDownList)row.Cells[1].FindControl("DropDownListCity");
if (listcity.SelectedValue != null && listcity.SelectedValue != string.Empty)
{
e.Command.Parameters["@City"].Value = listcity.SelectedValue;
}

//
row = DetailsView1.Rows[DetailsView1.Rows.Count - 2];
DropDownList list = (DropDownList)row.Cells[1].FindControl("DropDownListProviences");
if (list.SelectedValue != null && list.SelectedValue != string.Empty)
{
e.Command.Parameters["@Province"].Value = list.SelectedValue;
}
e.Command.Parameters["@ContactID"].Value = "00000000000000000000";
}

一开始,我没有为e.Command.Parameters["@ContactID"].Value赋值,结果系统执行存储过程失败,因为参数没有被初始化。

当我为e.Command.Parameters["@ContactID"].Value = string.Empty; 时,系统返回参数总是空的,我把初始化改为e.Command.Parameters["@ContactID"].Value = "1"后,系统返回的是第一个字符。后面的都被截断!

SqlDataSource2的定义如下:

<asp:SqlDataSource ID="SqlDataSource2" runat="server" ConnectionString="<%$ ConnectionStrings:DBConnectionString %>"
DeleteCommand="DELETE FROM [ContactInfo] WHERE [ContactID] = @ContactID"
InsertCommand="spContactInfo_ContactAdd"
SelectCommand="SELECT [ContactID], [LastName], [FirstName], [WorkPhone], [EnglishName], [Email], [MobilePhone], [Address], [City] ,[Province] FROM [ContactInfo] WHERE ([ContactID] = @ContactID)"
UpdateCommand="UPDATE [ContactInfo] SET [LastName] = @LastName, [FirstName] = @FirstName, [WorkPhone] = @WorkPhone, [EnglishName] = @EnglishName, [Province] = @Province, [Email] = @Email, [MobilePhone] = @MobilePhone, [Address] = @Address, [City] = @City WHERE [ContactID] = @ContactID"
OnInserting="SqlDataSource2_Inserting"
OnUpdating="SqlDataSource2_Updating"
InsertCommandType="StoredProcedure"
OnInserted="SqlDataSource2_Inserted"
>
<DeleteParameters>
<asp:Parameter Name="ContactID" Type="Object" />
</DeleteParameters>
<UpdateParameters>
<asp:Parameter Name="LastName" Type="String" />
<asp:Parameter Name="FirstName" Type="String" />
<asp:Parameter Name="WorkPhone" Type="String" />
<asp:Parameter Name="EnglishName" Type="String" />
<asp:Parameter Name="Province" Type="Object" />
<asp:Parameter Name="Email" Type="String" />
<asp:Parameter Name="MobilePhone" Type="String" />
<asp:Parameter Name="Address" Type="String" />
<asp:Parameter Name="City" Type="Object" />
<asp:Parameter Name="ContactID" Type="Object" />
</UpdateParameters>
<SelectParameters>
<asp:ControlParameter ControlID="GridView1" Name="ContactID" PropertyName="SelectedValue"
Type="Object" />
</SelectParameters>
<InsertParameters>
<asp:Parameter Name="FirstName" Type="String" />
<asp:Parameter Name="LastName" Type="String" />
<asp:Parameter Name="EnglishName" Type="String" />
<asp:Parameter Name="WorkPhone" Type="String" />
<asp:Parameter Name="MobilePhone" Type="String" />
<asp:Parameter Name="Email" Type="String" />
<asp:Parameter Name="Address" Type="String" />
<asp:Parameter Name="City" Type="String" />
<asp:Parameter Name="Province" Type="String" />
<asp:Parameter Direction="InputOutput" Name="ContactID" Type="String" />
</InsertParameters>
</asp:SqlDataSource>

存储过程spContactInfo_ContactAdd2定义:
CREATE PROCEDURE dbo.spContactInfo_ContactAdd
@FirstName varchar(50),
@LastName varchar(50),
@EnglishName varchar(50),
@WorkPhone varchar(50),
@MobilePhone varchar(50),
@Email varchar(50),
@Address varchar(500),
@City varchar(50),
@Province varchar(50),
@ContactID varchar(50) out
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐