前言:
在学习ASP.NET2.0的时候发现在操作数据的时候微软给我们提供了几个数据源控件.
然而每个控件也有各自的优缺点.比如说SqlDataSource使用起来方便.

可是在我们做项目中时常要将项目分层次来进行开发.于是我很少用到SqlDataSource,那么就开始关注ObjectDataSource了.
但是在使用的时候发现有很多问题.到网上查找确没有一些很好的答案,问到多数的前辈大部分都是说从来不用这个东西.^_^
其实按照以前的写法我也可以不用.但是出于研究的目的于是乎自己弄的试了试.那下面的内容就是在学习中遇到的问题并找到解决的答案,如果你也在学习这个ObjectDataSource那么你可以看看我解决的方式和你的方式有什么区别.有了好的可一定要告我.

注:这里主要是为了探讨和ObjectDataSource配合使用.验证啊样式啊什么的不在讨论的范围之内.^_^

posted @ 2008-09-05 16:36 阿呆乐 阅读(198) | 评论 (0)编辑

前言:
在学习ASP.NET2.0的时候发现在操作数据的时候微软给我们提供了几个数据源控件.
然而每个控件也有各自的优缺点.比如说SqlDataSource使用起来方便.

可是在我们做项目中时常要将项目分层次来进行开发.于是我很少用到SqlDataSource,那么就开始关注ObjectDataSource了.
但是在使用的时候发现有很多问题.到网上查找确没有一些很好的答案,问到多数的前辈大部分都是说从来不用这个东西.^_^
其实按照以前的写法我也可以不用.但是出于研究的目的于是乎自己弄的试了试.那下面的内容就是在学习中遇到的问题并找到解决的答案,如果你也在学习这个ObjectDataSource那么你可以看看我解决的方式和你的方式有什么区别.有了好的可一定要告我.

注:这里主要是为了探讨和ObjectDataSource配合使用.验证啊样式啊什么的不在讨论的范围之内.^_^

posted @ 2008-09-05 16:36 阿呆乐 阅读(198) | 评论 (0)编辑

^_^终于我们把GridView和ObjectDataSource配合弄好了.想怎么删除就删除,想怎么修改就怎么修改.结果当我删除完以后.哦哦哦.没录入啊.这可不行.总不能到数据库那里录入吧.恩.这样吧配合ObjectDataSource实现录入一定的弄出来.

先做个界面

image

哦.那添加的那个界面是不是需要像以前那样弄个表格呢?那样还有什么意思啊.

这里我用的是

image

这里的第一个DetailsView

不过默认的时候是读取的样子.那怎么弄呢.

image

设置这个属性到Insert

这样就和我上面一样了.

下一步你就可以把你的DetailsView绑定到和GridView相关联的ObjectDataSource上了.因为我们前面已经搞定了Insert的方法所以这里就直接可以使用了.

http://www.cnblogs.com/Lileltp/archive/2008/09/05/1285180.html

同理你也可以使用FormView来实现我们这里的录入内容

posted @ 2008-09-05 16:26 阿呆乐 阅读(63) | 评论 (0)编辑

通过前两次的内容我们已经实现了带有分页和排序的显示数据,那么我们如何用ObjectDataSource来帮助我们实现删改

还是老办法我们先实现DAL层和BLL层当中的操作数据的方法

        [DataObjectMethod(DataObjectMethodType.Insert)]
        public static void InserUserInfo(UserInfo info)
        {
            DAL.UserInfoDAL.InsertUserInfo(info);
        }

        [DataObjectMethod(DataObjectMethodType.Update)]
        public static void UpdateUserInfo(UserInfo info)
        {
            DAL.UserInfoDAL.UpdateUserInfo(info);
        }

        [DataObjectMethod(DataObjectMethodType.Delete)]
        public static void DeleteUserInfo(UserInfo info)
        {
            DAL.UserInfoDAL.DeleteUserInfo(info);
        }

 

这里我们可以发现我这里传递的都是UserInfo对象了.至于好处嘛,我认为你在赋值的时候通过属性对其处理安全性更好一些.反正我总觉得比传一大堆的变量过来要好.所以这里采用这个方式.

如果你要采用我这种方式那么就需要注意你的ObjectDataSource中的一个属性是否正确设置了

image

这里我设置为我查询出的对象UserInfo

image

这样你就可以来实现删除和修改了.有些人就问呀!我没有像以前那样设置传递的参数啊.^_^

这里当你设置了ObjectDataSource的DataObjectTypeName,当你执行相关操作的时候ObjectDataSource就会自动生成一个你设置的对象并且将行内的值一一对应的传入到你的这个对象.然后直接将这个对象传入到你的BLL中的方法.但是要注意,这里还是有很多陷阱的

第一个陷阱 由数据冲突引起的问题image
在ObjectDataSource中有个属性↑

这里属性来设置如何处理是否新旧值一起处理

MSDN上的描述为:获取或设置一个值,该值确定是仅将新值传递给 Update 方法,还是将旧值和新值都传递给 Update 方法。

当这里使用默认的OverwriteChanges的时候传递的值内容为你更改后值.这里传递是我们修改后的对象值.所以默认状态下你的更新是没有问题的.

但如果你要处理新旧值的时候就需要设置到CompareAllValues.但是这时你再更新数据的时候就会报错了.

为什么会这样呢?原来当你设置为CompareAllValues的时候他需要给你BLL层传递过两个对象,一个是原来的UserInfo一个是你修改后的Userinfo.

所以你的方法需要改成这样

        [DataObjectMethod(DataObjectMethodType.Update)]
        public static void UpdateUserInfo(UserInfo info,UserInfo original_info)
        {
            ......
        }
这里发现我们的更新方法多了后面的一个参数叫original_info,这样才能将我们的修改后的内容正确更新回数据库,而且这里的original_这个前缀可以通过修改image

来实现.

陷阱二,键字段的问题.

那当我们ConflicDetection使用默认的OverwriteChanges值的时候我们进行删除操作.发现没有删除了我们想要操作的那条记录.然后通过监视可以发现传递到BLL中的UserInfo对象虽不为空.但是里面属性的值都为默认值

image

那为什么会出现这个问题呢?我认为是,删除操作并没有修改我GridView中的记录所以在ConflicDetection使用默认的OverwriteChanges值的时候传递过的对象里要是有值只能是修改后的值.所以这里你要通过id来删除则只能删除记录为0的了.^_^

所以通常来说删除不了你想要的内容,但是不出错.

那怎么办呢?这里因为我们使用的是集合所以在编写GridView的时候少设置了一个属性,那就是image

这里我们添加上键字段id.再来看看效果

image

这次发现,虽然这里没有吧UserInfo对象完整的传递过来.但是我们想要的id值过来了.^_^

posted @ 2008-09-05 15:26 阿呆乐 阅读(109) | 评论 (1)编辑

接上回书说,我们实现了基本的显示和排序.那么今天就来做做查询和分页.

首先先做通过传递普通参数的形式来实现条件查询的.这里仅仅做个演示.

我们要通条件查询那就需要修改我们原来的查询方法了.

        [DataObjectMethod(DataObjectMethodType.Select)]
        public static List<UserInfo> GetUserInfoList(string name, string sort)
        {
           ........
        }

我们这里加了一个参数用来传入要查询的用户名称.

但是这里一定要注意.当你修改了后面的方法后一定要做一件事情.

image

那就是配置数据源

因为我们修改后面的方法参数所以这里也变化了如果不重新配置数据源就会报一个错误那就是

image

当你重新配置数据源的时候就可以给你的参数设置值的来源了

image

这里我给name参数设置了值的来源为控件类型.控件名为txt_name,这样你就可以通过传递的值来改变你返回集合的内容了.而且这里因为我们指定数据来源是txt_name所以当你点击查询按钮的时候,他会自动重新绑定GridView控件.也就是你不必再执行GridView的DataBind方法了

上面已经实现了一点点效果了那最后就实现我们这次要最终想要的结果吧.

在传递值的时候会发现如果传递多个查询条件的时候参数还是比较多的.而且我们本来是有那个UserInfo类的,那我们干脆把要查询的条件内容放到一个对象里传过来好了,那样还能通过他的属性Set方法来验证一下.

public static List<UserInfo> GetUserInfoList(UserInfo info,int start,int max, string sort)
{
	......
}

那么我们捎带的就把分页也做了吧.

根据我们的要求就把原来的方法改写成↑这样的了.传递了一个对象和分页的两个参数

在这里我们可以和上次说到的排序那样来在ObjectDataSource中设置这两个参数他们分别是

StartRowParameterName和MaximumRowsParamterName

但是我这里使用通过在ObjectDataSource的Selecting事件中给这个赋值,这样就直接可以使用第三方的分页控件了

        protected void ObjectDataSource1_Selecting(object sender, ObjectDataSourceSelectingEventArgs e)
        {
            Models.UserInfo info = new Models.UserInfo();
            info.uname = txt_name.Text;
            e.InputParameters["info"] = info;

            e.InputParameters["start"]=传入的值;
            e.InputParameters["max"]=传入的值;
        }

这样我们就可以将你自己赋值的info对象和从分页控件得来的start和max值传入到BLL中的Select方法中了.

这里讲述了如何通过事件给已订好的方法动态的传递你的值.

这里需要注意:因为现在的参数是后期才赋值的所以你必须在你的查询按钮中添加一句话

        protected void btn_query_Click(object sender, EventArgs e)
        {
            GridView1.DataBind();//这里必须重新绑定一下GridView
        }
posted @ 2008-09-05 00:05 阿呆乐 阅读(100) | 评论 (0)编辑

前言:
在学习ASP.NET2.0的时候发现在操作数据的时候微软给我们提供了几个数据源控件.
然而每个控件也有各自的优缺点.比如说SqlDataSource使用起来方便.

可是在我们做项目中时常要将项目分层次来进行开发.于是我很少用到SqlDataSource,那么就开始关注ObjectDataSource了.
但是在使用的时候发现有很多问题.到网上查找确没有一些很好的答案,问到多数的前辈大部分都是说从来不用这个东西.^_^
其实按照以前的写法我也可以不用.但是出于研究的目的于是乎自己弄的试了试.那下面的内容就是在学习中遇到的问题并找到解决的答案,如果你也在学习这个ObjectDataSource那么你可以看看我解决的方式和你的方式有什么区别.有了好的可一定要告我.

 

第一部分 使用ObjectDataSource实现显示和排序

在这里我使用的是泛型集合,所以我做查询的时候返回的不是DataSet,那么就先编写DAL中的返回泛型结合的方法了

        #region 显示
        public static SortableList<UserInfo> GetUserInfoList()
        {
            SortableList<UserInfo> list = new SortableList<UserInfo>();
            using (SqlDataReader dr = Database.ExecuteReader(Database.ConnectionString, CommandType.Text, "select * from userinfo"))
            {
                while (dr.Read())
                {
                    UserInfo info = new UserInfo();
                    info.id = Convert.ToInt16(dr["id"]);
                    info.uname = dr["uname"].ToString();
                    info.age = Convert.ToInt16(dr["age"]);
                    info.sex = (int)dr["sex"];
                    list.Add(info);
                }
            }
            return list;
        }
        #endregion

通过上面的代码就实现了返回一个UserInfo的集合

为了使ObjectDataSource在使用的时候能直接找到用于处理的类和方法就需要给类和方法加上相关的属性描述

using System;
using System.Collections.Generic;
using System.Text;
using System.ComponentModel;//首先这里要引用相关的命名空间 
using Models;

namespace BLL
{
    [DataObject()]//这里给类加上描述
    public class UserInfoBLL
    {
        [DataObjectMethod(DataObjectMethodType.Select)]//这里告诉ObjectDataSource是用来查询的方法 
        public static List<UserInfo> GetUserInfoList(string sort)
        {
            SortableList<UserInfo> list = DAL.UserInfoDAL.GetUserInfoList();
            if (!sort.Equals(""))
            {
                bool flag = true;
                if (sort.IndexOf("DESC")!=-1)
                {
                    flag = false;
                }
                list.Sort(sort.Replace(" DESC",""), flag);
            }
            
            return list;
        }

        [DataObjectMethod(DataObjectMethodType.Insert)]
        public static void InserUserInfo(UserInfo info)
        {
            DAL.UserInfoDAL.InsertUserInfo(info);
        }

        [DataObjectMethod(DataObjectMethodType.Update)]
        public static void UpdateUserInfo(UserInfo info)
        {
            DAL.UserInfoDAL.UpdateUserInfo(info);
        }

        [DataObjectMethod(DataObjectMethodType.Delete)]
        public static void DeleteUserInfo(UserInfo info)
        {
            DAL.UserInfoDAL.DeleteUserInfo(info);
        }

        public static void DeleteMulutiUserInfo(string userlist)
        {
            DAL.UserInfoDAL.DeleteMulutiUserInfo(userlist);
        }
    }
}

然后就可以在你的ASP.NET页面中添加GridView和ObjectDataSource控件了.剩下就是配置你的数据源

image

这里面选着你的Select方法

image

对于下一步要求的输入sort参数这里不做设置就按照默认的方式

image

然后你就可以高兴的运行起来看一下了.showshow我的效果

image

那如果没有问题接下来做我们的排序吧.因为我们在编写后台代码的时候已经添加了一个sort参数,所以这里就简单了.

首先设置ObjectDataSource的一个属性SortParamterName 这里我们设置为刚才BLL中的那个传入的那个参数sort

然后就可以启用排序内容了

image

现在就能实现排序了.当然我这里是重新写了个sortlist的泛型集合.对于普通的应用你可以通过直接变化你的SQL语句来实现这个排序的功能.应为当你第一次点击某一列的时候他会传入那个列名,比如ID,而第二次点击则会传入ID DESC

posted @ 2008-09-04 15:47 阿呆乐 阅读(100) | 评论 (0)编辑

第一步先要创建一个C#语言的SQLSERVER项目

image

添加一个新的项,这里先添加一个"用户自定义函数"

image

 

然后来看个最简单的代码.^_^.

using System;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;

public partial class UserDefinedFunctions
{
    /// <summary>
    /// 定义一个sql的函数
    /// </summary>
    /// <param name="element">需要切分的字符串</param>
    /// <param name="index">想要得到字符串的位置</param>
    /// <returns>结果</returns>
    [Microsoft.SqlServer.Server.SqlFunction]
    public static SqlString MySplit(string element,int index)
    {
        return element.Split(',')[index];
    }
};

 

ok,当你写好代码了就该生成部署了.通过菜单 生成→部署

部署好以后就可以在查询分析器中试一下了

不过需要设置一下SQL2005,打开CLR支持

EXEC sp_configure 'show advanced options', 1 
GO 
RECONFIGURE 
GO 
 
EXEC sp_configure 'clr enabled', 1 
GO 
RECONFIGURE 
GO 

然后就可以执行了

SELECT dbo.MySplit('你好,我爱你,呵呵,爽啊',2)
结果当然就是"呵呵"
posted @ 2008-01-30 12:56 阿呆乐 阅读(126) | 评论 (0)编辑
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
 
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>无标题 1</title>
<script type="text/javascript">
   1:  
   2:     function alertInfo()
   3:     {
   4:         var m="5";
   5:         var n=5;
   6:         var x=5.0;
   7:         var o=null;
   8:         var oo=null;
   9:         if(m==n)
  10:         {
  11:             alert('使用 == m 和 n 相等');
  12:         }
  13:         
  14:         if(m===n)//一个是字符串一个是数字
  15:         {
  16:             alert('使用 === m 和 n 相等');
  17:         }
  18:         
  19:         if(n===x)//这里两个都是数字的类型
  20:         {
  21:             alert('使用 === n 和 x 相等');
  22:         }
  23:         
  24:         if(o===oo)//最后两个内容都为null        
  25:         {
  26:             alert('使用 === o 和 oo 相等');
  27:  
  28:         }
  29:     }
</script>
</head>
 
<body>
<input name="Button1" type="button" value="按钮" onclick="alertInfo()" />
</body>
 
</html>

从上面就可以看出来在javascript中 使用"="是赋值的意思.这个都可以理解.

而使用"==" 和"===" 则有一定的区别了.

在javascript中 "=="相当于C#中的equals 也就是这个只是比较内容是否相等.所以 var m="5" 和 var n=5 最后的结果是相等的.

而"===" 这个不但要比较内容是否相等也要比较类型是否一样.所以上面的那个值并没有打印出来.

但是上面的前提是一个是字符串类型一个是数字的.

如果两个都是数字.但是类型不一样."==="也会认为是相同的结果. 例如 var n=5.00 ; var x=5; "===" 会认为这两个值是相同的.

posted @ 2008-01-30 12:51 阿呆乐 阅读(43) | 评论 (0)编辑

好久没有写东西了.最近正好有项目要用到排名的东西.以前在sqlserver2000中弄起来挺麻烦的.现在好了,sqlserver2005也有了和Oracle一样的排名函数

具体这些函数的用法自己看MSDN了.下面写个列子:

 
DECLARE @TScore TABLE
(
    name varchar(20),
    score int
)
 
INSERT INTO @TScore VALUES ('张三',100)
INSERT INTO @TScore VALUES ('李四',98)
INSERT INTO @TScore VALUES ('王五',96)
INSERT INTO @TScore VALUES ('赵六',96)
INSERT INTO @TScore VALUES ('小明',100)
 
--给当前表加上一列从1开始,用这个可以快速的取得想要的列
SELECT ROW_NUMBER() OVER (ORDER BY name) '编号',* FROM @TScore
 
--全部人员排名,不返回连续排名,例如有两个第二名则第二名后是第四名
SELECT RANK() OVER (ORDER BY score DESC) '编号',* FROM @TScore
 
--全部人员排名,返回连续排名
SELECT DENSE_RANK() OVER (ORDER BY score DESC) '编号',* FROM @TScore
posted @ 2008-01-29 22:13 阿呆乐 阅读(60) | 评论 (0)编辑

以前做一些小活时常用ACCESS2000来作为数据库.由于是文件型的数据库所以就省下了买数据库空间的费用.^_^

随着office2007的推出.office系列对其软件都做了升级.使用以前jet4的方式连接ACCESS2007就不行了.

那用什么方法呢?那就是使用OLEDB的方式来连接.

先说使用使用类型化数据集的方式

image

测试一下.^_^,ok了

下来就是自己写连接字符串了.

<connectionStrings>
    <add name="WindowsApplication1.Properties.Settings.ConnectionString"
        connectionString="Provider=Microsoft.ACE.OLEDB.12.0;Data Source=&quot;C:\Documents and Settings\Administrator\桌面\WindowsApplication1\WindowsApplication1\test.accdb&quot;;Persist Security Info=True;User ID=admin"
        providerName="System.Data.OleDb" />
</connectionStrings>
其他的就和别的使用oledb方式一样了
posted @ 2007-12-21 14:43 阿呆乐 阅读(196) | 评论 (3)编辑

一直以来我不太喜欢使用.net里的Calendar控件.主要是因为他每点击一次都会刷新.随着AJAX.NET的推出这个控件也有了一丝的用处.所以也就研究一下

using System;
using System.Data;
using System.Configuration;
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;

public partial class _Default : System.Web.UI.Page 
{
    //声明一个数组放置对应的节日
    //为了使用方便定义的是13月,32天
    string[,] days=new string[13,32];

    protected void Page_Load(object sender, EventArgs e)
    {
        days[1, 1] = "元宵节";
    }
    protected void Button1_Click(object sender, EventArgs e)
    {
        
    }

    /// <summary>
    /// 编写DayRender事件
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void Calendar1_DayRender(object sender, DayRenderEventArgs e)
    {
        CalendarDay d = e.Day;//得到当前单元格的日期信息
        TableCell c = e.Cell;//得到单元格

        if (d.IsOtherMonth)//判断如果不是本月的则把单元格内的内容清空
        {
            c.Controls.Clear();
        }
        else
        {
            string myday=days[d.Date.Month,d.Date.Day];
            if (myday!=null)//如果有相关日期就.....
            {
                c.Controls.Clear();//可以清除以后再添加自己的控件
                Button b = new Button();
                b.Text="a";
                c.Controls.Add(b);//例如我这里添加的是一个按钮.把原来的1号给干掉了.orz
                c.Controls.Add(new LiteralControl("<a title='"+myday+"'>★</a>"));
                c.ForeColor = System.Drawing.Color.Red;//然后还可以添加一些单元格的内容
            }
        }


    }
}

运行效果

image

posted @ 2007-12-19 15:58 阿呆乐 阅读(145) | 评论 (0)编辑