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

当我们使用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

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值