在Sql Server 2005中有哪些常用的数据类型呢?我想这些常用的数据类型应该是:char、nchar、varchar、nvarchar、text、ntext、int、float、money、bit、datetime、smalldatetime、image、binary、varbinary,还有些是在特定环境下需要的如xml、bigint、numberic、real、smallint、timestamp、tinyint等等其他一些更少用到的数据类型。这么多的数据类型,对开发人员来说最常使用的当然是存储字符串的数据类型了,他们有:char、nchar、varchar、nvarchar、text、ntext,那剩下来的自然就是这次随笔所说的“特殊数据类型”了。
这些特殊数据类型包括:int、float、money、bit、datetime、smalldatetime、image、binary、varbinary、xml、bigint、numberic、real、smallint、timestamp、tinyint等其他没有列出的数据类型,为什么说这些数据类型是特殊的呢?那主要相对于Visual Studio.Net 2005中的SqlDataSource而言的,在SqlDataSource中默认处理且不需要考虑和编写代码的就是处理存储字符串的数据类型了,然而对于其他类型的则需要您或多或少的编写代码。我想这里面最复杂的莫过于处理二进制的数据了,比如保存到数据库的图片,加密字符串(如:密码)后的二进制等等,这两种数据在数据库中选择的数据类型应该是image和varbinary。下面就着重讲解一下如何保存这两种数据类型。
1、首先假设数据库中已经存在一张表。其中数据字典如下表所示:
| 表名:T_GuestInfo(客户信息) | ||||||
| 英文字段名 | 中文字段名 | 数据类型 | 长度 | 主外键 | 是否为空 | 默认值 | 
| id | 自动编号 | int | 4 | 主键 | 否 | [自动] | 
| guestname | 客户名称 | varchar | 20 | 
 | 否 |  | 
| guestpsw | 客户密码 | varbinary | 2000 |  |  |  | 
| gdatetime | 注册日期 | datetime |  |  | 否 | getdate() | 
| photo | 客户照片 | image |  |  | 是 |  | 
表1 客户信息表
这是一个简单的数据库表,但是已经有了期望有的数据类型。
2、其次让页面中SqlDataSource能连接到T_GuestInfo所在的数据库。
3、设置SqlDataSource的InsertQuery为【insert into T_GuestInfo values(@guestname,@guestpsw,@gdatetime,@photo)】。
4、此时假设页面上有了需要获取这些Sql变量的控件值,并且有一个Button,其属性ID是Btn1的按钮,用来提交数据。Button的Click事件伪代码如下所述:
 protected void Btn1_Click(object sender, EventArgs e)
    protected void Btn1_Click(object sender, EventArgs e)2
 {
    {3
 SqlDataSource1.InsertParameters.Add("guestname", tbguestname.Text.Trim());
            SqlDataSource1.InsertParameters.Add("guestname", tbguestname.Text.Trim());4
 SqlDataSource1.EnableCaching = false;
            SqlDataSource1.EnableCaching = false;5
 int i = SqlDataSource1.Insert();
            int i = SqlDataSource1.Insert();6
 if(i == 1)
            if(i == 1)7
 {
             {8
 //提示用户成功操作。
               //提示用户成功操作。9
 }
           }10
 }
    }
此时还有几个参数没有被赋值怎么办?不用着急,在发给数据库前一定都让这些参数有值!接着……
5、继续添加一个事件是SqlDataSource插入前的Inserting事件,即SqlDataSource1_Inserting。事件伪代码如下:
 protected void SqlDataSource1_Inserting(object sender, SqlDataSourceCommandEventArgs e)
    protected void SqlDataSource1_Inserting(object sender, SqlDataSourceCommandEventArgs e)2
 {
    {3
 byte[] bt1 = guestpswbytes;//guestpswbytes是字符串密码转换为二进制数组后的值,需要您自己从相应控件中转换,这里没有提供此代码。
        byte[] bt1 = guestpswbytes;//guestpswbytes是字符串密码转换为二进制数组后的值,需要您自己从相应控件中转换,这里没有提供此代码。4
 byte[] bt2 = photobytes;//photobytes同样需要您自己去写代码转换为二进制数组。
        byte[] bt2 = photobytes;//photobytes同样需要您自己去写代码转换为二进制数组。5
 System.Data.SqlClient.SqlParameter guestpswdb= new System.Data.SqlClient.SqlParameter("@guestpsw", System.Data.SqlDbType.VarBinary);
        System.Data.SqlClient.SqlParameter guestpswdb= new System.Data.SqlClient.SqlParameter("@guestpsw", System.Data.SqlDbType.VarBinary);6
 guestpswdb.Value = bt1;
        guestpswdb.Value = bt1;7
 e.Command.Parameters.Add(guestpswdb);
        e.Command.Parameters.Add(guestpswdb);8
 System.Data.SqlClient.SqlParameter photodb = new System.Data.SqlClient.SqlParameter("@photo", System.Data.SqlDbType.Image);
        System.Data.SqlClient.SqlParameter photodb = new System.Data.SqlClient.SqlParameter("@photo", System.Data.SqlDbType.Image);9
 photodb.Value = bt2;
        photodb.Value = bt2;10
 e.Command.Parameters.Add(photodb);
        e.Command.Parameters.Add(photodb);11
 System.Data.SqlClient.SqlParameter gdatetimedb = new System.Data.SqlClient.SqlParameter("@gdatetime", System.Data.SqlDbType.DateTime);
        System.Data.SqlClient.SqlParameter gdatetimedb = new System.Data.SqlClient.SqlParameter("@gdatetime", System.Data.SqlDbType.DateTime);12
 gdatetimedb .Value = DateTime.Now;
        gdatetimedb .Value = DateTime.Now;13
 e.Command.Parameters.Add(gdatetimedb);
        e.Command.Parameters.Add(gdatetimedb);14
 }
    }
此时按F5运行程序,插入数据,SqlDataSource就能很好的插入我们期望插入的数据了。当然在SqlDataSource_Inserting事件中您还可以写入各种数据库的数据类型,除了SqlDataSource_Inserting事件外,在SqlDataSource_Updating、SqlDataSource_Selecting和SqlDataSource_Deleting事件中同样如此。
这样我们就完成了让Visual Studio.Net 2005中SqlDataSource插入、更新、查询和删除数据库特殊数据类型的任务了。
附录:
在完成本随笔前,本人寻找和拜读了一些与此相关的网络作品,其中本随笔就是以 http://wangjierui.blog.51cto.com/186879/109595 文章为雏形的,作者:王杰瑞。
还有一篇文章似乎网络传抄的非常泛滥(真是网络文章一大抄,而且所有抄写的人都不说明转载地址和作者,包括博客园的一位博友,还以为此文出自博客园呢),因此本以为找不到文章出处了,幸好文中有图片,图片均带有水印,最终找到了原文地址:http://dev.yesky.com/msdn/263/3034763.shtml 作者:朱先忠,网站:天极网 (根据发布日期等条件判断应该是原创地址了)
作者对转载者要求说明(以下简称本说明):
1、确保您已经遵守了《中华人民共和国信息网络传播权保护条例》,且必须遵守《刚刚网络作品版权声明》(若两文件有冲突内容以《中华人民共和国信息网络传播权保护条例》为准,但其他非冲突内容依然各自有效),再转载。
2、“本说明、作者、作者博客网址及作者博客坐落,本文中提及的各种说明、备注或附录性文字”必须被转载,且不得改变其原有内容和要表达的意图!
作者:刚刚   作者博客网址:http://lijigang.cnblogs.com/   作者博客坐落在博客园
把握现实生活,培养自身能力
掌握新型技术,提高自我力量
 
 
    
 
              
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号