就是那个“超时时间已到。在从池中获取连接之前超时时间已过。出现这种情况可能是因为所有池连接都已被使用并已达到最大池大小。”的问题,今天终于解决了。
解决的途径就是使用DataAdapter的Fill来填充DataTable,然后从DataTable中读取数据。
DataTable是内存中的数据表,是独立于数据源的,所以在读取其中数据时,无需建立数据库的连接,这样就避免了连接的占用。
posted @ 2006-07-28 13:18 陈涛 阅读(175) | 评论 (1)编辑
超时时间已到。在从池中获取连接之前超时时间已过。出现这种情况可能是因为所有池连接都已被使用并已达到最大池大小。
在地方客的开发过程中遇到几次这样的错误。其实可以知道原因就是数据库连接过于频繁造成的。但是因为读取每个地点后,需要读取这个地点的所有上级地点或下级地点,多次使用嵌套调用,一定会造成这个错误。我现在还没有找到一个好的办法来解决这个问题,系统也不能不读取联级数据,所以只能通过一些拙劣的手段来尽量避免。
posted @ 2006-07-15 16:33 陈涛 阅读(54) | 评论 (0)编辑
实现分页,可以使用嵌套查询,也可以使用存储过程。不过存储过程太复杂,执行效率也不一定高,所以我就用这样的嵌套语句来实现:
SELECT TOP 页大小 * FROM TestTable WHERE (ID >(SELECT MAX(id) FROM (SELECT TOP 页大小*页数 id  FROM 表 ORDER BY id) AS T)) ORDER BY ID
posted @ 2006-07-12 14:26 陈涛 阅读(570) | 评论 (9)编辑
这个代码实现了这样的功能:页面载入时读取数据库,判断用户是否收藏了地点(即是否去过或者想去),然后显示:假如收藏了,则显示收藏类型;假如未收藏,则显示收藏按钮。
当显示收藏按钮时,用户点击按钮,更新数据库,并更新页面,显示为收藏状态。显示收藏状态时,旁边有删除收藏的按钮,点击后,删除数据库记录,并更新页面。

开始的时候遇到一个问题:页面载入时显示正常,但当用户修改时,XMLHttpRequest对象会始终处于发送状态,无法接收到服务器端响应。

经过不断修改,尝试,终于发现问题所在:
因为整个过程使用的是同一个XMLHttpRequest对象,则可能导致上次的数据传输影响下次传输的问题。
解决方法就是在第一次使用XMLHttpRequest对象后,下一次调用前释放XMLHttpRequest对象。使用语句
XMLHttpRequest.abort
可以实现。

修改后代码如下:
 1    var xhr_h;
 2            
 3    function createXMLHttpRequest(){
 4    if(window.XMLHttpRequest){
 5    xhr_h = new XMLHttpRequest();
 6    if (xhr_h.overrideMimeType){
 7    xhr_h.overrideMimeType("text/xml");
 8    }

 9        
10    }

11    else if(window.ActiveXObject){
12    try{
13    xhr_h = new  ActiveXObject("Msxml2.XMLHTTP");
14    }
catch(e){
15    xhr_h = new ActiveXObject("Microsoft.XMLHTTP");
16    }

17    }

18    if(!xhr_h){
19        document.getElementById("divishere").innerHTML ="浏览器不支持";
20    }

21    return xhr_h;
22    }

23            
24    function load_ishere(){
25        createXMLHttpRequest();
26        document.getElementById("divishere").innerHTML ="正在读取";
27        xhr_h.onreadystatechange=show_ishere;
28        xhr_h.open("GET","ajax/load_ishere.aspx?p=" + thisp);
29        xhr_h.send(null);
30    }

31
32    function save_place(a){
33        xhr_h.abort();
34        createXMLHttpRequest();
35        document.getElementById("divishere").innerHTML ="正在保存";
36        xhr_h.onreadystatechange=show_ishere;
37        xhr_h.open("GET","ajax/load_ishere.aspx?p=" + thisp + "&a=" + a);
38        xhr_h.send(null);
39    }

40
41    function del_place(){
42        xhr_h.abort();
43        createXMLHttpRequest();
44        document.getElementById("divishere").innerHTML ="正在更新";
45        xhr_h.onreadystatechange=show_ishere;
46        xhr_h.open("GET","ajax/load_ishere.aspx?p=" + thisp + "&d=1");
47        xhr_h.send(null);
48    }

49            
50    function show_ishere(){
51        if(xhr_h.readystate==4){
52            if(xhr_h.status==200){
53                var strreturn=xhr_h.responseText;
54                document.getElementById("divishere").innerHTML =strreturn;
55            }
else{
56                document.getElementById("divishere").innerHTML ="错误:"+xhr_h.status;
57            }

58        }

59    }

60
61    load_ishere();

posted @ 2006-07-04 21:22 陈涛 阅读(613) | 评论 (0)编辑

所有的地点信息,无论是国家还是城市,都存储在表place里,每个地点由主键id标识,字段upid记录了这个地点的上级地点的id。最上级地点的upid字段为空。
现在要求显示一个地点,包括它的所有上级地点。比如需要得到如下结果:

中国 > 云南 > 昆明 > 五华区

思路其实很简单,用嵌套自身的子过程就能实现。只有关键的一点:控制循环的结束。当进行一次循环时,判断upid字段是否为空,为空则停止循环。将每次循环读取的地点信息累加赋值给字符串变量。

代码如下:
 1    Private Sub Show_UpPlace()Sub Show_UpPlace(ByVal newID)
 2
 3        txtSQL = "select * from place where id='" & newID & "'"
 4        cnn = New SqlClient.SqlConnection(ConfigurationSettings.AppSettings("objconnstr"))
 5        cmd.Connection = cnn
 6        cmd.Connection.Open()
 7        cmd.CommandText = txtSQL
 8        rdr = cmd.ExecuteReader()
 9
10        If rdr.Read() = True Then
11            strUpName = rdr("name"& strUpName
12
13            If Not rdr("upid"Is DBNull.Value Then
14                Dim newUpID As Integer
15                newUpID = rdr("upid")
16                rdr.Close()
17                cmd.Dispose()
18                cnn.Close()
19
20                strUpName = " > " & strUpName
21
22                Show_UpPlace(newUpID)
23
24            End If
25
26        End If
27
28        rdr.Close()
29        cmd.Dispose()
30        cnn.Close()
31
32    End Sub
posted @ 2006-06-28 16:52 陈涛 阅读(455) | 评论 (2)编辑
昨天的一个中文乱码问题:用XMLHttpRequest对象发送中文参数后,返回的是乱码。

我一开始上网找了很多Utf-8和GB2312编码转换的函数,放到程序里,都没有任何效果。无论是在发送的时候把UTF转换成GB,还是在返回的时候反过来转换都不行。

最后发现,在Web.config文件中有一行:
<globalization requestEncoding="utf-8" responseEncoding="utf-8" />

觉得可能问题出在这里,改成下面这样:
<globalization requestEncoding="gb2312" responseEncoding="gb2312" />

运行,问题终于解决了!
posted @ 2006-06-27 13:32 陈涛 阅读(626) | 评论 (6)编辑
今天设计了添加地点的程序。其实本来很简单,用户输入地点的名称和简介,点击按钮,数据保存到数据库。不过为了避免用户在不知情的状况下添加数据库里已经存在的地点,就有必要在用户输入的同时搜索数据库,显示出与用户输入的地点名称重复的已经存在的地点,让用户决定是否继续添加。

为了给用户带来良好的使用体验,实现这个功能不应该涉及postback导致页面刷新,换句话说,就是要使用现在流行的Ajax技术。

我一开始想到的方法是:监视input控件的onchange事件调用运行一个外部JavaScript文件,通过这个JS文件的document.write()方法来显示。我想让输入的文本通过onchange事件调用函数的参数传递给JavaScript文件,再通过JavaScript文件的后台读取数据并显示。后来发现两个问题:
1.参数只能传递给JavaScript文件,却无法传递到后台;
2.onchange事件是在焦点离开input控件时才触发,而不能实现输入的同时调用函数。
程序修改了N次后,我觉得这条路走不过去了。

前几天买了一本书,名字叫《Ajax修炼之道》。想起来上面有个简单的例子,实现了当用户输入一个城市的电话区号后,另外一个文本框就自动显示那个城市的名称。它使用了一个叫XMLHttpRequest的对象。我根据这个例子,重新思考后,写下了现在的代码:
 1            var xhr;
 2            
 3            function createXMLHttpRequest() {
 4                if (window.ActiveXObject) {
 5                    xhr = new ActiveXObject("Microsoft.XMLHTTP");
 6                }

 7                else if (window.XMLHttpRequest) {
 8                    xhr = new XMLHttpRequest();
 9                    
10                }

11            }

12            
13            function getchar(c){
14                createXMLHttpRequest();
15                
16                xhr.onreadystatechange=showplace;
17                xhr.open("GET","load_isplace.aspx?c=" + c);
18                xhr.send(null);
19            }

20            
21            function showplace(){
22                if(xhr.readystate==4){
23                    var strreturn=xhr.responseText;
24                    document.getElementById("divshowplace").innerHTML =strreturn;
25                }

26            }

现在已经可以实现参数传递到后台,第一个问题已经解决。我又上网找了一些资料,知道了还有一个onpropertychange事件,替换onchange后,就实现了当文本框内容改变时调用函数。问题都解决了。

不过不幸的是,这个程序对字母和数字没有问题,但中文的输入却会返回乱码。上网一查,才知道XMLHttpRequest对象只支持Utf-8编码,不支持GB编码。问题严重了。今天没有时间了,明天解决这个问题。
posted @ 2006-06-26 22:55 陈涛 阅读(322) | 评论 (3)编辑

根据参数显示地图,单击地图标注地点,完成后将该地点的经纬度和默认地图缩放级别保存到数据库

以下代码为显示地图和标注:(mark_place_map.js)

 1    function load() {
 2      if (GBrowserIsCompatible()) {
 3        var map = new GMap2(document.getElementById("map"));
 4        map.addControl(new GLargeMapControl());
 5        map.addControl(new GMapTypeControl());
 6        map.setCenter(new GLatLng(thisx, thisy),thisz,G_SATELLITE_MAP);
 7        map.addOverlay(new GMarker(new GLatLng(thisx, thisy)));
 8        
 9        document.getElementById("txtlat").value =thisx
10        document.getElementById("txtlng").value =thisy
11        document.getElementById("txtz").value =thisz
12        
13        
14        GEvent.addListener(map, "click"function(marker, point) {
15            map.clearOverlays();
16            
17            map.addOverlay(new GMarker(point));
18            map.panTo(point)
19            document.getElementById("txtlat").value = point.lat().toString();
20            document.getElementById("txtlng").value = point.lng().toString();
21        }
);
22        
23        GEvent.addListener(map, "zoomend",function() {
24            document.getElementById("txtz").value = map.getZoom().toString();
25        }
);
26
27
28      }

29    }

30

posted @ 2006-06-26 13:09 陈涛 阅读(160) | 评论 (0)编辑

每个人心中都有一幅地图,出生在那个小村庄、求学在这个城市、那个公园里难忘的约会、这条街寂寞的回忆……每个地方都是一个烙印,深深烙在地图上,悄悄印在心里。
地方客将帮助您把心中的地图展现出来。

1.个性化地图。
在这里,您可以方便快捷地建立起属于自己的地图,在其上标注任何与某个地点有关的信息。举个最基本的例子,我可以建立一个“我到过的地方”地图,标出昆明、上海、南京、武汉、洛阳等地方。这幅地图可以通过网址复制、嵌入代码等方式自由使用。

2.分享地方故事和照片。
每个人都有许多故事,其中有很多故事与某个地方有着紧密的联系,比如旅行中体味到的异国风情、城市里偶然的邂逅。在这里,各个地方的故事通过地图聚在一起。您关注你的家乡吗?那里的故事一定会引起你的共鸣。分享出您自己的故事,让更多人喜欢家乡的人一起感动。
除了故事,还有无数的照片,山水、高楼,同一个地方,有不同的风景。

3.真实的社交圈地图。
地方客的用户之间可以很方便地搭建起沟通的桥梁,一句评论,一条短消息,让每个人都有机会遇到另一个人,当您发现找到与自己志同道合的人,您可以轻松地把对方作为朋友从而继续保持联系。而通过地图,朋友们的分布一目了然,甚至朋友的朋友,也可以显现出来。一张真实的社交圈地图将展现在您眼前。

posted @ 2006-06-26 13:01 陈涛 阅读(97) | 评论 (1)编辑