`
isiqi
  • 浏览: 16077903 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

ASP.NET - 对 ObjectDataSource 控件使用参数

阅读更多

ObjectDataSource 控件基于 SelectMethodInsertMethodUpdateMethod DeleteMethod 属性中所标识的方法名称以及组成业务对象方法签名的参数名来调用业务对象方法。在业务对象中创建方法时,必须确保业务对象方法所接受的参数名和类型与 ObjectDataSource 控件传递的参数名和类型匹配。(参数顺序并不重要。)

一、使用参数

同所有的数据源控件一样,ObjectDataSource 控件在运行时接受输入参数,并在参数集合中对参数进行管理。每一项数据操作都有一个相关的参数集合。对于选择操作,可以使用 SelectParameters 集合;对于更新操作,可以使用 UpdateParameters 集合,依此类推。

可以为每个参数指定名称、类型、方向和默认值。对于从特定对象(例如,控件、会话变量或用户配置文件)获取值的参数,需要设置其他属性。例如,对于 ControlParameter 对象,需要设置 ControlID 属性以标识要获取参数值的控件,以及设置 PropertyName 属性以标识包含参数值的属性。

下面的代码示例演示一个可以通过 ObjectDataSource 控件调用的 Select 方法。该方法从数据源获取参数并选择单个记录。

[DataObjectMethod(DataObjectMethodType.Select)]

public static DataTable GetEmployee(int EmployeeID)

{

if (!_initialized) { Initialize(); }

SqlConnection conn = new SqlConnection(_connectionString);

SqlDataAdapter da =

new SqlDataAdapter("SELECT EmployeeID, LastName, FirstName, Address, City, Region, PostalCode FROM Employees WHERE EmployeeID = @EmployeeID", conn);

da.SelectCommand.Parameters.Add("@EmployeeID", SqlDbType.Int).Value = EmployeeID;

DataSet ds = new DataSet();

try

{

conn.Open();

da.Fill(ds, "Employees");

}

catch (SqlException e)

{

// Handle exception.

}

finally

{

conn.Close();

}

if (ds.Tables["Employees"] != null)

return ds.Tables["Employees"];

return null;

}

二、为 InsertUpdate Delete 方法传递参数

ObjectDataSource 控件基于 InsertParametersUpdateParameters DeleteParameters 集合,分别确定要为插入、更新或删除操作调用的方法。另外,ObjectDataSource 控件将基于支持自动更新、插入和删除操作的数据绑定控件(例如 GridView FormView 控件)所传递的值自动创建参数。

下面的代码示例演示一个可由 ObjectDataSource 控件调用的方法。该方法可以更新 Northwind 示例数据库中的雇员信息。

[DataObjectMethod(DataObjectMethodType.Update)]

public static bool UpdateEmployee(int EmployeeID, string FirstName, string LastName,

string Address, string City, string Region, string PostalCode)

{

if (String.IsNullOrEmpty(FirstName))

throw new ArgumentException("FirstName cannot be null or an empty string.");

if (String.IsNullOrEmpty(LastName))

throw new ArgumentException("LastName cannot be null or an empty string.");

if (Address == null) { Address = String.Empty; }

if (City == null) { City = String.Empty; }

if (Region == null) { Region = String.Empty; }

if (PostalCode == null) { PostalCode = String.Empty; }

if (!_initialized) { Initialize(); }

SqlConnection conn = new SqlConnection(_connectionString);

SqlCommand cmd = new SqlCommand("UPDATE Employees " +

" SET FirstName=@FirstName, LastName=@LastName, " +

" Address=@Address, City=@City, Region=@Region, " +

" PostalCode=@PostalCode " +

" WHERE EmployeeID=@EmployeeID", conn);

cmd.Parameters.Add("@FirstName", SqlDbType.VarChar, 10).Value = FirstName;

cmd.Parameters.Add("@LastName", SqlDbType.VarChar, 20).Value = LastName;

cmd.Parameters.Add("@Address", SqlDbType.VarChar, 60).Value = Address;

cmd.Parameters.Add("@City", SqlDbType.VarChar, 15).Value = City;

cmd.Parameters.Add("@Region", SqlDbType.VarChar, 15).Value = Region;

cmd.Parameters.Add("@PostalCode", SqlDbType.VarChar, 10).Value = PostalCode;

cmd.Parameters.Add("@EmployeeID", SqlDbType.Int).Value = EmployeeID;

try

{

conn.Open();

if (cmd.ExecuteNonQuery() == 0)

return false;

}

catch (SqlException e)

{

// Handle exception.

}

finally

{

conn.Close();

}

return true;

}

该代码示例假定已将 ObjectDataSource 控件的 ConflictDetection 属性设置为 OverwriteChanges。如果 ConflictDetection 属性设置为 CompareAllValues,业务对象方法必须接受数据字段原始值的参数。可以使用 OldValuesParameterFormatString 属性来区分当前值和原始值的参数。将 OldValuesParameterFormatString 属性设置为一个字符串表达式,该表达式用于设置原始值参数名称的格式,其中 {0} 字符表示字段名称。例如,如果将 OldValuesParameterFormatString 属性设置为 original_{0},名为 FirstName 的字段的当前值将由一个名为 FirstName 的参数传入,该字段的原始值将由一个名为 original_FirstName 的参数传入。

三、标识排序和分页参数

除了为 Select 业务对象方法指定 SelectParameters 对象之外,还可以包括排序和分页参数。这样您就可以对数据源对象中的数据进行排序,并将从数据源对象返回的结果限定为只返回所请求的数据页。

3.1、标识排序参数

使用 ObjectDataSource 控件的 SortParameterName 属性,可以为 Select 业务对象方法指定排序参数。SortParameterName 属性标识用于向业务对象方法传递排序列名称的参数名称。该参数为类型字符串。

某些数据绑定控件(例如 GridView 控件)可以自动向 ObjectDataSource 控件传递排序参数。在将支持排序的数据绑定控件绑定到 ObjectDataSource 控件时,该数据绑定控件将传递一个排序表达式,标识要用于对结果进行排序的数据列。例如,GridView 控件通过其 SortExpression 属性传递排序值。ObjectDataSource 控件基于为其传递的排序表达式,设置由 SortParameterName 属性所标识的参数的值。排序表达式可指定一个以上的列;指定多个列时,列名以逗号分隔。若要指定按降序排序,可以在排序表达式的排序列名称后加上 DESC 修饰符。例如,对于将 LastName FirstName 列标识为排序依据列的排列表达式,使用“LastName, FirstName”可以按升序排序,使用“LastName, FirstName DESC”可以按降序排序。

3.2标识分页参数

可以为 Select 方法指定其他参数,标识要返回的数据页。ObjectDataSource 控件支持两个标识分页参数的属性:

·StartRowIndexParameterName 属性,标识在业务对象的 Select 方法中用于指定数据页起始行的参数的名称。

·MaximumRowsParameterName 属性,标识在业务对象的 Select 方法中用于指定数据页中的行数的参数名称。

StartRowIndexParameterName MaximumRowsParameterName 属性所标识的参数都是 Int32 类型。

下面的代码示例演示一个 ObjectDataSource 控件,该控件配置为向指定业务对象的 Select 方法传递排序和分页参数:

<asp:ObjectDataSource

ID="EmployeesObjectDataSource"

runat="server"

TypeName="Samples.AspNet.Controls.NorthwindEmployee"

SortParameterName="SortColumns"

EnablePaging="true"

StartRowIndexParameterName="StartRecord"

MaximumRowsParameterName="MaxRecords"

SelectMethod="GetAllEmployees" >

</asp:ObjectDataSource>

下面的代码示例演示在上述示例中调用的 Select 业务对象方法。该业务对象方法从 Northwind 示例数据库中返回数据页,并按指定顺序排序。

public static void Initialize()

{

// Initialize data source. Use "Northwind" connection string from configuration.

if (ConfigurationManager.ConnectionStrings["Northwind"] == null ||

ConfigurationManager.ConnectionStrings["Northwind"].ConnectionString.Trim() == "")

{

throw new Exception("A connection string named 'Northwind' with a valid connection string " +

"must exist in the <connectionStrings> configuration section for the application.");

}

_connectionString =

ConfigurationManager.ConnectionStrings["Northwind"].ConnectionString;

_initialized = true;

}

// Select all employees.

[DataObjectMethod(DataObjectMethodType.Select, true)]

public static DataTable GetAllEmployees(string sortColumns, int startRecord, int maxRecords)

{

VerifySortColumns(sortColumns);

if (!_initialized) { Initialize(); }

string sqlCommand = "SELECT EmployeeID, LastName, FirstName, Address, City, Region, PostalCode FROM Employees ";

if (sortColumns.Trim() == "")

sqlCommand += "ORDER BY EmployeeID";

else

sqlCommand += "ORDER BY " + sortColumns;

SqlConnection conn = new SqlConnection(_connectionString);

SqlDataAdapter da = new SqlDataAdapter(sqlCommand, conn);

DataSet ds = new DataSet();

try

{

conn.Open();

da.Fill(ds, startRecord, maxRecords, "Employees");

}

catch (SqlException e)

{

// Handle exception.

}

finally

{

conn.Close();

}

if (ds.Tables["Employees"] != null)

return ds.Tables["Employees"];

return null;

}

//////////

// Verify that only valid columns are specified in the sort expression to avoid a SQL Injection attack.

private static void VerifySortColumns(string sortColumns)

{

if (sortColumns.ToLowerInvariant().EndsWith(" desc"))

sortColumns = sortColumns.Substring(0, sortColumns.Length - 5);

string[] columnNames = sortColumns.Split(',');

foreach (string columnName in columnNames)

{

switch (columnName.Trim().ToLowerInvariant())

{

case "employeeid":

break;

case "lastname":

break;

case "firstname":

break;

case "":

break;

default:

throw new ArgumentException("SortColumns contains an invalid column name.");

break;

}

}

}

四、参数方向

默认情况下,业务对象方法的所有参数都是输入参数。如果业务对象方法包含向 ObjectDataSource 控件返回值的输出参数,必须显式指定参数和参数方向,如对数据源控件使用参数 中所述。

下面的代码示例演示一个配置为接受 Int32 类型的输出参数的 ObjectDataSource 控件。out 参数返回一个由 InsertMethod 属性所指定的方法自动生成的主键值。

<asp:ObjectDataSource

ID="EmployeeDetailsObjectDataSource"

runat="server"

TypeName="Samples.AspNet.Controls.NorthwindEmployee"

SelectMethod="GetEmployee"

UpdateMethod="UpdateEmployee"

DeleteMethod="DeleteEmployee"

InsertMethod="InsertEmployee"

OnInserted="EmployeeDetailsObjectDataSource_OnInserted" >

<SelectParameters>

<asp:Parameter Name="EmployeeID" />

</SelectParameters>

<InsertParameters>

<asp:Parameter Name="NewEmployeeID" Direction="Output"

Type="Int32" DefaultValue="0" />

</InsertParameters>

</asp:ObjectDataSource>

下面的代码示例演示以输出参数的形式返回主键值的 Insert 业务对象方法。

[DataObjectMethod(DataObjectMethodType.Insert)]

public static bool InsertEmployee(out int NewEmployeeID, string FirstName, string LastName,

string Address, string City, string Region, string PostalCode)

{

if (String.IsNullOrEmpty(FirstName))

throw new ArgumentException("FirstName cannot be null or an empty string.");

MsoNorm

分享到:
评论

相关推荐

    ASP.NET 控件的使用

    9.3 在SqlDataSource控件中使用ASP.NET参数 271 9.3.1 使用ASP.NET参数对象 272 9.3.2 使用ASP.NET的Control-Parameter对象 274 9.3.3 使用ASP.NET的Cookie-Parameter对象 277 9.3.4 使用ASP.NET的Form-Parameter...

    ASP.NET2.0 ObjectDataSource的使用详解[转载--李万宝]

    ObjectDataSource 控件对象模型类似于 SqlDataSource 控件。ObjectDataSource 公开一个 TypeName 属性(而不是 ConnectionString 属性),该属性指定要实例化来执行数据操作的对象类型(类名)。类似于 ...

    ASP.NET中 ObjectDataSource控件的DataObjectTypeName属性

    获取或设置某个类的名称,ObjectDataSource 控件将该类用于更新、插入或删除数据操作中的参数,而不是从数据绑定控件传递个别的值。 您不用指定传递给 Update、Insert 和 Delete 方法的多个参数,而是可以创建一个...

    asp.net 使用ObjectDataSource控件在ASP.NET中实现Ajax真分页

    ASP.NET 3.5中新增加的ListView控件是一个用于页面数据绑定和界面布局的非常棒的控件,它在ASP.NET 2.0 GridView的基础上做了很多改进,用户在使用时可以控制的元素更多,开发时的灵活性更大了,个人觉得ListView在...

    ASP.NET.4揭秘

    9.3 在sqldatasource控件中使用asp.net参数308 9.3.1 使用asp.net参数对象308 9.3.2 使用asp.net的controlparameter对象311 9.3.3 使用asp.net的cookieparameter对象315 9.3.4 使用asp.net的formparameter对象317 ...

    asp.net知识库

    使用 ASP.NET 2.0 ObjectDataSource 控件 ASP.NET 2.0 的内部变化 使用SQL Cache Dependency 代替 Ibatisnet 提供的CacheModel ASP.NET 2.0中小心Profile命名冲突 使用ASP.NET 2.0 Profile存储用户信息[翻译] Level ...

    给ASP.NET中的TreeView绑定DataSet或ObjectDataSource对象

    给ASP.NET中的TreeView绑定DataSet或ObjectDataSource对象

    零基础学ASP.NET 2.0电子书&源代码绝对完整版1

    示例描述:本章演示ASP.NET 2.0网站的预编译以及学习ASP.NET 2.0的前置知识。 WebSite文件夹 创建的ASP.NET 2.0 Web站点。 www文件夹 第一个用C#开发的Web应用程序。 bianyi.bat 编译网站的批处理文件。 ...

    ASP.NET3.5控件详解

    VS2008中实际项目中用到的各种控件,包括ASP.NET3.5的大部分控件的使用方法和技巧,各种控件属性以及各种控件方法应用大全。 包括各种基本控件,各种验证控件,各种列表控件,SqlDataSource控件,ObjectDataSource...

    使用ObjectDataSource控件快速建立N层架构

    深入挖掘ASP.NET 2.0系列课程:使用ObjectDataSource控件快速建立N层架构

    ASP.NET4高级程序设计第4版 带目录PDF 分卷压缩包 part1

    7.3.7 使用参数化命令 7.3.8 调用存储过程 7.4 事务 7.4.1 事务和ASP.NET应用程序 7.4.2 隔离级别 7.4.3 保存点 7.5 提供程序无关的代码 7.5.1 创建工厂 7.5.2 用工厂创建对象 7.5.3 使用提供...

    ASP.NET 3.5 开发大全11-15

    11.4.3 ASP.NET登录控件的使用 11.5 自定义控件实例 11.5.1 ASP.NET分页控件 11.5.2 ASP.NET分页控件的使用 11.6 小结 第12章 ASP.NET的皮肤、主题和母版页 12.1 皮肤和主题 12.1.1 CSS简介 12.1.2 CSS基础 12.1.3 ...

    ASP.NET 3.5 开发大全1-5

    11.4.3 ASP.NET登录控件的使用 11.5 自定义控件实例 11.5.1 ASP.NET分页控件 11.5.2 ASP.NET分页控件的使用 11.6 小结 第12章 ASP.NET的皮肤、主题和母版页 12.1 皮肤和主题 12.1.1 CSS简介 12.1.2 CSS基础 12.1.3 ...

    asp.net教学讲义

    11.2 ObjectDataSource控件 171 11.2.1 技术内幕 171 11.2.2 实现数据检索示例 172 11.2.3 使用参数 174 第十二章:用户控件和自定义控件 176 12.1 用户控件和自定义控件概述 176 12.2 什么时候使用用户控件 176 ...

    ASP.NET三层架构

    走过Asp.net学习入门阶段后,真正开始着手开发一个Web项目时,才发现错综复杂的数据与关联根本就不是SqlDataSource和AccessDataSource数据源控件能简单解决的,而恰恰是被忽视了的一个ObjectDataSource数据源控件才...

    在ASP.NET 2.0中操作数据之五十六:使用ObjectDataSource缓存数据

    导言  就计算机科学而言,caching就是将所需要的数据...同样我们可以通过ObjectDataSource 和SqlDataSource控件,在控件级(control level)对数据进行缓存;同时,ASP.NET的data cache提供了丰富的缓存接口(caching

    深入挖掘ASP.NET 2.0系列课程(2):使用ObjectDataSource控件快速建立N层架构

    内含ppt,视频,文档,示例,非常好!!!!!!!!!!!!!!!!!

    ASP.NET教学讲义,完整章节

    11.2 ObjectDataSource控件 180 第十二章:用户控件和自定义控件 185 12.1 用户控件和自定义控件概述 185 12.2 什么时候使用用户控件 185 12.3 创建用户控件 185 12.4 创建自定义控件 187 第十三章:配置和错误处理 ...

Global site tag (gtag.js) - Google Analytics