使用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
我的数据显示控件是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
相关文章推荐
- C#------如何生成一个Guid的数据对应SQLServer中的Uniqueidentifier类型
- mysql 使用 insert ignore into和unique实现不插入重复数据功能
- 如何使用myBatis在数据库中插入数据并返回主键
- 关于 “不允许从数据类型 sql_variant 到 uniqueidentifier 的隐式转换。请使用 CONVERT 函数来运行此查询“的最终解决
- 使用Hibernate如何在Oracle中插入Date类型的数据
- LINQ to SQL 系列 如何使用LINQ to SQL插入、修改、删除数据 (转)
- 关于如何获得数据库插入操作中数据的自增长主键的值
- 使用 SQL Server 2008 数据类型-xml 字段类型参数进行数据的批量选取或删除数据
- 关于如何使用反射声明一个泛型类型变量(泛型参数是动态的)的问题
- MySQL数据表中有自增长主键时如何插入数据
- 如何多方面使用CAD中的插入对象功能?
- 回发或回调参数无效。在配置中使用 或在页面中使用 启用了事件验证。出于安全目的,此功能验证回发或回调事件的参数是否来源于最初呈现这些事件的服务器控件。如果数据有效并且是预期的,则使用 ClientScriptManager.RegisterF
- 使用java + oracle插入clob类型的数据
- asp.net中向数据库中插入数据时如何获得当前插入行的主键?
- C#中使用MySqlCommand执行插入语句后获取该数据主键id值的方法
- Java学习笔记摘录(标识符/变量是什么/如何命名变量/数据类型/变量的使用规则)
- Android开发:使用序列化接口Parcelable、Serializable实现Activity间传递复杂数据类型参数
- [Nodejs]初探nodejs学习笔记- 如何使用nodejs接收get/post 数据(参数)
- 如何让QVariant使用自定义的数据类型?