紧急求助!如何利用XmlHttp来实现B/S客户端无刷新读取数据库的数据?

时间:2022-09-12 21:29:50
我初步打算,从设备向数据库传输采集数据,在浏览器中使用Teechart控件把数据读出来,基本上做到实时监测,同步能做近似最好,
现在我问题有这么几个:
需要找一段程序,模拟设备采集数据信号,不断向数据库传送,我用的是MSSQL。
另外,一端的IE浏览器显示出数据的变化效果,我只要求实现示例的效果。
现在我的数据显示,还是采用 定时刷新
听说有iframe隐藏桢 java Applet之类的方法可以实现,奈何我比较着急,而且这些都没用过,
能提供帮助者,希望不吝赐教,参与就有分,大家帮我顶阿。
主要代码如下:
<SCRIPT LANGUAGE="VBScript">
<!--

dim index
dim recordCount
dim dataValue
<%
dim i,j
Set Conn = Server.CreateObject("ADODB.Connection")
Set RS = Server.CreateObject("ADODB.RecordSet")
Conn.Open "driver={SQL Server};server=M****L;UID=sa;PWD=0****0;Database=s*****l"
RS.Open "select top 100 * from s* order by Col001 desc", Conn, 1,1
response.write "recordCount=" & rs.recordcount & vbcrlf
response.write "redim dataValue(99)" & vbcrlf
i=0
while not rs.eof
response.write "dataValue(" & i & ")=" & rs(1) & vbcrlf
i=i+1
rs.movenext
wend
rs.close
Conn.Close
%>

Sub Window_onload()

TChart1.Environment.IEPrintWithPage=True

TChart1.AddSeries(6)
set s=TChart1.Series(0)
s.FillSampleValues(10)
s.Title="Stock 1"



TChart1.Header.Text.Add("**")
TChart1.Header.Font.Bold=True
TChart1.Header.Font.Color=vbBlack
TChart1.Header.Font.Size=12

TChart1.Legend.Visible=False

TChart1.Walls.Left.Size=10
TChart1.Walls.Bottom.Size=10

TChart1.Zoom.Animated=false
TChart1.Aspect.View3D=false
TChart1.TimerEnabled=false
TChart1.TimerInterval=100



index=0
s=TChart1.Series(0).Clear

set s=TChart1.Series(0)
s.Clear
s.AddXY 1, dataValue(0), "", 536870912
For i = 1 To 99
s.AddXY s.XValues.Last + 1, dataValue(i), "",536870912
Next

end sub

sub TChart1_OnTimer()
index=index+1
if index>recordCount then
index=1
end if
for t=0 to TChart1.SeriesCount -1
set s=TChart1.Series(t)
s.Delete(0)
if index=1 then
s.AddXY s.XValues.Last, dataValue(index), "", 536870912
else
s.AddXY s.XValues.Last + 1, dataValue(index), "", 536870912
end if
next
end sub
-->
</SCRIPT>
<html>

<head><LINK REL=STYLESHEET TYPE="text/css" HREF="style.css"><meta http-equiv="refresh" content="2">
<style type="text/css">
<!--
.style1 {font-size: 24px}
-->
</style>

</head>
<BODY bgcolor=#FFFFFF>

<div align="center" class="style1">********************
</div>
<p>&nbsp;

</p>



<hr>

<p align="center">
<input type="checkbox" checked onclick="TChart1.Aspect.View3D= not TChart1.Aspect.View3D" name="View3">
3D效果
<input type="checkbox" checked onclick="TChart1.TimerEnabled= not TChart1.TimerEnabled" name="Anim">
动画
<input type="button" value="图表编辑..." onclick="TChart1.ShowEditor" name="ShowEd">
</p>
<p align=center>
<object id="TChart1" width=922 height=461
codebase="http://*.*.*.245/cab/TeeChart5.cab#version=5,0,4,0"
classid="CLSID:B6C10489-FB89-11D4-93C9-006008A7EED4">
<embed width="922" height="461"></embed>
</object>
</p>

</BODY>
</html>
隐藏桢弄了一下感觉意义不大。还要大家帮忙啊,分数去下面领。


http://community.csdn.net/Expert/TopicView3.asp?id=4055465          68分
http://community.csdn.net/Expert/TopicView3.asp?id=4059550          100分
http://community.csdn.net/Expert/TopicView3.asp?id=4058917          100分
xml我是一点基础也没有,大家如果热心最好给出完整的代码。分数不够您说话。

17 个解决方案

#1


http://www.womenwatch-china.org/upload/mbook.rar

#2


<SCRIPT LANGUAGE="JavaScript">
 
function getData()
{
var xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");

// 异步调用 
xmlhttp.onreadystatechange = function()
{
if (xmlhttp.readyState == 4) // 调用完毕
{
if (xmlhttp.status == 200) // 加载成功
{
var xmldoc = xmlhttp.responseXML;
var root = xmldoc.documentElement;

alert (xmldoc.xml);
}
}
}

var url = 'xml.asp';
xmlhttp.open("get", url, true);
xmlhttp.send();
}
 
</SCRIPT>
 

<BODY>

异步调用 xmlhttp 取后台数据
<input type="button" value="GetData" onclick="getData()">

 <%
dim i, xml

xml = "<?xml version='1.0' encoding='gb2312' ?>"
xml = xml & "<data>"

for i = 1 to 50
xml = xml & "<record>记录" & i & "</record>"
next

xml = xml & "</data>"

response.ContentType = "text/xml"
response.write xml
%>

#3


楼上的什么意思
我能用的上么。

#4


2楼正解,或者你去搜索无刷频聊天室看看
听说有iframe隐藏桢 java Applet之类的方法可以实现,奈何我比较着急,而且这些都没用过,

呵呵,iframe隐藏桢 html中写xmlhttp就可以了,

你看看动网也是这么做的啊,

点击首页的+(栏目)

#5


狼怎么反复都是这个代码啊?

#6


我没用过xml,看不懂这段程序有什么用处,谁能解决一下。

#7


前些时间写了几篇关于XMLHTTP运用的实例.
(可以到http://dev.csdn.net/user/wanghr100看之前的几编关于XMLHTTP的介绍.)

近来看论坛上经常有人提问关于如何无刷新,自动更新数据.
传统上,我们浏览网页,如果加入最新的数据.只能是等我们重新向服务器端请求时才能显示出来.
但是,对于一些时效性很强的网站.传统的这种做法是不能满足的.

我们可以让程序自动刷新.定时向服务器请求数据.5秒取一次数据,10秒取一次数据.
利用XMLHTTP发出请求并取得数据.传到客户端,客户端重新组织并显示数据.

demo.htm    前台显示.

<script language="JavaScript">
function GetResult()
{
/*
 *--------------- GetResult() -----------------
 * GetResult() 
 * 功能:通过XMLHTTP发送请求,返回结果.
 * 参数:str,字符串,发送条件.
 * 实例:GetResult();
 * author:wanghr100(灰豆宝宝.net)
 * update:2004-5-27 19:02
 *--------------- GetResult() -----------------
 */
    var oBao = new ActiveXObject("Microsoft.XMLHTTP");
    //特殊字符:+,%,&,=,?等的传输解决办法.字符串先用escape编码的.
    //Update:2004-6-1 12:22
    oBao.open("POST","Server.asp",false);
    oBao.send();
    //服务器端处理返回的是经过escape编码的字符串.
    var strResult = unescape(oBao.responseText);
    //将字符串分开.
    var arrResult = strResult.split("###");
    RemoveRow(); //删除以前的数据.
    //将取得的字符串分开,并写入表格中.
    for(var i=0;i<arrResult.length;i++)
    {
        arrTmp = arrResult[i].split("@@@");
        num1 = arrTmp[0]; //字段num1的值
        num2 = arrTmp[1]; //字段num2的值
        row1 = tb.insertRow();
        cell1 = row1.insertCell();
        cell1.innerText = num1;
        cell2 = row1.insertCell();
        cell2.innerText = num2;
    }
}

function RemoveRow()
{
    //保留第一行表头,其余数据均删除.
    var iRows = tb.rows.length;
    for(var i=0;i<iRows-1;i++)
    {
        tb.deleteRow(1);
    }
}

function MyShow()
{
    //2秒自动刷新一次,2秒取得一次数据.
    timer = window.setInterval("GetResult()",2000);
}
</script>

<body onload="MyShow()">
<p>
</p>
<table width="47%" height="23"  border="0" cellpadding="1" cellspacing="0" id="tb">
  <tr>
    <td>num1</td>
    <td>num2</td>
  </tr>
</table>


Server.asp  后台读取数据

<% @Language="JavaScript" %>
<%
function OpenDB(sdbname)
{
/*
 *--------------- OpenDB(sdbname) -----------------
 * OpenDB(sdbname) 
 * 功能:打开数据库sdbname,返回conn对象.
 * 参数:sdbname,字符串,数据库名称.
 * 实例:var conn = OpenDB("database.mdb");
 * author:wanghr100(灰豆宝宝.net)
 * update:2004-5-12 8:18
 *--------------- OpenDB(sdbname) -----------------
 */
    var connstr = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source="+Server.MapPath(sdbname);
    var conn = Server.CreateObject("ADODB.Connection");
    conn.Open(connstr);
    return conn;
}
var sResult = new Array();
var oConn = OpenDB("data.mdb");
//特殊字符:+,%,&,=,?等的传输解决办法.客户端字符是经过escape编码的
//所以服务器端先要经过unescape解码.
//Update:2004-6-1 12:22
var sql = "select num1,num2 from nums order by id";
var rs = oConn.Execute(sql);
while(!rs.EOF)
{
    //一条记录用"###"隔开.每列数据用"@@@"隔开. 这是以只有两个列数据的情况.
    sResult[sResult.length] = rs("num1").Value + "@@@" + rs("num2").Value
    rs.MoveNext();
}
//escape解决了XMLHTTP。中文处理的问题.
Response.Write(escape(sResult.join("###")));
%>


数据库data.mdb
表 nums
id,自动编号
num1,文本
num2,文本

测试数据

id      num1    num2
1       20.70   20.810
2       10.5    20.5
3       12.3    300
4       132     323
5       563     56
6       20      10

#8


如果仅仅是把数据从数据库中拿出来确实可以实现。
但是数据是从数据库中传到控件里,该怎么办。

#9


可以这样处理,前台显示从服务器读取数据之后输入到一个数组中,可以先设定取得的数据为最新的100个数据,这样数组也设定为100,然后再刷新dataValue,控件读取的数据就为最新的图像
,可是我不会编谁能帮我一把。

短时间内编程不会有进步,还是写不出来,怎么办。

#10


看来还得还得自己来

#11


关注~!
VBS如何调用Teechart控件?

#12


灰豆的这段代码我试验了
demo.htm在服务器上有效,在别的机器上用就无效,为什么呢。

#13


学习。。。

#14


总结一天来学习无刷新

我N年前的一篇文章,你百度搜一下。
问题应该能解决

#15


提供一下我写的一个例子吧:
随意测试写的

<!--#include file="array.asp"-->
<SCRIPT language=javascript>
<!--
function bar(){
var oXMLDoc = new ActiveXObject('MSXML');             //创建'MSXML'对象
sURL = "d.asp"      //获取登陆状态数据的地址
oXMLDoc.url = sURL;     //load数据
var oRoot=oXMLDoc.root;     //获取返回xml数据的根节点
if(oRoot.children != null)  
{     
//根据返回的数据在客户端显示
yy.innerHTML=oRoot.children.item(0).text;       //用户
img.innerHTML=oRoot.children.item(1).text;       //时间
a.innerHTML=oRoot.children.item(2).text;  
}
var timeoutid = setTimeout("bar()",2000)
}      //每1.5秒重获一次数据,}
//-->
</SCRIPT>
<script language="JavaScript" type="text/JavaScript">
<!--
function MM_callJS(jsStr) { //v2.0
  return eval(jsStr)
}
//-->
</script>
<iframe Id=ActFrm style='width:0;height:0;visibility:hidden'></iframe>
<script language='javascript'>
function k(items){
  var x=window.event.x;
  var y=window.event.y;
  ActFrm.document.location="c.asp?x="+x+"&y="+y;
 }
</script>

</html>
<body onLoad="bar()" onclick="k()">请点击屏幕:
<span id=yy></span><span id=img></span><br><span id=a></span>

<%
x=Request.QueryString("x")
y=Request.QueryString("y")
Set Rs=Server.CreateObject("ADODB.RecordSet")
Sql = "update xy set x="&x&",y="&y&" Where id=1"
Rs.Open Sql,conn,1,3
Rs.AddNew
Rs("x")=x
Rs("y")=y
Rs.Update
%>

#16


d.asp
<%  
Response.expires  =  0  
Response.expiresabsolute  =  Now()  -  1  
Response.addHeader  "pragma",  "no-cache"  
Response.addHeader  "cache-control",  "private"  
Response.CacheControl  =  "no-cache"  
%> 

<%
DBPath="xy.mdb"
Set conn = Server.CreateObject("ADODB.Connection")
rs="DBQ="&server.mappath(dbpath)&";DRIVER={Microsoft Access Driver (*.mdb)};"
conn.Open rs
set rs=server.createobject("adodb.recordset")
rs.open "Select * From xy where id=1",conn,3,3
do while not rs.eof 
%>
<?xml version="1.0" encoding="gb2312" ?>
<plan>
<yy><%=application("show6")%></yy>
<img><%=Rs("x")%>,<%=Rs("y")%></img>
<a>&lt;img src="1.jpg" width="<%=Rs("x")%>",height="<%=Rs("y")%>"&gt;</a>
</plan>
<%rs.movenext%>
<%loop%>


#17


http://bbs.nuc.edu.cn/pc/pccon.php?id=15&nid=81&order=&tid=17

#1


http://www.womenwatch-china.org/upload/mbook.rar

#2


<SCRIPT LANGUAGE="JavaScript">
 
function getData()
{
var xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");

// 异步调用 
xmlhttp.onreadystatechange = function()
{
if (xmlhttp.readyState == 4) // 调用完毕
{
if (xmlhttp.status == 200) // 加载成功
{
var xmldoc = xmlhttp.responseXML;
var root = xmldoc.documentElement;

alert (xmldoc.xml);
}
}
}

var url = 'xml.asp';
xmlhttp.open("get", url, true);
xmlhttp.send();
}
 
</SCRIPT>
 

<BODY>

异步调用 xmlhttp 取后台数据
<input type="button" value="GetData" onclick="getData()">

 <%
dim i, xml

xml = "<?xml version='1.0' encoding='gb2312' ?>"
xml = xml & "<data>"

for i = 1 to 50
xml = xml & "<record>记录" & i & "</record>"
next

xml = xml & "</data>"

response.ContentType = "text/xml"
response.write xml
%>

#3


楼上的什么意思
我能用的上么。

#4


2楼正解,或者你去搜索无刷频聊天室看看
听说有iframe隐藏桢 java Applet之类的方法可以实现,奈何我比较着急,而且这些都没用过,

呵呵,iframe隐藏桢 html中写xmlhttp就可以了,

你看看动网也是这么做的啊,

点击首页的+(栏目)

#5


狼怎么反复都是这个代码啊?

#6


我没用过xml,看不懂这段程序有什么用处,谁能解决一下。

#7


前些时间写了几篇关于XMLHTTP运用的实例.
(可以到http://dev.csdn.net/user/wanghr100看之前的几编关于XMLHTTP的介绍.)

近来看论坛上经常有人提问关于如何无刷新,自动更新数据.
传统上,我们浏览网页,如果加入最新的数据.只能是等我们重新向服务器端请求时才能显示出来.
但是,对于一些时效性很强的网站.传统的这种做法是不能满足的.

我们可以让程序自动刷新.定时向服务器请求数据.5秒取一次数据,10秒取一次数据.
利用XMLHTTP发出请求并取得数据.传到客户端,客户端重新组织并显示数据.

demo.htm    前台显示.

<script language="JavaScript">
function GetResult()
{
/*
 *--------------- GetResult() -----------------
 * GetResult() 
 * 功能:通过XMLHTTP发送请求,返回结果.
 * 参数:str,字符串,发送条件.
 * 实例:GetResult();
 * author:wanghr100(灰豆宝宝.net)
 * update:2004-5-27 19:02
 *--------------- GetResult() -----------------
 */
    var oBao = new ActiveXObject("Microsoft.XMLHTTP");
    //特殊字符:+,%,&,=,?等的传输解决办法.字符串先用escape编码的.
    //Update:2004-6-1 12:22
    oBao.open("POST","Server.asp",false);
    oBao.send();
    //服务器端处理返回的是经过escape编码的字符串.
    var strResult = unescape(oBao.responseText);
    //将字符串分开.
    var arrResult = strResult.split("###");
    RemoveRow(); //删除以前的数据.
    //将取得的字符串分开,并写入表格中.
    for(var i=0;i<arrResult.length;i++)
    {
        arrTmp = arrResult[i].split("@@@");
        num1 = arrTmp[0]; //字段num1的值
        num2 = arrTmp[1]; //字段num2的值
        row1 = tb.insertRow();
        cell1 = row1.insertCell();
        cell1.innerText = num1;
        cell2 = row1.insertCell();
        cell2.innerText = num2;
    }
}

function RemoveRow()
{
    //保留第一行表头,其余数据均删除.
    var iRows = tb.rows.length;
    for(var i=0;i<iRows-1;i++)
    {
        tb.deleteRow(1);
    }
}

function MyShow()
{
    //2秒自动刷新一次,2秒取得一次数据.
    timer = window.setInterval("GetResult()",2000);
}
</script>

<body onload="MyShow()">
<p>
</p>
<table width="47%" height="23"  border="0" cellpadding="1" cellspacing="0" id="tb">
  <tr>
    <td>num1</td>
    <td>num2</td>
  </tr>
</table>


Server.asp  后台读取数据

<% @Language="JavaScript" %>
<%
function OpenDB(sdbname)
{
/*
 *--------------- OpenDB(sdbname) -----------------
 * OpenDB(sdbname) 
 * 功能:打开数据库sdbname,返回conn对象.
 * 参数:sdbname,字符串,数据库名称.
 * 实例:var conn = OpenDB("database.mdb");
 * author:wanghr100(灰豆宝宝.net)
 * update:2004-5-12 8:18
 *--------------- OpenDB(sdbname) -----------------
 */
    var connstr = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source="+Server.MapPath(sdbname);
    var conn = Server.CreateObject("ADODB.Connection");
    conn.Open(connstr);
    return conn;
}
var sResult = new Array();
var oConn = OpenDB("data.mdb");
//特殊字符:+,%,&,=,?等的传输解决办法.客户端字符是经过escape编码的
//所以服务器端先要经过unescape解码.
//Update:2004-6-1 12:22
var sql = "select num1,num2 from nums order by id";
var rs = oConn.Execute(sql);
while(!rs.EOF)
{
    //一条记录用"###"隔开.每列数据用"@@@"隔开. 这是以只有两个列数据的情况.
    sResult[sResult.length] = rs("num1").Value + "@@@" + rs("num2").Value
    rs.MoveNext();
}
//escape解决了XMLHTTP。中文处理的问题.
Response.Write(escape(sResult.join("###")));
%>


数据库data.mdb
表 nums
id,自动编号
num1,文本
num2,文本

测试数据

id      num1    num2
1       20.70   20.810
2       10.5    20.5
3       12.3    300
4       132     323
5       563     56
6       20      10

#8


如果仅仅是把数据从数据库中拿出来确实可以实现。
但是数据是从数据库中传到控件里,该怎么办。

#9


可以这样处理,前台显示从服务器读取数据之后输入到一个数组中,可以先设定取得的数据为最新的100个数据,这样数组也设定为100,然后再刷新dataValue,控件读取的数据就为最新的图像
,可是我不会编谁能帮我一把。

短时间内编程不会有进步,还是写不出来,怎么办。

#10


看来还得还得自己来

#11


关注~!
VBS如何调用Teechart控件?

#12


灰豆的这段代码我试验了
demo.htm在服务器上有效,在别的机器上用就无效,为什么呢。

#13


学习。。。

#14


总结一天来学习无刷新

我N年前的一篇文章,你百度搜一下。
问题应该能解决

#15


提供一下我写的一个例子吧:
随意测试写的

<!--#include file="array.asp"-->
<SCRIPT language=javascript>
<!--
function bar(){
var oXMLDoc = new ActiveXObject('MSXML');             //创建'MSXML'对象
sURL = "d.asp"      //获取登陆状态数据的地址
oXMLDoc.url = sURL;     //load数据
var oRoot=oXMLDoc.root;     //获取返回xml数据的根节点
if(oRoot.children != null)  
{     
//根据返回的数据在客户端显示
yy.innerHTML=oRoot.children.item(0).text;       //用户
img.innerHTML=oRoot.children.item(1).text;       //时间
a.innerHTML=oRoot.children.item(2).text;  
}
var timeoutid = setTimeout("bar()",2000)
}      //每1.5秒重获一次数据,}
//-->
</SCRIPT>
<script language="JavaScript" type="text/JavaScript">
<!--
function MM_callJS(jsStr) { //v2.0
  return eval(jsStr)
}
//-->
</script>
<iframe Id=ActFrm style='width:0;height:0;visibility:hidden'></iframe>
<script language='javascript'>
function k(items){
  var x=window.event.x;
  var y=window.event.y;
  ActFrm.document.location="c.asp?x="+x+"&y="+y;
 }
</script>

</html>
<body onLoad="bar()" onclick="k()">请点击屏幕:
<span id=yy></span><span id=img></span><br><span id=a></span>

<%
x=Request.QueryString("x")
y=Request.QueryString("y")
Set Rs=Server.CreateObject("ADODB.RecordSet")
Sql = "update xy set x="&x&",y="&y&" Where id=1"
Rs.Open Sql,conn,1,3
Rs.AddNew
Rs("x")=x
Rs("y")=y
Rs.Update
%>

#16


d.asp
<%  
Response.expires  =  0  
Response.expiresabsolute  =  Now()  -  1  
Response.addHeader  "pragma",  "no-cache"  
Response.addHeader  "cache-control",  "private"  
Response.CacheControl  =  "no-cache"  
%> 

<%
DBPath="xy.mdb"
Set conn = Server.CreateObject("ADODB.Connection")
rs="DBQ="&server.mappath(dbpath)&";DRIVER={Microsoft Access Driver (*.mdb)};"
conn.Open rs
set rs=server.createobject("adodb.recordset")
rs.open "Select * From xy where id=1",conn,3,3
do while not rs.eof 
%>
<?xml version="1.0" encoding="gb2312" ?>
<plan>
<yy><%=application("show6")%></yy>
<img><%=Rs("x")%>,<%=Rs("y")%></img>
<a>&lt;img src="1.jpg" width="<%=Rs("x")%>",height="<%=Rs("y")%>"&gt;</a>
</plan>
<%rs.movenext%>
<%loop%>


#17


http://bbs.nuc.edu.cn/pc/pccon.php?id=15&nid=81&order=&tid=17