高级查询问题:查询结果的列数可选,查询条件可选,数据库是SQL2000,用vb.net怎么实现,望大虾教我!!
要求:数据库是SQL2000,查询结果的列数可选,查询条件可选,最后用vb.net实现。
关键在于查询结果的列数以及查询条件都是变动的,不知道如何实现,望大虾教我!!
问题点数:40、回复次数:20Top
1 楼lzmtw(水如烟)回复于 2005-05-28 17:08:03 得分 0
以前做过,要不要一大段列出来然后你来整理Top
2 楼lzmtw(水如烟)回复于 2005-05-28 17:11:50 得分 30
哈,代码太长了.还是说说思路吧.Top
3 楼perukelzhx(一块臭豆腐)回复于 2005-05-28 17:11:57 得分 0
好的,谢谢!!
有例子最好了!Top
4 楼perukelzhx(一块臭豆腐)回复于 2005-05-28 17:13:16 得分 0
有思路也行
lzmtw(水如烟) ,请讲!Top
5 楼lzmtw(水如烟)回复于 2005-05-28 17:15:04 得分 0
查询无非是这样的:
SELECT () FROM () WHERE (),()表示可选.如果你指定了表,那方便得多,我原来的是任意的,所以代码长了好多.这里不考虑多表查询.当然变通一下,做一个视图就可以简化成上面的格式.Top
6 楼lzmtw(水如烟)回复于 2005-05-28 17:16:24 得分 0
选列出的字段,那是简单的事,这里也不说了.有点头疼的是WHERE.Top
7 楼lzmtw(水如烟)回复于 2005-05-28 17:18:22 得分 0
WHERE有两种考虑,一是查询NULL的,二是不查询NULL而查询个别字段特定值的.Top
8 楼lzmtw(水如烟)回复于 2005-05-28 17:19:49 得分 0
非NULL的查询主要有LIKE,IN,BETWEEN INTop
9 楼lzmtw(水如烟)回复于 2005-05-28 17:21:00 得分 0
当然,你还可以考虑大于,小于,NOT 等等的组合.Top
10 楼lzmtw(水如烟)回复于 2005-05-28 17:21:32 得分 0
<Serializable()> Public Class QueryInfo
Private Shared SelectString1 As String = "{0} IS {1}"
Private Shared SelectString2 As String = "{0} LIKE {1}"
Private Shared SelectString3 As String = "{0} IN ({1})"
Private Shared SelectString4 As String = "{0} BETWEEN {1} AND {2}"
Private Shared SelectString As String
Private Shared ConvertValue1 As String
Private Shared ConvertValue2 As String
Public Shared Function GetData(ByVal Data As QueryData, ByVal Way As QueryWay) As String
Select Case Way
Case QueryWay.指定
If Data.FirstValue.ToLower.IndexOf("null") <> -1 Then
SelectString = SelectString1
Else
SelectString = SelectString3
End If
Case QueryWay.模糊
If Data.FirstValue.ToLower.IndexOf("null") <> -1 Then
SelectString = SelectString1
Else
If Data.FieldDataType = LzmTW.Common.SqlValueStringClass.DataType.字符 Then
SelectString = SelectString2
Else
SelectString = SelectString3
End If
End If
Case QueryWay.间隔
SelectString = SelectString4
ConvertValue2 = GetValue(Data.FieldDataType, Data.LastValue)
End Select
ConvertValue1 = GetValue(Data.FieldDataType, Data.FirstValue)
Return String.Format(SelectString, Data.FieldName, ConvertValue1, ConvertValue2)
End Function
Private Shared Function GetValue(ByVal FieldDataType As LzmTW.Common.SqlValueStringClass.DataType, ByVal Value As String) As String
If Value Is Nothing Then Return Nothing
Dim tmp As String
If Value.ToLower.IndexOf("null") <> -1 OrElse Value.IndexOfAny(New Char() {"'"c, "#"c}) <> -1 Then
tmp = Value
Else
tmp = LzmTW.Common.SqlValueStringClass.Convert(Value, FieldDataType, True)
End If
Return tmp
End Function
End Class '对查询字段据其数据类型进行处理Top
11 楼perukelzhx(一块臭豆腐)回复于 2005-05-28 17:22:06 得分 0
where后面的条件有多个 ,实际情况是它们的任意组合,就是这个条件表达式不好写
Top
12 楼lzmtw(水如烟)回复于 2005-05-28 17:22:38 得分 0
<Serializable()> Public Enum QueryWay
全部
模糊
间隔
指定
End Enum '查询方式Top
13 楼lzmtw(水如烟)回复于 2005-05-28 17:23:57 得分 0
我原来的程序分得好细.现在在找Top
14 楼lzmtw(水如烟)回复于 2005-05-28 17:26:44 得分 0
这个思路是关键.明白了这个,其它的只是它的应用而矣.
#Region "针对数据类型转换查询指定值的Sql表示形式"
Public Class SqlValueStringClass
Public Shared Function Convert(ByVal Value As String, ByVal Column As DataColumn, ByVal IsCommix As Boolean) As String
Return Convert(Value, GetDataType(Column.DataType.Name.ToLower), IsCommix)
End Function
Public Shared Function GetColumnType(ByVal Column As DataColumn) As DataType
Dim tmpType As DataType
Select Case Column.DataType.Name.ToLower
Case "string"
tmpType = DataType.字符
Case "date"
tmpType = DataType.日期
Case "datetime"
tmpType = DataType.日期
Case "boolean"
tmpType = DataType.逻辑
Case Else
tmpType = DataType.数字
End Select
Return tmpType
End Function
Public Shared Function GetDataType(ByVal DataTypeString As String) As DataType
Dim tmpType As DataType
Select Case DataTypeString.ToLower
Case "string"
tmpType = DataType.字符
Case "date"
tmpType = DataType.日期
Case "datetime"
tmpType = DataType.日期
Case "boolean"
tmpType = DataType.逻辑
Case Else
tmpType = DataType.数字
End Select
Return tmpType
End Function
Public Shared Function Convert(ByVal Value As String, ByVal DataTypeString As String) As String
Return Convert(Value, GetDataType(DataTypeString))
End Function
Public Shared Function Convert(ByVal Value As String, ByVal DataTypeString As String, ByVal IsCommix As Boolean) As String
Return Convert(Value, GetDataType(DataTypeString), IsCommix)
End Function
Public Shared Function Convert(ByVal Value As String, ByVal ValueType As DataType, ByVal IsCommix As Boolean) As String
If IsCommix Then
Dim tmp As String() = Value.Split(New Char() {","c})
Dim ts(tmp.Length - 1) As String
Dim i As Integer = 0
For Each s As String In tmp
ts(i) = ConVert(s, ValueType)
i += 1
Next
Return String.Join(",", ts)
Else
Return ConVert(Value, ValueType)
End If
End Function
Public Shared Function Convert(ByVal Value As String, ByVal ValueType As DataType) As String
Dim tmp As String
Select Case ValueType
Case DataType.字符
tmp = String.Format("'{0}'", Value)
Case DataType.数字
tmp = Value
Case DataType.日期
tmp = String.Format("#{0}#", Value)
Case DataType.逻辑
tmp = Value
End Select
Return tmp
End Function
Public Enum DataType
字符
逻辑
日期
数字
End Enum
End Class
#End Region
Top
15 楼lzmtw(水如烟)回复于 2005-05-28 17:27:51 得分 0
哈,其它的不说了吧.我也不知道怎么说下去好.Top
16 楼perukelzhx(一块臭豆腐)回复于 2005-05-28 17:28:34 得分 0
代码好长,正在看
呵呵,谢谢!Top
17 楼hello_sjn(孟剑倪)回复于 2005-05-28 17:30:22 得分 10
获得列lie=5
获得条件1 t1=***
2 t2=***
3 t3=***
.......
sql1="select top 列数 * form 表 where 1=1"
if t1<>""then sql1=sql&"and 条件1='"& t1 &"'"
if t2<>""then sql1=sql&"and 条件2='"& t2 &"'"
..................
Top
18 楼perukelzhx(一块臭豆腐)回复于 2005-05-28 17:42:07 得分 0
hello_sjn(孟剑倪) :
我设想的要查询的字段是由用户任意选择的 ,是变动的 ,你的意思我没看懂。Top
19 楼perukelzhx(一块臭豆腐)回复于 2005-05-28 17:45:41 得分 0
hello_sjn(孟剑倪) :where条件我明白Top
20 楼perukelzhx(一块臭豆腐)回复于 2005-05-28 22:21:10 得分 0
现在还不想结帖,大家快发表意见啊!Top




