使用SqlHelper的一个小技巧

在数据库设计时,也许会有一些约定,说一下我自己的三点基本硬性规定:

1、所有字段都为可空设定(主键、布尔类型字段除外)

2、字符串类型不允许有前后空格(可能特殊情况时除外)

3、如果是空字符串,则应存储Null(为了防止不同数据库类型对字符串为空和NULL的不同对待)

第一点是设计时的事情,在这里可以略过,而后两点则是归程序判断处理的,也许细心的你发现了,第二点和第三点是衔接的。

接下来我们来看一下后两点是如何实现的,以TextBox为例,我是这样进行的:

‘在验证数据时进行Me.txtRemark.Trim()
‘在保存时进行With info    If (Me.txtRemark.HasValue) Then        .Remark = Me.txtRemark.Text    Else        .Remark = Nothing    End IfEnd With

这段代码并不难理解,不过需要说明的是,必填的字段为了验证是否有值Trim是得有的,而不必填的字段实质上则只需要赋值的那一行,Trim和Null则可以交由底层SqlHelper里进行处理。

首先我们定义一个配置类来进行控制:

‘‘‘ <summary>‘‘‘ Database configuration‘‘‘ </summary>Friend NotInheritable Class Config

    ‘ Removes all occurrences of white space characters    Public Shared ReadOnly TrimString As Boolean = True    ‘ translate the empty string to null    Public Shared ReadOnly EmptyStringToNull As Boolean = True    ‘ translate the null boolean to false    Public Shared ReadOnly NullBooleanToFalse As Boolean = True    ‘ translate the null value to dbnull value    Public Shared ReadOnly NullValueToDBNull As Boolean = True

End Class

前三项正是我们要实现的功能的开关,而最后一项NullValueToDBNull则需要另外说明一下了:

在实体类中,值类型我都是用Nullable(Of T)来存储的,这当中就包含了Null的情况,而在传递至数据库时,Null是作为默认值还是DBNull呢?这是不确定的,所以这个开关就是用于约定Null作为DBNull处理。

接下来就是对SqlHelper的改造了,需要改动的只有一个方法:PrepareCommand

‘‘‘ <summary>‘‘‘ This method opens (if necessary) and assigns a connection, transaction, command type and parameters‘‘‘ to the provided command.‘‘‘ </summary>‘‘‘ <param name="command">the SqlCommand to be prepared</param>‘‘‘ <param name="connection">a valid SqlConnection, on which to execute this command</param>‘‘‘ <param name="transaction">a valid SqlTransaction, or ‘null‘</param>‘‘‘ <param name="commandType">the CommandType (stored procedure, text, etc.)</param>‘‘‘ <param name="commandText">the stored procedure name or T-SQL command</param>‘‘‘ <param name="commandParameters">an array of SqlParameters to be associated with the command or ‘null‘ if no parameters are required</param>Private Shared Sub PrepareCommand(ByVal command As SqlCommand, _                                    ByVal connection As SqlConnection, _                                    ByVal transaction As SqlTransaction, _                                    ByVal commandType As CommandType, _                                    ByVal commandText As String, _                                    ByVal commandParameters() As SqlParameter)

    ‘if the provided connection is not open, we will open it    If connection.State <> ConnectionState.Open Then        connection.Open()    End If

    ‘associate the connection with the command    command.Connection = connection

    ‘set the command text (stored procedure name or SQL statement)    command.CommandText = commandText

    ‘if we were provided a transaction, assign it.    If Not (transaction Is Nothing) Then        command.Transaction = transaction    End If

    ‘set the command type    command.CommandType = commandType

    ‘attach the command parameters if they are provided    If Not (commandParameters Is Nothing) Then        For Each p As SqlParameter In commandParameters            If (p.Direction <> ParameterDirection.Output) Then                Select Case p.DbType                    Case DbType.String, DbType.StringFixedLength, DbType.AnsiString, DbType.AnsiStringFixedLength                        If (Not p.Value Is Nothing AndAlso Not p.Value Is DBNull.Value) Then                            Dim str As String = p.Value.ToString()

                            If (Config.TrimString) Then                                str = str.Trim()                            End If

                            If (Config.EmptyStringToNull AndAlso str.Length = 0) Then                                str = Nothing                            End If

                            p.Value = str                        End If                    Case DbType.Boolean                        If (Config.NullBooleanToFalse AndAlso p.Value Is Nothing) Then                            p.Value = False                        End If                End Select

                If (Config.NullValueToDBNull AndAlso p.Value Is Nothing) Then                    p.Value = DBNull.Value                End If            End If

            command.Parameters.Add(p)        Next    End If

End Sub ‘PrepareCommand

可以看到根据Parameter的DbType作了相应的处理,这样处理后,非必填的字段,就只以只用一句赋值语句,剩下的去空白字符和Null判断就交由底层处理了,省心省力!~~~

时间: 2024-08-24 12:53:01

使用SqlHelper的一个小技巧的相关文章

记录一个小技巧,在一个包下的多个main函数调试

在eclipse中,有好几个class想做测试,又不想工程太多,都写在了一个包里面,也方便import 但是每次运行的时候,eclipse都默认运行第一次建立的那个main函数. 要想运行其他的,需要做一下修改. 在工具栏中, 点击run旁边的下拉箭头,会出现一个下拉菜单. 点击Run Configurations 进入到配置界面 在标注红色的区域,上面那个是选取工程,下面那个是选取该工程的主函数 在这里点search,找到你刚写的新的主函数,如果里面还看不到,可以手动输入就好了 然后点击app

[每日一个小技巧] CentOS 下使用yum安装一类软件包

yum 提供了丰富的工具用于支持软件包的安装. 有时候需要安装不只只是一个的情况下,可以使用groupinstall选项. 首先可以通过grouplist查询对应的group信息,比如需要安装开发工具的情况下, 可以使用以下命令: $ yum groupinstall  "Development Tools" [每日一个小技巧] CentOS 下使用yum安装一类软件包,布布扣,bubuko.com

快速掌握iOS API的一个小技巧

快速掌握iOS API的一个小技巧 周银辉 iOS SDK和Developer Library中提供了各个类以及函数的帮助文档,这很棒,但要想了解整个库的大体结构(比如UIKit下有哪些类,他们的继承关系如何)这有些让人摸不着头脑,下面有个小技巧: 打开iOS Developer Library, 点击你想要了解的Framework,以UIKit为例,好多东西都是平级地放在一起的,根本看不下去了 然后在搜索框输入: Framework Reference,绝大多数情况下都会出现一个 xxx Fr

开大Stack的一个小技巧

在程序头部添加一行 #pragma comment(linker, "/STACK:16777216") 可有效开大堆栈 实验效果如下: 11330179 2014-08-05 18:28:17 Wrong Answer 4920 1687MS 7776K 1327 B C++ Jeremy_wu 11272238 2014-07-31 19:50:26 Wrong Answer 4891 62MS 2368K 1402 B G++ Jeremy_wu 下面是没添加这一行的运行结果 上

mac下cp命令的妙用(一个小技巧)

在项目开发中遇到了这样一种情况: 需要用一个干净的工程(export出来的,没有svn信息)去覆盖一个主干的工程(含有svn信息),然后提交代码:我们在mac系统中拷贝->粘贴到目标文件夹,只有2个选项:停止和全部替换:选择全部替换后,svn信息全部丢失了. 这时我们可以使用cp -r dir1 rootdir 来进行覆盖,dir1是那个干净工程的文件夹路径,和主干工程同名:rootdir是主干工程的上级目录,如此一来我们就实现了保留svn信息前提下覆盖文件夹的目的. mac下cp命令的妙用(一

汇道科技:一个小技巧让JAVA程序员顺利拿到理想Offer

有朋友跟我抱怨,明明平常对知识掌握的很精炼了,一到面试就会紧张,发挥失常,错失工作机会,这种情况就像"考前综合症",平常对知识点都掌握的很好,一到大场合就怯场,其实我们无论是在考试还是面试,都有很多技巧的.今天汇道科技小编分享一些面试技巧给各位程序员,让大家在面试时能更加得心应手,更顺利的拿到理想的offer. Java程序员面试的有哪些小技巧 01 笔试 笔试这个环节是很容易,一般由5至10个选择题+2至5个论述题+1至2个编程题组成. 我们保持平静心态--浏览所有题目--开答.答题

mysql不能启动问题分析的一个小技巧

场景:在迁移mysql5.5.25a数据目录(从/var/lib/mysql迁移至/data)后,无法启动数据库,执行service mysql start,提示pid无法更新,新旧数据目录下的错误日志均无任何信息.此时,没有太多mysql使用经验的同事估计已经傻眼了. 类似问题如何排查呢? 这里有个小技巧: 可以稍微改下/etc/init.d/mysql(先备份),里面的      $bindir/mysqld_safe --datadir="$datadir" --pid-file

Android开发中padding使用一个小技巧

在安卓应用开发中,有时要用到状态按钮(可点击时与不可点击时的背景不相同),而且产品要求的按钮大小是固定的.在不同的手机上按钮的文字显示可能有些异常(主要是在给按钮做背景时很容易出现),此时我们怎么处理呢?我们可以用到padding这个属性. 看看小例子: --------------------------就一个按钮,但是background是用xml文件写的状态selector-------------------------------- <Button android:id="@+i

wget一个小技巧

今天在装一个东西的时候,在网上看到了这样的命令 wget  http://xxxx.sh -o -  | sh  的用法 不太明白-o -的用法于是乎man wget,看到了下面的一段话 -O file       --output-document=file           The documents will not be written to the appropriate files, but all           will be concatenated together a