vfp中的数据查询(锦集5篇)由网友“mmabbs”投稿提供,下面是小编整理过的vfp中的数据查询,欢迎您阅读分享借鉴,希望对您有所帮助。
篇1:vfp中的数据查询
Visual FoxPro 语言体系包括三个部分:一是传统的Xbase 语言体系,二是结构化查询语言(SQL),三是面向对象化(OOP)程序设计语言,笔者认为,Visual FoxPro 这三部分语言都具有数据查询的功能。可能对于Xbase语言和SQL语言具有数据查询功能大家是没有异议的,但Visual FoxPro中的OOP语言应不会有数据查询功能,因为一般认为在Visual FoxPro中数据处理是非面向对象的,就此可以得出Visual FoxPro中的OOP语言应不具备数据查询功能。其实则不然,当我们在Visual FoxPro中通过OOP语言导入当前流行的RDO或ADO数据处理模型时,我们就会得出不同的答案。
本文想集中精力讨论Visual FoxPro 中有关Xbase语言和SQL语言的数据查询方法。在我们开始之前,先让我们分清Xbase语言和SQL语言在数据查询中扮演的不同角色。一句话:SQL语言侧重用于批量数据查询及复杂的关系型操作。
由于篇幅关系我们不可能在此详细讲述SELECT—SQL 语句的所有内容。读者有兴趣可以参看本站推出的《结构化的查询语言(SQL)》。
作为优秀的数据处理语言(DML),Xbase 中许多命令、函数有数据查询功能,我们可以讲Browse、List这样的命令也能查找数据,但这在数据库系统开发中有多大作用?所以我们不讨论它们。
首先,我们通过以下命令营建一个Demo环境。要求:查找COL1=9023时COL2的值。
CLOSE ALL
CREATE TABLE ABC (COL1 I, COL2 I)
FOR I=1 TO 10000?
INSERT INTO ABC (COL1, COL2) VALUES (I, RAND*100000)
ENDFOR
INDEX ON COL1 TAG COL1
USE
使用LOCATE 命令
USE ABC
LOCATE FOR COL1=9023
IIF(FOUND(),MESSAGEBOX(“COL2=”+STR(COL2)),MESSAGEBOX(“没有找到”))
USE
笔者认为:LOCATE命令速度很慢,就上例来说记录指针运动了9022次,如果我有1亿条记录呢?为了解决这类问题,FoxPro提出了RUSHMORE技术用于优化FOR 子句,但其本质仍是索引技术。说句实话初、中级用户一般是没有能力优化FOR 子句的,我们建议大家使用一些高速查询语句,如:SEEK命令,SEEK()、LOOKUP()、INDEXSEEK()函数。在我们讨论这些高速查询语句前,我还想讲一下CONTINUE命令与LOCATE命令的联合使用。在SELECT-SQL没有被引入Xbase语言体系前,我们只能用LOCATE+CONTINUE进行批量数据查询,我想现在大家一定都使用SELECT-SQL进行批量数据检索了,如果这样您会发现以前的多行代码被一句SELECT-SQL命令取代。
使用SEEK命令
USE ABC
SEEK 9023 ORDER TAG COL1
IIF(FOUND(),MESSAGEBOX(“COL2=”+STR(COL2)),MESSAGEBOX(“没有找到”))
USE
使用SEEK()函数
USE ABC
IIF(SEEK(9023,“ABC”,“COL1”),MESSAGEBOX(“COL2=”+STR(COL2)),;
MESSAGEBOX(“没有找到”))
USE
使用LOOKUP()函数
USE ABC
IIF(EMPTY(LOOKUP(COL2,9023,COL1,COL1)),MESSAGEBOX(“没有找到”),;
MESSAGEBOX(“COL2=”+STR(COL2)))
USE
使用INDEXSEEK()函数
USE ABC
IIF(INDEXSEEK(9023,.T.,“ABC”,“COL1”),MESSAGEBOX(“COL2=”+STR(COL2)),;
MESSAGEBOX(“没有找到”))
USE
以上高速查询语句有着共同的特点,就是必须使用索引,高速查询之所以能称为高速其原因就是使用了索引技术,
我们在查看命令手册时,会发现“不能采用RUSHMORE 优化技术”的字句。您也许要问:RUSHMORE技术可以提高查询速度,这些语句不能享用它,速度何来?我们在前文已经指出RUSHMORE技术的本质是索引,是对那些不享用索引技术的条件语句进行索引优化,使其能利用索引技术带来的高效率。有既然高速查询语句天生建立在索引技术之上,他们就没有必要进行RUSHMORE优化。
关于以上语句的具体用法由于篇幅关系不能展开,这里就简要介绍一下INDEXSEEK()函数吧!
INDEXSEEK()是Visual FoxPro 6.0中新添的函数,属于Xbase语言范畴。笔者以为用好它,就可以忘记其他高速查询语句了。
INDEXSEEK(eExpression,1MovePointer,cTableAlias,cTagName)
参数eExpression表示要搜索索引关键字表达式。
参数1MovePointer=.t.时,表示找到有关记录后指针移动到匹配记录,没有找到不移动指针,这与Seek()函数相似。1MovePointer=.f.时,表示即使找到有关记录也不移动记录指针,这样就可以大大提高查询效率,当然如果要求得到目标行有关字段的信息,这个好处就不可享用了。
参数cTableAlias表示表的别名。
参数cTagName表示索引标示。
使用SQL-Select语句
SELECT COL2 FROM ABC WHERE COL1=19023 INTO ARRAY SZ
USE IN ABC
IIF(_TALLY0,MESSAGEBOX(“COL2=”+STR(SZ)),MESSAGEBOX(“没有找到”))
篇2:PB中如何实现数据模糊查询
本文主要介绍如何在pb中根据数据窗口中的字段对数据窗口进行模糊查询,本系统的代码示例采用Power Builder6.5进行演示。
代码及设计:
1. 新建一个窗口,命名为w_query。在窗口中放入一个数据窗口控件,命名为dw_master。在dw_master中放入一个数据窗口;放置一个按钮,命名为cb_query。见下图:
2. 新建一个结构(structure)命名为str_result_column,其参数如下:
3. 在dw_master增加两个用户事件,命名为ue_action_query、ue_action_refresh。
4. 在cb_query中增加如下代码:
5. 在窗口的Open事件中增加如下代码:
dw_master.setTransObject(sqlca)
6. 在dw_master的ue_action_query中增加如下代码:
str_result_column lstr_1
//结构str_result_column的成员adw_result指查询结果所产生作用的dw
// 成员adw_column指在本窗口查询条件所要显示的dw
lstr_1.adw_result = this
lstr_1.adw_column = this
OpenWithParm(wroot_dw_query, lstr_1)7. 在dw_master的ue_action_refresh事件中增加如下代码:
dw_master.retrieve()
8. 新建一个窗口,命名为wroot_dw_query,该窗口用以进行模糊查询。其设计完成后界面如下所示:
其中“执行”按钮名为“cb_exec”、“返回”按钮名为“cb_exit”、“返回”按钮下的数据窗口名为dw_column,其dataObject为d_column_set、中间的数据窗口名为dw_where,其dataObject为d_where。
9. d_column_set的设计完成界面如下所示:
10. 其sql为:
11. dw_where的设计完成界面如下:
12. 其sql为:
13. 属性和代码如下:
1. wroot_dw_query属性:
X = 9 Y = 1132 Width = 2912 Height = 712
Visible = true Enabled = true TitleBar = true Title = “定位查询”
ControlMenu = true Border = true WindowType = response! WindowState = normal!
BackColor = 79741120
2. 窗口实例变量:
Boolean ib_changed
Long MaxEditRow = 1
String sWhere, oldsql, orisql, is_title, is_section = 'WhereClause'
DataWindow dw_result,dw_detail
pfc_n_cst_string inv_string
string sSyntax
注释:a.pfc_n_cst_string 为PFC用户对象。
3. 窗口事件代码:
3.1 close 事件:
功能:将用户本次所输入的查询条件记录到文件sIniFile的WhereClause1...n小节中去以备下次启动时置初始查询条件。
3.2 open 事件:
功能:设置初始值,具体请看代码中的注释。
integer i, row, li_where_row = 10
string tmp
str_result_column lstr_1
//结构str_result_column的成员adw_result指查询结果所产生作用的dw
// 成员adw_column指在本窗口查询条件所要显示的dw
lstr_1 = Message.PowerObjectParm
dw_result = lstr_1.adw_result
dw_detail = lstr_1.adw_column
if isnull(dw_result) or not isvalid(dw_result) then return
if isnull(lstr_1.adw_column) or not isvalid(lstr_1.adw_column) then return
window act_w
act_w=MainWindow.getactivesheet()
x = act_w.x + 8
y = act_w.y + act_w.height - height+258
width = act_w.width
cb_exec.x=width - cb_exec.width -80
cb_exit.x=width - cb_exec.width -80
dw_where.x=10
dw_where.Width = width - 2 * dw_where.X - cb_exec.width -100
//-----s
dw_column.visible = False
wf_setcolumn(lstr_1.adw_column, dw_column)
//orisql = dw_result.Object.DataWindow.Table.Select //原始语法,close中用.
orisql = dw_result.GetSqlSelect() //上句对CrossTab无效
oldsql = lower(orisql)
For i = 1 to li_where_row
dw_where.InsertRow(0)
Next
dw_where.setrowfocusindicator(Hand!)
dw_where.ScrollToRow(0)
dw_where.SetColumn(“column1”)
cb_exec.SetFocus()
datawindowchild dwc
dw_where.GetChild(“column1”,dwc)
dwc.SetTransObject(sqlca)
dwc.Reset()
For i = 1 to dw_column.RowCount()
tmp = dw_column.GetItemString(i,1)
row = dwc.InsertRow(0)
dwc.SetItem(row,1,tmp)
Next
//将用户上次所输入的查询条件从文件sIniFile的WhereClause1...n小节中取出来,
//本次启动时置为初始查询条件.
window w_parent
if dw_result.GetParent().typeof() = window! then
w_parent = dw_result.GetParent()
is_title = w_parent.title
else
is_title = dw_result.DataObject
end if
ib_changed = True
row = 0
tmp = ''
is_title = gnv_app.is_regkey + '\' + is_title + '\' + scname
For i = 1 to li_where_row
RegistryGet(is_title, is_section + String(i), RegString!, tmp)
//tmp = ProfileString(sinifile,is_title,“WhereClause” + string(i),“”)
if tmp “” and (Not IsNull(tmp)) then
//SetProfileString(sinifile,is_title,“WhereClause” + string(i),“”)
RegistrySet(is_title, is_section + String(i), RegString!, '')
row ++
dw_where.object.data[row,1] = inv_string.of_gettoken(tmp, “,”)
dw_where.object.data[row,2] = inv_string.of_gettoken(tmp, “,”)
dw_where.object.data[row,3] = inv_string.of_gettoken(tmp, “,”)
dw_where.object.data[row,4] = inv_string.of_gettoken(tmp, “,”)
dw_where.object.data[row,5] = inv_string.of_gettoken(tmp, “,”)
dw_where.object.data[row,6] = inv_string.of_gettoken(tmp, “,”)
end if
Next
MaxEditRow = row // MaxEditRow 为dw_where中当前已编辑过的最大行的行号.实例变量.
If MaxEditRow = 0 Then MaxEditRow = 1
4. 函数:
4.1 public function string wf_getywname (string hzname)函数
功能:返回“表名.列名”,如“department.d_id”。
4.2 public function string wf_getywtype (string hzname)函数
功能:返回列类型。
注释:
(1) f_getoken()函数代码如下:
4.3 public function string wf_dateconvert (string svalue)函数
功能:见程序中注释。
string syear,smonth,sday
date idate
idate = date(svalue)
syear = string(year(idate))
smonth = string(month(idate))
sday = string(day(idate))
svalue = syear + “-” + smonth + “-” + sday
return svalue
end function
public function string wf_datetime (string inputvalue)
inputvalue = trim(inputvalue)
integer position
string bef,aft
/* bef 为日期,aft为时间*/
position = pos(inputvalue,“ ”)
if position = 0 then inputvalue += “ 00:00:00”
position = pos(inputvalue,“ ”)
if position = 0 then
return “error”
else
bef = left(inputvalue , position - 1)
aft = right(inputvalue,len(inputvalue) - position)
if (not isdate(bef)) or (not istime(aft)) then
return “error”
end if
end if
//bef = wf_dateconvert(bef)
//return bef + “ ” + aft
string syear,smonth,sday
date idate
idate = date(bef)
syear = string(year(idate))
smonth = right('00'+string(month(idate)),2)
sday = right('00'+string(day(idate)),2)
return syear+smonth+sday
end function
public subroutine wf_setcolumn (datawindow dw_1, datawindow dw_2)
pfc_n_cst_string lnv_string
String scol, stable_col
String shz, syw, stype, stable
Integer i, row
If Not IsValid(dw_1) Then Return
If Not IsValid(dw_2) Then Return
dw_2.ReSet()
For i =1 To long(dw_1.Object.DataWindow.Column.Count)
scol = dw_1.Describe(“#” + String(i) + “.Name”) //列名(可变)
stable_col = dw_1.Describe(scol + “.dbName”) //所在表.列名(OK)
stable = lnv_string.of_gettoken(stable_col,“.”) //所在表
syw = stable_col //列名(不变.OK) 本文来自bianceng.cn(编程入门)
shz = trim(dw_1.Describe(scol + “_t.Text”)) //中文名
stype = dw_1.Describe(scol + “.ColType”) //列类型
if dw_1.Describe(scol + “.Type”) = “column” &
and shz “!” and shz “?” then
shz = lnv_string.of_globalreplace(shz,“'”,“”) //去掉单引号
shz = lnv_string.of_globalreplace(shz,'“','') //去掉双引号
shz = lnv_string.of_globalreplace(shz,”~r~n“,”_“) //去掉换行符
shz = lnv_string.of_globalreplace(shz,” “,”_“) //去掉空格
shz = lnv_string.of_globalreplace(shz,”:“,”“) //去掉冒号
shz = lnv_string.of_globalreplace(shz,”:“,”“) //去掉冒号
row = dw_2.InsertRow(0)
dw_2.object.data[row,1] = shz
dw_2.object.data[row,2] = syw
dw_2.object.data[row,3] = stype
dw_2.object.data[row,4] = stable
end if
Next
4.4 public function long wf_min (long a, long b, long c)函数
功能:给定三个数a,b,c, 如果a,b,c均为0, 则返回0;否则,返回a,b,c中不为0的数中的最小值.例1: a = 0, b = 0, c = 0 ,则返回0。例2: a = 0, b = 2, c = 6 ,则返回2。例3: a = 9, b = 0, c = 0 ,则返回9。
5. StaticText: st_1属性:
X = 46 Y = 32 Width = 466 Height = 64
TabOrder = 0 Visible = true Text = ”请输入查询条件: “ TextColor = 0
BackColor = 80269524 Alignment = left! FillPattern = solid!
6. CommandButton: cb_exit属性:
X = 2578 Y = 376 Width = 256 Height = 108
TabOrder = 30 Visible = true Enabled = true Text = ”&F.返回“
Cancel = true
6.1 CommandButton: cb_exit的 clicked 事件:
功能:直接退出。
Close(parent)
7. CommandButton: cb_exec属性:
X = 2578 Y = 204 Width = 256 Height = 108
TabOrder = 20 Visible = true Enabled = true Text = ”&Z.执行“
Default = true
7.1 CommandButton: cb_exec的 clicked 事件:
功能:设置组和sql语法。
注释:
(1).n_cst_sql、n_cst_sqlattrib为PFC中用户对象,这里不再详述。
8. DataWindow: dw_column属性:
X = 2578 Y = 536 Width = 69 Height = 60
TabOrder = 10 Visible = true Enabled = true DataObject = ”d_column_set“
Border = true LiveScroll = true BorderStyle. = stylebox
9. DataWindow: dw_where属性:
X = 46 Y = 120 Width = 2459 Height = 448
TabOrder = 40 Visible = true Enabled = true DataObject = ”d_where“
VScrollBar = true Border = true BorderStyle. = stylelowered!
9.1 DataWindow: dw_where的 editchanged 事件:
功能:设置”执行“按钮是否有效,
9.2 DataWindow: dw_where的itemchanged 事件:
功能:见代码中的注释。
string colname,colvalue, logvalue
long currow
ib_changed = true
cb_exec.Enabled = True
currow = GetRow()
If MaxEditRow < Currow Then MaxEditRow = currow
// MaxEditRow 为当前已编辑过的最大行的行号。实例变量。
colname = GetColumnName()
colvalue = GetItemString(currow,colname)
Choose Case dwo.name
Case 'dispvalue'
Object.value[row] = data
Case Else
End Choose
//设置当前行的operator的初始值为”=“
//设置上一行的logical的初始值为”and“
if colname = ”column1“ then
if colvalue = ”“ or isnull(colvalue) then
SetItem(currow,”operator“,”=“)
if currow >= 2 then
colvalue = GetItemString(currow - 1,colname)
logvalue = GetItemString(currow - 1,”logical“)
if colvalue ”“ and (logvalue = ”“ or isnull(logvalue)) then
SetItem(currow - 1,”logical“,”and“)
end if
end if
end if
end if
//检查并设置左括号。
long ll, i
colvalue = GetText()
if colname = ”precol“ then
if colvalue ”“ and not isnull(colvalue) then
ll = len(colvalue)
colvalue = ”“
For i = 1 to ll
colvalue += ”(“
Next
SetItem(currow,”precol“,colvalue)
this.Settext(colvalue)
Return 2
end if
end if
9.3 DataWindow: dw_where的losefocus 事件:
AcceptText()
9.4 DataWindow: dw_where的rbuttondown 事件:
功能:设置弹出式菜单。
注释:
(1) m_cpq_rbutton_paste菜单的属性和代码如下:
1.MenuItem = m_1 ”a1“
Visible = true Enabled = true
2.MenuItems for m_1
MenuItem = m_value ”&V.取现有值“
Visible = true Enabled = true
3.Script. for: nt clicked event
long ll_pos
String sSyntax,ls_parm,ls_data,ls_disp
datawindow dwp
dwp = Message.PowerObjectParm
sSyntax = Message.StringParm
if sSyntax = ”“ or isNull(sSyntax) then
beep(3)
return
end if
OpenWithParm(w_paste,sSyntax) //w_paste为响应式窗口
ls_parm = Message.StringParm
if ls_parm ”cancel“ then
ll_pos = Pos ( ls_parm,'/')
If ll_pos = 0 Then
ls_data = ls_parm
ls_disp = ls_parm
Else
ls_data = Left ( ls_parm , ll_pos - 1 )
ls_disp = Mid ( ls_parm , ll_pos + 1 )
End If
dwp.SetItem(dwp.GetRow(),”value“,ls_data)
dwp.SetItem(dwp.GetRow(),”dispvalue“,ls_disp)
dwp.AcceptText()
end if
5. MenuItem = m_clear ”&D.清除本列“
Visible = true Enabled = true
6. Script. for: clicked event
datawindow dwp
dwp = Message.PowerObjectParm
dwp.DeleteRow(0)
dwp.InsertRow(0)
End of Script
MenuItem = m_return ”&N.返回“
Visible = true Enabled = true
9.5 DataWindow: dw_where的 ue_where 事件
功能:形成WHERE子句,并更新语法框。
string hzcol, ywcol, sValue, sType //, sWhere
//sWhere 现为实例变量,在wroot_query中为局部变量.
string sOper, sLog, sLeft_kh,sRight_kh, tmpsValue
long left_kh,right_kh //左、右括号数
integer i, rownum, delnum //, typenum
dwItemStatus l_status
if ib_changed = true then
ib_changed = false
else
return 0
end if
rownum = dw_where.RowCount()
//去掉dw_where中MaxEditRow行以前所有中间为空或
//者输入不完整的行, 并更新MaxEditRow.
i = 1
delnum = 0
DO WHILE i <= MaxEditRow
l_status = dw_where.GetItemStatus(i,0, Primary!)
if l_status New! then
hzcol = GetItemString(i,”column1“)
sValue = GetItemString(i,”value“)
if (hzcol = ”“ or isnull(hzcol)) or (sValue = ”“ or isnull(sValue)) then
dw_where.DeleteRow(i)
delnum += 1
MaxEditRow += -1
Continue
end if
else
dw_where.DeleteRow(i)
delnum += 1
MaxEditRow += -1
Continue
end if
i += 1
LOOP
For i = 1 to DelNum
dw_where.InsertRow(0)
Next
//检查左右括号是否匹配, 即其数量是否一样多.
For i = 1 to MaxEditRow
l_status = dw_where.GetItemStatus(i,0, Primary!)
if l_status New! then
left_kh += inv_string.of_countoccurrences(GetItemString(i,”precol“),”(“)
right_kh += inv_string.of_countoccurrences(GetItemString(i,”value“),”)“)
end if
Next
i = left_kh - right_kh
if i 0 then
if i >0 then
sValue = ”查询条件中左括号比右括号多了“ + String(i) + ”个“
else
sValue = ”查询条件中左括号比右括号少了“ + String(-i) + ”个“
end if
if MessageBox(”综合查询输入错误“,sValue + ”,请改正;“ + &
”~r~n~r~n否则,所有查询条件将被忽略。“,None!,OKCancel!,2)=1 then
return 1
else
dw_where.setfocus()
return 0
end if
end if
//形成WHERE子句,并更新语法框。
sWhere = ”“
For i = 1 to MaxEditRow
hzcol = GetItemString(i,”column1“)
sOper = space(1) + GetItemString(i,”operator“) + space(1)
// 去掉空格键
sValue = Trim(GetItemString(i,”value“))
sLeft_kh = GetItemString(i,”precol“) //保存左括号
if isNull(sLeft_kh) then sLeft_kh = ”“
if Pos(sValue,”)“,1) >0 then //保存右括号
sRight_kh = Right(sValue,(Len(sValue) - Pos(sValue,”)“,1) + 1))
else
sRight_kh = ”“
end if
sValue = inv_string.of_globalreplace(sValue,”'“,”“) //去掉sValue中的单引号.
sValue = inv_string.of_globalreplace(sValue,'”','') //去掉sValue中的双引号.
sValue = inv_string.of_globalreplace(sValue,“)”,“”) //去掉sValue中的右括号.
sLog = GetItemString(i,“logical”)
if sLog = “” or isNull(sLog) then
sLog = “and”
dw_where.SetItem(i,“logical”,“and”)
end if
ywcol = wf_getYwName(hzcol) //表名.列名
sType = lower(wf_getYwType(hzcol))
CHOOSE CASE sType
CASE “char”,“character”,“string”,“nchar”,“nvarchar”,“varchar”,“time”
if trim(sOper) = “like” or trim(sOper) = “not like” then
sWhere += “ (” + sLeft_kh + ywcol + sOper + “'%” + sValue + “%') ” + sRight_kh + sLog
else
sWhere += “ (” + sLeft_kh + ywcol + sOper + “'” + sValue + “') ” + sRight_kh + sLog
end if
CASE “numeric”,“decimal”,“decimaln”,“dec”,“double”,“integer”,“int”,“smallint”,&
“number”,“long”,“real”,“uint”,“ulong”,“unsignedint”,“unsignedinteger”,“unsignedlong”
if trim(sOper) = “like” or trim(sOper) = “not like” then
if MessageBox(“提示信息”,hzcol + “不是字符型,不能使用<含有>或<不含有>操作符,” + &
“~r~n~r~n请改正; 否则,所有查询条件将被忽略。”,None!,OKCancel!,2)=1 then
return 1
else
dw_where.setfocus()
return 0
end if
end if
if isNumber(sValue) then
sWhere += “ (” + sLeft_kh + ywcol + sOper + sValue + “) ” + sRight_kh + sLog
else
if MessageBox(“综合查询输入错误”,hzcol + “的值应为数字型,请改正;” + &
“~r~n~r~n否则,所有查询条件将被忽略。”,None!,OKCancel!,2)=1 then
Return 1
else
dw_where.setfocus()
return 0
end if
end if
CASE “date”,“datetime”,“datetimn”,“smalldatetime”,“timestamp”
if trim(sOper) = “like” or trim(sOper) = “not like” then
if MessageBox(“提示信息”,hzcol + “不是字符型,不能使用<含有>或<不含有>操作符,” + &
“~r~n~r~n请改正; 否则,所有查询条件将被忽略。”,None!,OKCancel!,2)=1 then
return 1
else
dw_where.setfocus()
return 0
end if
end if
if sType = “date” then
if not isdate(sValue) then
if MessageBox(“综合查询输入错误”,hzcol + “的值应为日期型,请改正;” + &
“~r~n~r~n否则,所有查询条件将被忽略.”,None!,OKCancel!,2)=1 then
Return 1
else
dw_where.setfocus()
return 0
end if
end if
sValue = wf_dateconvert(sValue)
sWhere += “ (” + sLeft_kh + ywcol + sOper + “'” + sValue + “') ” + sRight_kh + sLog
else
//datetime型的字段在sybase中转换为字符串的类型
sValue = wf_datetime(sValue)
if sValue = “error” then
if MessageBox(“综合查询输入错误”,hzcol + “的值应为日期时间型,请改正;” + &
“~r~n~r~n否则,所有查询条件将被忽略。”,None!,OKCancel!,2)=1 then
Return 1
else
dw_where.setfocus()
return 0
end if
end if
sWhere += “ (” + sLeft_kh + “convert(varchar(8),”+ywcol+“,112)” + sOper + “ '”+sValue+“') ” + sRight_kh +
sLog
end if
CASE ELSE
beep(1)
MessageBox(“综合查询”,sType + “这个数据类型未在本模块中定义。”)
Return 0
END CHOOSE
Next
//去掉最后一个逻辑符。
Long pok, pp
pp = 0
DO WHILE True
pok = pp
pp = Pos(sWhere, “)”, pp + 1)
if pp = 0 then Exit
LOOP
if pok >0 then sWhere = Trim(Left(sWhere, pok))
return 1
//最后一个逻辑符去掉结束.
//至此, 用户的WHERE语句部分已经形成完毕于sWhere中. 不含有>含有>不含有>含有>
9.6 DataWindow: dw_where的 ue_mousemove 事件
功能:控制鼠标的移动。
string s_object
s_object = This.GetObjectAtPointer()
if left(s_object,5) = “value” then
MainWindow.SetMicroHelp(“此时按鼠标右键可粘贴现有值”)
else
MainWindow.SetMicroHelp(“准备好”)
end if
9.7 DataWindow: dw_where的ue_retrieve事件
功能:对数据窗口进行查询,详细请见代码。
// 如果数据窗口dw_result上并无ue_action_refresh事件,
// 则用户必须重载本事件,编写自己的脚本.
// 如:
// dw_result.retrieve()
//
// 或者如果数据窗口dw_result有retrieve参数,
// 则用户也必须重载本事件,编写自己的脚本.
// 如:
// string ls_id
// ls_id = ...
// dw_result.retrieve(ls_id)
dw_result.triggerevent(“ue_action_refresh”)
篇3:不用SQL语句查询DataTable中的数据.net
在实际编程工程中,常常遇到这样的情况:DataTable并不是 数据库 中的,或者DataTable尚未写到数据库,或者从数据库中读出的DataTable已经在本地被改动,又没有写回数据库(可能还要作其他改动),在这些情况下,要查询DataTable中的数据,强大的 SQL 语言就
在实际编程工程中,常常遇到这样的情况:DataTable并不是数据库中的,或者DataTable尚未写到数据库,或者从数据库中读出的DataTable已经在本地被改动,又没有写回数据库(可能还要作其他改动),在这些情况下,要查询DataTable中的数据,强大的SQL语言就派不上用场了,
有些.NET程序员采取在数据库中建立临时表等方法来解决这类查询问题。而我觉得这种方法不可行,其实只要用.NET类库中提供的DataView类的强大功能(主要是用它的RowFilter属性),就能方便地解决这类查询问题。下面就举一个具体的例子,来说明如何不用SQL语句,用DataView的RowFilter属性来查询。
步骤一:建立一个C#的ASP.NET项目。先编写一个生成DataTable的函数MakeDataTable,代码如下:
private DataTable MakeTable
{
//生成DataTable
System.Data.DataTable myDataTable = new DataTable(“本地数据表”);
DataColumn myDataColumn;
DataRow myDataRow;
//生成数据列 ID,商品名称,商品价格
myDataColumn = new DataColumn();
myDataColumn.DataType = System.Type.GetType(“System.Int32”);
myDataColumn.ColumnName = “ID”;
myDataColumn.ReadOnly = true;
myDataColumn.Unique = true;
myDataTable.Columns.Add(myDataColumn);
myDataColumn = new DataColumn();
myDataColumn.DataType = System.Type.GetType(“System.String”);
myDataColumn.ColumnName = “商品名称”;
myDataTable.Columns.Add(myDataColumn);
myDataColumn = new DataColumn();
myDataColumn.DataType =System.Type.GetType(“System.Decimal”);
myDataColumn.ColumnName = “商品价格”;
myDataTable.Columns.Add(myDataColumn);
//为数据表添加数据行
myDataRow = myDataTable.NewRow();
myDataRow[“id”] = 1;
myDataRow[“商品名称”] = “足球”;
myDataRow[“商品价格”] =57.5;
myDataTable.Rows.Add(myDataRow);
myDataRow = myDataTable.NewRow();
myDataRow[“id”] = 2;
myDataRow[“商品名称”] = “篮球”;
myDataRow[“商品价格”] =64.5;
myDataTable.Rows.Add(myDataRow);
myDataRow = myDataTable.NewRow();
myDataRow[“id”] = 3;
myDataRow[“商品名称”] = “网球”;
myDataRow[“商品价格”] =6.5;
myDataTable.Rows.Add(myDataRow);
myDataRow = myDataTable.NewRow();
myDataRow[“id”] = 4;
myDataRow[“商品名称”] = “网球拍”;
myDataRow[“商品价格”] =388.5;
myDataTable.Rows.Add(myDataRow);
//返回数据表
return myDataTable;
}
步骤二:在aspx前台页面中添加一个DataGrid1,在后台代码的Page_Load中编写如下代码:
if(!this.IsPostBack)
{
Session[“Table”]=MakeTable();
DataGrid1.DataSource=(DataTable)Session[“Table”];
DataGrid1.DataBind();
}
此时浏览页面,可以看到DataGrid中显示的表中数据。
ID
商品名称
商品价格
1
足球
57.5
2
篮球
64.5
3
网球
6.5
4
网球拍
388.5
步骤三:在aspx前台页面添加一个用来查询Label1,TextBox1和Button1。如下图所示:
步骤四:在查询按钮Button1单击事件中添加如下代码:
DataTable dt=(DataTable)Session[“Table”];
//为数据表建立一个数据视图
DataView dv=new DataView(dt);
//用RowFilter属性进行模糊查询
dv.RowFilter=“商品名称 LIKE'%”+TextBox1.Text.Trim()+“%'”;
DataGrid1.DataSource=dv;
DataGrid1.DataBind();
运行页面后在TextBox1中输入“网”,按查询按钮后 ,DataGrid显示的查询结果如下:
ID
商品名称
商品价格
3
网球
6.5
4
网球拍
388.5
步骤五:在aspx前台页面上添加一个Label2控件,两个TextBox控件-TextBox1和TextBox2,以及一个“查询”按钮,Button2,如下图所示,用来查询用户输入的价格范围中在商品,
步骤六:在后台代码中为Button2按钮单击事件添加如下如下代码:
DataTable dt=(DataTable)Session[“Table”];
DataView dv=new DataView(dt);
dv.RowFilter=“商品价格>=”+TextBox2.Text.Trim()+“ AND 商品价格<=”+TextBox3.Text.Trim();
DataGrid1.DataSource=dv;
DataGrid1.DataBind();
用户在两个文本框中输入价格范围,10,70后,DataGrid1中显示的查询结果如下:
ID
商品名称
商品价格
1
足球
57.5
2
篮球
64.5
可见,用DataView的RowFilter属性完全能达到SQL语句SELECT语句所实现的功能
RowFilter中的查询语句与SQL语句中SELECT语句的语法和作用都极为相似,以下是摘自MSDN中关于RowFilter查询语句的语法说明:
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
用户定义的值可以用在将与列值进行比较的表达式内。字符串值应放在单引号内。日期值应放在磅符号 (#) 内。对于数值,允许使用小数和科学记数法。例如:
“FirstName = 'John'”
“Price <= 50.00”
“Birthdate < #1/31/82#”
对于包含枚举值的列,将值强制转换为整数数据类型。例如:
“EnumColumn = 5”
运算符
使用布尔值 AND、OR 和 NOT 运算符时允许串联。可以使用括号来组合子句和强制优先级。AND 运算符优先于其他运算符。例如:
(LastName = 'Smith' OR LastName = 'Jones') AND FirstName = 'John'
在创建比较表达式时,允许使用下列运算符:
<
>
<=
>=
=
IN
LIKE
在表达式中还支持下列算术运算符:
+(加) -(减) *(乘) /(除) %(模数)
字符串运算符
若要连接字符串,请使用 + 字符。字符串比较是否区分大小写由 DataSet 类的 CaseSensitive 属性的值来确定。但是,可以用 DataTable 类的 CaseSensitive 属性重写此值。
通配符
在 LIKE 比较中,* 和 % 两者可以互换地作为通配符。如果 LIKE 子句中的字符串包含 * 或 %,那么这些字符应用中括号([])对其进行转义。如果子句中有中括号,那么中括号字符应用中括号对其进行转义(例如 [[] 或 []])。在模式的开头和结尾,或者在模式的结尾,或在模式的开头允许使用通配符。例如:
“ItemName LIKE '*product*'”
“ItemName LIKE '*product'”
“ItemName LIKE 'product*'”
在字符串的中间不允许使用通配符。例如,不允许 'te*xt'。
父/子关系引用
通过在列名称前面加 Parent,就可以在表达式中引用父表。例如,Parent.Price 引用父表的名为 Price 的列。
通过在列名称前面加一个 Child,就可以在表达式中引用子表中的列。但是,因为子关系可以返回多行,所以必须在聚合函数中包括对子列的引用。例如,Sum(Child.Price) 将返回子表中名为 Price 的列的总和。
如果某个表有多个子表,则语法是:Child(RelationName)。例如,如果某个表有两个子表,它们的名称分别为 Customers 和 Orders,则 DataRelation 对象被命名为 Customers2Orders,引用将为:
Avg(Child(Customers2Orders).Quantity)
聚合
支持下列聚合类型:
Sum(求和) Avg(平均) Min(最小值) Max(最大值) Count(计数)
StDev(统计标准偏差) Var(统计方差)。
聚合通常沿着关系执行。通过使用上面列出的函数之一和上面“父/子关系引用”中详述的子表列,来创建聚合表达式。例如:
Avg(Child.Price)
Avg(Child(Orders2Details).Price)
聚合也可以在单个表上执行。例如,若要为名为“Price”的列中的数字创建汇总,就用: Sum(Price)
原文转自:www.ltesting.net
篇4:怎样掌握SQL Server中的数据查询综合教程
SQL(结构化查询语言)就是负责与ANSI维护的数据库交互的标准,最新的版本是SQL-99,还有一个新标准SQL-200n尚处于制定过程中。大多数的数据库都至少遵守ANSI-92标准的部分子集。不过,目前对最新标准的有效性还存在一些争论。专有数据库制造商根据这些标准开发自己的产品,同时制定出自己特有的数据库存储操作新概念。几乎各种不同的数据库都包含了自己特有的语法集合,只是通常很类似ANSI标准。在大多数情况下,尽管有一些数据库实例基于特定的扩展语法会因数据库的不同而产生不同的结果,但总的说来,这些新加的语法不过是对原有标准的扩充。如果数据库操作并没有得到你希望的结果,那么你不妨事先读一读数据库制造商提供的产品说明。
假如到目前为止你头回遭遇SQL语言,那么你怎么也得先理解一些基本的SQL概念。我尽量把这些基本知识阐述得简明扼要,如果你对那些数据库术语还能忍受,你尽可跳到下一节,此外你还可以把自己的问题提交给以下的讨论区。
笼统地说,“SQL数据库”其实就是关系型数据库管理系统(RDMS)通俗的叫法。对某些系统来说,“数据库”也指一组数据表、数据以及相互区分但结构类似的配置信息。在这种情况下,每一SQL数据库的安装都可能由若干数据库组成。在有些系统上,这种数据库则指的是表空间。
数据表是一种包含多行数据的数据库构造,这种数据库构造由命名的列组成。通常数据表构造为包含关系信息,同一数据库或表空间以内可以创建若干数据表。
表内的列保存某一种类型的数据而且应根据其保存数据的内容得以命名。例如,被称为“LastName”的列就应该在每一行包含姓氏条目。正是这一前提的存在才能让关系数据库查询返回一致的结果。
字段(field)指的是某一行某一列对应的数据(或保存数据的地方)。另外,数据集合(data set)则指的是多行多列的数据,而且数据集合通常说明你的数据库或数据表内的全部数据。结果集合(result set)就是从数据库查询返回的数据;它能够描述从单一字段到数据库内全部数据这一范围内的全部信息。
数据库查询就是发送给数据库的SQL指令,这些指令向数据库请求某种施加在数据集合或数据库上的功能。
现在我们就来看看基本的数据库查询,这些查询主要涉及到对数据库内数据的操作。在本文中,所有的例子都采用了标准SQL语言,而且这些基本功能可以转换为应用在几乎各种环境下。
数据查询类型
SQL语言中的数据查询分为4种基本类型:
SELECT:这条语句要求数据库返回指定结果的数据集合;你可以用这一语句检索数据库中保存的信息。
INSERT:这条语句用来给数据表增加新一行数据。
DELETE:该语句从你的数据库中删除若干行数据。
UPDATE:该语句修改数据库内的现有数据。
以上的这些语句都有各种各样的限定词和函数供你用来定义有关的数据集合,同时控制查询返回的结果集合。SELECT语句的选项最多。有许多种组合SELECT的查询选项,例如JOIN和UNION等。不过就我们目前来说,本文主要还是关注基本用途。
用SELECT语句检索保存的信息
为了获得数据库中保存的信息就必须采用SELECT语句。其基本功能限制在针对单一数据表操作,当然,其他范围的构造也是有的。为了返回特定列所对应的所有数据行,你可以使用以下语句:
SELECT column1, column2 FROM table_name;
另外,使用通配符“*”可以从表中选出所有的列:SELECT * FROM table_name;
你要愿意自己编码分析以上返回的结果当然也没问题,不过你完全可以采用方便的WHERE子句限制返回的结果集合,该子句可以让你为选择数据定义某些条件。以下查询就会返回“column1”数值等于3的所以数据行:SELECT * FROM table_name WHERE column1 = 3;
除了“=”(等于)条件之外你还可以用到下列条件运算符:
=
关 键 字:SQLServer
篇5:七招教你进行中望CAD数据查询
在使用CAD进行设计的过程中,必然会遇上要对所绘对象进行必要的查询,了解该对象的特性,查询的方法很多,下面向大家一一罗列。
1.通过左下角的坐标来查询数据。这个方法非常不精确,而且只能看看坐标,在不需要精确定位的时候可以使用。
2.使用相应的命令来查询,命令id查询坐标,命令distance查距离,命令area查面积。这些命令可以查询对象某些点的坐标,很准确,精确的程度就看设置到保留小数多少位,
3.使用list命令,使用list命令查询出来的内容很多,有句柄、当前空间、层、颜色、线型、线宽等,根据对象不同还有不同的内容,如圆还有中间点、半径、圆周、面积等 。
4.使用标注,标注是CAD里面一个不可缺少的功能,同样也能数据查询。通过标注,能直接查出来的数据只有:距离,角度,但是通过这两个数据结合一定的计算方法,就能将所有的数据都计算出来。
5.使用ZWCAD提供的计算器,只需要上面部分,看下图,上面有七个按钮,第四个就是查询点坐标,第五个按钮就是查询两点距离,第六个按钮是查询直线与水平线的角度。第七个就是查两根线的交点的坐标的。结果显示在下面输入框。
【vfp中的数据查询(锦集5篇)】相关文章:
生物技术专业毕业生的求职信2023-02-07
案例教学法在成人高校《电子商务》教学中应用2023-09-23
VFP:模拟VB控件数组操作标签控件2023-06-09
生物技术专业求职信2022-12-12
全国计算机等级考试考前四大注意事项2023-04-18
案例教学法在国际贸易实务教学中的应用探析的经济论文2023-06-07
任务驱动教学法在数据库教学中的应用论文2023-08-10
案例教学法在管理学原理课程教学中的价值分析论文2022-11-24
计算机实验心得与总结2022-07-02
病例分析教学法在基础医学教学中的应用论文2023-03-21