学习 ibatisnet + castle 笔记

本文分享了ibatisnet结合castle的实际应用经验,包括环境搭建、项目架构设计、配置细节等,适合初学者参考。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近想学习 ibatisnet + castle ,并想在项目中加以应用,看了网上许多资料,本以为瞒简单的,
谁想自己动手时还是费了不少功夫的 :)   ,先将自己的学习心得和自己建的项目贴出来,供大家分享和研究,
我也是初学,写的有不对的地方还望大家多多指教哈.

1.  下载castle 和 ibatisnet 的 dll文件,

    注意:目前为止,castle版本最高支持 ibatisnet 的 datamapper的版本是1.5,dataaccess 版本1.8
   
    所以需下载castle 1.0 和 ibatyisnet的 1.5 版本

2.  框架 模仿 npetshop2 的架构 并且稍做了简化,去掉了其页面采用castle控制的部分,具体框架如下:
   
    ATS.Domain  系统领域,所有数据库实体的对象,数据载体,在其他各个层都要用到
    ATS.Persistence  持久层,持久化数据到数据库,其中包括 interface(接口) 和 mapperDao(实现)
    ATS.Service  服务层,系统用到的所有业务方法,调用 ATS.Persistence层,其中包括 Implement(实现) 和 Interface(接口)
    ATS.Test  测试层 ,用 NUnit 测试
    ATS.Web   页面层(最终与用户交互)
    ATS.Common   系统公共层,公用方法和类

3.  首先需要配置 web.config 文件, 在<configuration>节点下新增 如下节点供castle使用

<? xml version="1.0" ?>
<!--  
    注意: 除了手动编辑此文件以外,您还可以使用 
    Web 管理工具来配置应用程序的设置。可以使用 Visual Studio 中的
     “网站”->“Asp.Net 配置”选项。
    设置和注释的完整列表在 
    machine.config.comments 中,该文件通常位于 
    WindowsMicrosoft.NetFrameworkv2.xConfig 中
-->
< configuration >
    
< configSections >
        
< section  name ="castle"  type ="Castle.Windsor.Configuration.AppDomain.CastleSectionHandler, Castle.Windsor" />
    
</ configSections >

    
< castle >
        
<!-- 扩展castle 将 ibatisnet 当作插件和 castle 相结合 -->
        
< include  uri ="file://facilities.config" />
        
<!-- 此文件告诉castel 哪个接口 由 哪个类 实现 -->
        
< include  uri ="file://services.config" />
    
</ castle >
    
    
< appSettings />
    
< connectionStrings />
    
< system .web >
        
<!--  
            设置 compilation debug="true" 将调试符号插入
            已编译的页面中。但由于这会 
            影响性能,因此只在开发过程中将此值 
            设置为 true。
        
-->
        
< compilation  debug ="true" />
        
<!--
            通过 <authentication> 节可以配置 ASP.NET 使用的 
            安全身份验证模式,
            以标识传入的用户。 
        
-->
        
< authentication  mode ="Windows" />
        
<!--
            如果在执行请求的过程中出现未处理的错误,
            则通过 <customErrors> 节可以配置相应的处理步骤。具体说来,
            开发人员通过该节可以配置
            要显示的 html 错误页
            以代替错误堆栈跟踪。

        <customErrors mode="RemoteOnly" defaultRedirect="GenericErrorPage.htm">
            <error statusCode="403" redirect="NoAccess.htm" />
            <error statusCode="404" redirect="FileNotFound.htm" />
        </customErrors>
        
-->
    
</ system.web >
</ configuration >

使用以上配置时,需要将所有配置文件默认放在web应用程序的根目录下,castle 会自动从 web.config中读取

4.  配置 facilities.config 文件 (程序根目录下)

<? xml version="1.0" encoding="utf-8"  ?>
    
< configuration >

        
< facilities >
            
<!-- 为Castle 扩展 ibatisnet -->
            
< facility  id ="ibatis"  type ="Castle.Facilities.IBatisNetIntegration.IBatisNetFacility, Castle.Facilities.IBatisNetIntegration"   >
                
< sqlMap  id ="sqlServerSqlMap"  config ="sqlMap.config"   />
            
</ facility >
            
<!-- 为Castle 扩展 事务处理功能 -->
            
< facility  id ="transaction"  type ="Castle.Facilities.AutomaticTransactionManagement.TransactionFacility, Castle.Facilities.AutomaticTransactionManagement"   />

        
</ facilities >
    
</ configuration >

这样 castle 就可以自动将 ibatisnet 管理起来了,需要ibatisnet的时候会自动运行 ibatisnet

5.  配置 services.config 文件

<? xml version="1.0" encoding="utf-8"  ?>
    
< configuration >
        
< components >
            
< component
                      
id ="Employees"
                      service
="ATS.Service.Interface.IEmployeesService, ATS.Service"
                      type
="ATS.Service.Implement.EmployeesService, ATS.Service"   />

        
</ components >
    
</ configuration >

可以发现: 服务(接口) IEmployeesService 由 EmployeesService 类实现 ,castle 会自动装配,
    即在请求需要调用IEmployeesService 接口中的方法时,会自动实例化EmployeesService类,并调用其中相应的方法

6.  编写ibatisnet 的配置文件 sqlmap.config

<? xml version="1.0" encoding="utf-8"  ?>
    
< sqlMapConfig 
      
xmlns ="http://ibatis.apache.org/dataMapper"  
      xmlns:xsi
="http://www.w3.org/2001/XMLSchema-instance" >

        
< settings >
            
< setting  useStatementNamespaces ="false" />
        
</ settings >

        
<!-- database providers -->
        
< providers  resource ="providers.config" />

        
<!--  Database connection information  -->
        
< database >
            
< provider  name ="sqlServer2.0" />
            
< dataSource  name ="DocumentSystem"  connectionString ="server=.SQLExpress;database=Northwind;uid=sa;pwd=" />
        
</ database >

        
< sqlMaps >
            
<!-- 设置sqlmap,所有实体的数据库操作 -->
            
< sqlMap  resource ="../ATS.Persistence/Maps/Employees.xml"   />
        
</ sqlMaps >

    
</ sqlMapConfig >

以上设置 ibatisnet 对实体进行数据库操作的 sqlmap.

7.  设置 dao.config 文件

<? xml version="1.0" encoding="utf-8" ?>
    
< daoConfig  xmlns ="http://ibatis.apache.org/dataAccess"  xmlns:xsi ="http://www.w3.org/2001/XMLSchema-instance" >
        
<!-- Optional if resource -->

        
< providers  resource ="providers.config" />

        
< context  id ="SqlMapDao"  default ="true" >


            
<!-- ==== Sql Server : SqlClient configuration ========= -->


            
< database >
                
< provider  name ="sqlServer2.0" />
                
< dataSource  name ="Airfares"  connectionString ="server=.SQLExpress;database=Northwind;user id=sa;password=;" />
            
</ database >

            
< daoSessionHandler  id ="SqlMap" >
                
< property  name ="resource"  value ="sqlMap.config" />
            
</ daoSessionHandler >

            
< daoFactory >
                
< dao  interface ="ATS.Persistence.Interface.IEmployeesDao, ATS.Persistence"
                    implementation
="ATS.Persistence.MapperDao.EmployeesSqlMapDao, ATS.Persistence" />
            
</ daoFactory >
        
</ context >

    
</ daoConfig >

主要是 <daoFactory> 节点, 设置 dao 运行时的接口对应的实现类,即:IEmployeesDao 由 EmployeesSqlMapDao实现


8. providers.config 可以从ibatisnet的帮助文档里找到,或去网站下载

    编写 Employees.xml 文件 ,主要是编写sql语句

<? xml version="1.0" encoding="UTF-8"  ?>  
    
< sqlMap  namespace ="Employees"  xmlns ="http://ibatis.apache.org/mapping"  xmlns:xsi ="http://www.w3.org/2001/XMLSchema-instance" >  
        
< alias >
            
< typeAlias  alias ="Employees"  type ="ATS.Domain.Employees, ATS.Domain"   />
        
</ alias >
        
< resultMaps >
            
< resultMap  id ="SelectResult"  class ="Employees" >
                
< result  property ="EmployeeID"  column ="employeeid"   />
                
< result  property ="LastName"  column ="lastname"   />
                
< result  property ="FirstName"  column ="firstname"   />
                
< result  property ="Title"  column ="title"   />
                
< result  property ="TitleOfCourtesy"  column ="titleofcourtesy"   />
                
< result  property ="BirthDate"  column ="birthdate"   />
                
< result  property ="HireDate"  column ="hiredate"   />
                
< result  property ="Address"  column ="address"   />
                
< result  property ="City"  column ="city"   />
                
< result  property ="Region"  column ="region"   />
                
< result  property ="PostalCode"  column ="postalcode"   />
                
< result  property ="Country"  column ="country"   />
                
< result  property ="HomePhone"  column ="homephone"   />
                
< result  property ="Extension"  column ="extension"   />
                
< result  property ="Photo"  column ="photo"   />
                
< result  property ="Notes"  column ="notes"   />
                
< result  property ="ReportsTo"  column ="reportsto"   />
                
< result  property ="PhotoPath"  column ="photopath"   />
            
</ resultMap >
        
</ resultMaps >
        
        
< statements >
            
< select  id ="SelectEmployees"  parameterClass ="int"  resultMap ="SelectResult" >
                Select 
                      employeeid,
                      lastname,
                      firstname,
                      title,
                      titleofcourtesy,
                      birthdate,
                      hiredate,
                      address,
                      city,
                      region,
                      postalcode,
                      country,
                      homephone,
                      extension,
                      photo,
                      notes,
                      reportsto,
                      photopath
                From Employees
                
< dynamic  prepend ="WHERE" >
                    
< isParameterPresent >
                        employeeid=#EmployeeID# 
                    
</ isParameterPresent >
                
</ dynamic >
            
</ select >
            
            
< select  id ="BaseSelectEmployees"  parameterClass ="int"  resultMap ="SelectResult" >
                Select 
                      employeeid,
                      lastname,
                      firstname,
                      title,
                      titleofcourtesy,
                      birthdate,
                      hiredate,
                      address,
                      city,
                      region,
                      postalcode,
                      country,
                      homephone,
                      extension,
                      photo,
                      notes,
                      reportsto,
                      photopath
                From Employees
            
</ select >
            
            
< select  id ="ChildSelectEmployees"  parameterClass ="int"  resultMap ="SelectResult"  extends ="BaseSelectEmployees" >
                
            
</ select >
                    
            
< insert  id ="InsertEmployees"  parameterClass ="Employees" >
                Insert Into Employees (
                      employeeid,
                      lastname,
                      firstname,
                      title,
                      titleofcourtesy,
                      birthdate,
                      hiredate,
                      address,
                      city,
                      region,
                      postalcode,
                      country,
                      homephone,
                      extension,
                      photo,
                      notes,
                      reportsto,
                      photopath
                )Values(
                     #EmployeeID#,
                     #LastName#,
                     #FirstName#,
                     #Title#,
                     #TitleOfCourtesy#,
                     #BirthDate#,
                     #HireDate#,
                     #Address#,
                     #City#,
                     #Region#,
                     #PostalCode#,
                     #Country#,
                     #HomePhone#,
                     #Extension#,
                     #Photo#,
                     #Notes#,
                     #ReportsTo#,
                     #PhotoPath#
                )
            
</ insert >
            
            
< update  id ="UpdateEmployees"  parameterClass ="Employees" >
                Update Employees Set 
                    employeeid=#EmployeeID#,
                    lastname=#LastName#,
                    firstname=#FirstName#,
                    title=#Title#,
                    titleofcourtesy=#TitleOfCourtesy#,
                    birthdate=#BirthDate#,
                    hiredate=#HireDate#,
                    address=#Address#,
                    city=#City#,
                    region=#Region#,
                    postalcode=#PostalCode#,
                    country=#Country#,
                    homephone=#HomePhone#,
                    extension=#Extension#,
                    photo=#Photo#,
                    notes=#Notes#,
                    reportsto=#ReportsTo#,
                    photopath=#PhotoPath#
                
< dynamic  prepend ="WHERE" >
                    
< isParameterPresent >
                        employeeid=#EmployeeID#
                    
</ isParameterPresent >
                
</ dynamic >
            
</ update >
            
            
< delete  id ="DeleteEmployees"  parameterClass ="int" >
                Delete From Employees
                
< dynamic  prepend ="WHERE" >
                    
< isParameterPresent >
                        employeeid=#EmployeeID#
                    
</ isParameterPresent >
                
</ dynamic >
            
</ delete >
            
        
</ statements >
    
</ sqlMap >

 

9.  接下来需要在 global中初始化 castle 容器:
    1. 定义自己的容器类,这样可以在容器中初始化 ibatisnet的dao,即读取dao.config文件,将接口和实现类保存起来,
       以后使用时直接取出即可,并在castle容器中加入DaoManager 对象实例 ,代码如下:(此类放在ATS.Common 中)

         using  System;
        
using  System.Configuration;
        
using  Castle.Windsor;
        
using  IBatisNet.DataAccess;
        
using  IBatisNet.DataAccess.Configuration;

        
namespace  ATS.Common
        
{
            
/// <summary>
            
/// 自定义的容器类,初始化容器的时候,初始化dao,
            
/// 定义好的持久层的接口和实现类加载
            
/// </summary>

            public class ATSContainer : WindsorContainer
            
{
                
public ATSContainer(Castle.Windsor.Configuration.IConfigurationInterpreter inter) : base(inter)
                
{
                    
// Add DaoManager
                    DomDaoManagerBuilder builder = new DomDaoManagerBuilder();
                    builder.Configure(
@"dao.config");

                    
this.Kernel.AddComponentInstance("DaoManager"typeof(DaoManager), DaoManager.GetInstance("SqlMapDao"));
                }

            }

        }

 

2. global中初始化容器:

using  System;
        
using  System.Data;
        
using  System.Configuration;
        
using  System.Collections;
        
using  System.Web;
        
using  System.Web.Security;
        
using  System.Web.SessionState;


        
using  Castle.Windsor;
        
using  Castle.Windsor.Configuration.Interpreters;
        
using  Castle.Core.Resource;
        
using  ATS.Common;

        
namespace  ATS.Web
        
{
            
public class Global : System.Web.HttpApplication, IContainerAccessor
            
{

                
private static WindsorContainer container;

                
protected void Application_Start(object sender, EventArgs e)
                
{
                    
try
                    
{
                        
//初始化容器,采用从默认(从Web.config中读取默认块)文件中读取
                        container = new ATSContainer(new XmlInterpreter(new ConfigResource()));
                    }

                    
catch (ConfigurationException ex)
                    
{
                        
string msg = ex.Message;
                    }

                }


                
protected void Application_End(object sender, EventArgs e)
                
{
                    container.Dispose();
                }


                
IContainerAccessor Members
            }

        }

 

3. 在ATS.Common 中定义 ContainerAccessorUtil.cs类 ,此类主要用来获取容器,
            在使用时可以从容器中取出接口:

           

// 从容器中取出接口

IEmployeesService _IEmployeesService 
=  (ContainerAccessorUtil.GetContainer())[ " Employees " as  IEmployeesService;
            
// 并调用此接口的方法,系统会自动实例化实现IEmployeesService 的类,并调用其中的GetEmployeesList方法

IList
< Employees >  employees  =  _IEmployeesService.GetEmployeesList();

 

10. 定义实体类:(domain)

     namespace  ATS.Domain
    
{
        
using System;
        
        
/// <summary>
        
/// Employees 
        
/// </summary>

        [Serializable]
        
public class Employees
        
{
            
public Employees()
            
{
                
            }

            
            
private int _employeeid;
            
private string _lastname;
            
private string _firstname;
            
private string _title;
            
private string _titleofcourtesy;
            
private DateTime _birthdate;
            
private DateTime _hiredate;
            
private string _address;
            
private string _city;
            
private string _region;
            
private string _postalcode;
            
private string _country;
            
private string _homephone;
            
private string _extension;
            
private System.Byte[] _photo;
            
private string _notes;
            
private int _reportsto;
            
private string _photopath;
            
            
///<sumary>
            
/// EmployeeID
            
///</sumary>

            public int EmployeeID
            
{
                
get{return _employeeid;}
                
set{_employeeid = value;}
            }

            
///<sumary>
            
/// LastName
            
///</sumary>

            public string LastName
            
{
                
get{return _lastname;}
                
set{_lastname = value;}
            }

            
///<sumary>
            
/// FirstName
            
///</sumary>

            public string FirstName
            
{
                
get{return _firstname;}
                
set{_firstname = value;}
            }

            
///<sumary>
            
/// Title
            
///</sumary>

            public string Title
            
{
                
get{return _title;}
                
set{_title = value;}
            }

            
///<sumary>
            
/// TitleOfCourtesy
            
///</sumary>

            public string TitleOfCourtesy
            
{
                
get{return _titleofcourtesy;}
                
set{_titleofcourtesy = value;}
            }

            
///<sumary>
            
/// BirthDate
            
///</sumary>

            public DateTime BirthDate
            
{
                
get{return _birthdate;}
                
set{_birthdate = value;}
            }

            
///<sumary>
            
/// HireDate
            
///</sumary>

            public DateTime HireDate
            
{
                
get{return _hiredate;}
                
set{_hiredate = value;}
            }

            
///<sumary>
            
/// Address
            
///</sumary>

            public string Address
            
{
                
get{return _address;}
                
set{_address = value;}
            }

            
///<sumary>
            
/// City
            
///</sumary>

            public string City
            
{
                
get{return _city;}
                
set{_city = value;}
            }

            
///<sumary>
            
/// Region
            
///</sumary>

            public string Region
            
{
                
get{return _region;}
                
set{_region = value;}
            }

            
///<sumary>
            
/// PostalCode
            
///</sumary>

            public string PostalCode
            
{
                
get{return _postalcode;}
                
set{_postalcode = value;}
            }

            
///<sumary>
            
/// Country
            
///</sumary>

            public string Country
            
{
                
get{return _country;}
                
set{_country = value;}
            }

            
///<sumary>
            
/// HomePhone
            
///</sumary>

            public string HomePhone
            
{
                
get{return _homephone;}
                
set{_homephone = value;}
            }

            
///<sumary>
            
/// Extension
            
///</sumary>

            public string Extension
            
{
                
get{return _extension;}
                
set{_extension = value;}
            }

            
///<sumary>
            
/// Photo
            
///</sumary>

            public System.Byte[] Photo
            
{
                
get{return _photo;}
                
set{_photo = value;}
            }

            
///<sumary>
            
/// Notes
            
///</sumary>

            public string Notes
            
{
                
get{return _notes;}
                
set{_notes = value;}
            }

            
///<sumary>
            
/// ReportsTo
            
///</sumary>

            public int ReportsTo
            
{
                
get{return _reportsto;}
                
set{_reportsto = value;}
            }

            
///<sumary>
            
/// PhotoPath
            
///</sumary>

            public string PhotoPath
            
{
                
get{return _photopath;}
                
set{_photopath = value;}
            }

        }

    }

 

11.  定义ATS.Persistence.Interface.IEmployeesDao.cs 类

     namespace  ATS.Persistence.MapperDao
    
{
        
using System;
        
using System.Collections;
        
using System.Collections.Generic;
        
using IBatisNet.Common;
        
using IBatisNet.DataMapper;
        
using IBatisNet.Common.Exceptions;

        
using ATS.Domain;
        
using ATS.Persistence.Interface;

        
/// <summary>
        
/// EmployeesSqlMapDao
        
/// </summary>

        public class EmployeesSqlMapDao : BaseSqlMapDao, IEmployeesDao
        
{
            
public EmployeesSqlMapDao ()
            
{
                
//
                
// TODO: 此处添加EmployeesSqlMapDao的构造函数
                
//
            }


            
/// <summary>
            
/// 得到列表
            
/// </summary>

            public IList<Employees> GetEmployeesList()
            
{
                
return ExecuteQueryForList<Employees>("SelectEmployees",null);
            }


            
/// <summary>
            
/// 新建
            
/// </summary>

            public void AddEmployees(Employees employees)
            
{
                ExecuteInsert(
"InsertEmployees",employees);
            }

            
/// <summary>
            
/// 修改
            
/// </summary>

            public void UpdateEmployees(Employees employees)
            
{
                ExecuteUpdate(
"UpdateEmployees",employees);
            }

            
            
/// <summary>
            
/// 得到明细
            
/// </summary>
            
/// <param name="id"></param>
            
/// <returns></returns>

            public Employees GetEmployeesDetail(System.Int32 EmployeeID)
            
{
                
return ExecuteQueryForObject<Employees>("SelectEmployees",EmployeeID);
            }


            
/// <summary>
            
/// 删除
            
/// </summary>
            
/// <param name="id"></param>

            public void DeleteEmployees(System.Int32 EmployeeID)
            
{
                ExecuteDelete(
"DeleteEmployees",EmployeeID);
            }

            

        }

    }

BaseSqlMapDao.cs 文件

 

using  System;
using  System.Collections;
using  System.Collections.Generic;
using  IBatisNet.Common.Pagination;
using  IBatisNet.DataMapper;
using  IBatisNet.DataMapper.Exceptions;
using  IBatisNet.DataMapper.Configuration;
using  IBatisNet.DataAccess;
using  IBatisNet.DataAccess.DaoSessionHandlers;
using  IBatisNet.DataAccess.Exceptions;
using  IBatisNet.DataAccess.Interfaces;
using  IBatisNet.Common.Utilities;
using  ATS.Common;

namespace  ATS.Persistence.MapperDao
{
    
/// <summary>
    
/// Summary description for BaseSqlMapDao.
    
/// </summary>

    public class BaseSqlMapDao : IDao
    
{
        
protected const int PAGE_SIZE = 4;

        
/// <summary>
        
/// 创建并返回一个sqlmap对象
        
/// (下面对持久层的操作,都需要用到)
        
/// Looks up the parent DaoManager, gets the local transaction
        
/// (which should be a SqlMapDaoTransaction) and returns the
        
/// SqlMap associated with this DAO.
        
/// </summary>
        
/// <returns>The SqlMap instance for this DAO.</returns>

        protected SqlMapper GetLocalSqlMap()
        
{
            
//通过DaoManager获取本地的SqlMapper对象
            DaoManager daoManager = DaoManager.GetInstance(thisas DaoManager;
            SqlMapDaoSession sqlMapDaoSession 
= (SqlMapDaoSession)daoManager.LocalDaoSession;

            
return sqlMapDaoSession.SqlMap as SqlMapper;
        }


        
非泛型方法

        
泛型方法
    }

}

13. 定义 ATS.Service.Interface.IEmployeesService.cs 类

 

     using  System;
    
using  System.Collections.Generic;
    
using  System.Text;

    
using  ATS.Domain;

    
namespace  ATS.Service.Interface
    
{
        
public interface IEmployeesService
        
{
            
/// <summary>
            
/// 得到列表
            
/// </summary>

            IList<Employees> GetEmployeesList();

        }

    }

14. 定义 ATS.Service.Implement.EmployeesService.cs 类

 

     using  System;
    
using  System.Collections.Generic;
    
using  System.Text;

    
using  ATS.Persistence.Interface;
    
using  ATS.Persistence.MapperDao;
    
using  ATS.Service.Interface;
    
using  ATS.Domain;
    
using  IBatisNet.DataAccess;

    
namespace  ATS.Service.Implement
    
{
        
public class EmployeesService : IEmployeesService
        
{
            
Private Fields

            
Constructor

            
/// <summary>
            
/// 得到列表
            
/// </summary>

            public IList<Employees> GetEmployeesList()
            
{
                
return _employeesDao.GetEmployeesList();
            }


        }

    }

最后 在页面的aspx.cs文件中调用了, 将数据显示在 gridview 中;
以下是调用代码

 

using  System;
using  System.Data;
using  System.Configuration;
using  System.Collections;
using  System.Web;
using  System.Web.Security;
using  System.Web.UI;
using  System.Web.UI.WebControls;
using  System.Web.UI.WebControls.WebParts;
using  System.Web.UI.HtmlControls;

using  ATS.Domain;
using  ATS.Service.Implement;
using  ATS.Service.Interface;
using  ATS.Common;
using  System.Collections.Generic;

using  ATS.Common;

namespace  ATS.Web
{
    
public partial class TestForm : System.Web.UI.Page
    
{
        IEmployeesService _IEmployeesService 
= null;

        
protected void Page_Load(object sender, EventArgs e)
        
{
            
//从容器中取出接口(从services.config中的ID获取)
            _IEmployeesService = (ContainerAccessorUtil.GetContainer())["Employees"as IEmployeesService;
            
            
if (!IsPostBack)
            
{
                BindData();
            }

        }


        
public void BindData()
        
{
            
//使用接口的方法,容器会自动查找并调用实现类中的方法
            IList<Employees> employees = _IEmployeesService.GetEmployeesList();

            dgData.DataSource 
= employees;
            dgData.DataBind();
        }

    }


    
}

 

刚刚开始学习,请高手指点 :)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值