首页 / 网页编程 / ASP.NET / DotNetNuke自定义窗体模块的数据结构(三)
DotNetNuke自定义窗体模块的数据结构(三)2010-06-18 cnblogs dnnworkflow在接触国外的CMS等Open Source产品之前,老实说,我写过的存储过程,包括SQL Server的、Oracle的,加起来绝对不会超过5个,而且还基本上都是从网上抄袭的,主要是觉得太麻烦:嗯,是的,如果数据库设计的不够好,经常需要改动,比如加一个字段,修改一下字段类型的话,需要从数据表、存储过程、调用等一路改上来,确实是挺麻烦的。不过习惯了之后,发现用存储过程确实有它的好处,也被迫养成了对数据库设计要每个字段都斟酌半天的习惯,所以,我们看到DotNetNuke有近乎上千个存储过程(安装了所有的附加模块之后)。我现在非常喜欢使用存储过程的方式来操作数据库——不过,诚如我们在《DotNetNuke自定义窗体模块的数据结构(二)》中所说的那样,由于我们修改了数据结构,所以,存储过程在这里使用是不太适合的。唉,好吧,我声明:我所说的并不代表我的意思,我对我说的话不承担任何责任我们在(二)中重新把UDT的UserDefinedRows这张表(在我们的模块中已经改名了)做了修改,如果是希望在列表上显示的,或者是参与查询的,我们都作为基本字段放在列表中;而其他的字段则作为扩展字段放在扩展表中,在用户进行定义的时候,可以选择是使用基本字段,还是扩展字段。当然,在这种情况之下,基本字段就不可能被“用完”,在某一个Form之中,我们可能只需要基本字段中的几个而已,其他剩余的我们都不需要用到,简而言之,也就是我们需要更新的字段是运行时决定的,而不是设计时决定的。而这个时候,如果我们在进行INSERT或者UPDATE操作的时候,是对所有的字段都操作一遍的话,不但是有点怪,而且也容易造成错误,比如,日期型、整数型等的字段,本来明明是没有内容的,但是我们非要INSERT入内容,会出现错误,或者是不正确的初始数据,我们希望,没有使用到的字段,就保留其为NULL就好了,不需要对该字段进行操作(大家可以插入空值或者是String.Empty试试,会觉得很头疼)。所以,我们需要在运行时生成SQL语句,我们把这个函数放在下面,供大家参考。1 Public Overrides Function AddHashRow(ByVal field As Hashtable) As Integer
2 Dim sqlComm As SqlCommand = New SqlCommand()
3
4 Dim strSql As String = "INSERT INTO RedstartFormRow ("
5
6 Dim strField As String = ""
7 Dim strParm As String = ""
8
9 For Each dic As DictionaryEntry In field
10 If strField <> "" Then
11 strField = strField & ", "
12 End If
13 strField = strField & dic.Key.ToString()
14
15 If strParm <> "" Then
16 strParm = strParm & ", "
17 End If
18 strParm = strParm & "@" & dic.Key.ToString()
19
20 sqlComm.Parameters.Add(New SqlParameter("@" & dic.Key.ToString(), GetNull(dic.Value.ToString())))
21 Next
22 strSql = strSql & strField & ") VALUES (" & strParm & ")"
23
24 strSql = strSql & "; select SCOPE_IDENTITY()"
25
26 Dim sqlConn As New SqlConnection()
27 sqlConn.ConnectionString = ConnectionString
28 sqlConn.Open()
29 sqlComm.Connection = sqlConn
30
31 sqlComm.CommandText = strSql
32
33 Return CType(sqlComm.ExecuteScalar(), Integer)
34 End Function