http://www.sufeinet.com/plugin.php?id=keke_group

苏飞论坛

 找回密码
 马上注册

QQ登录

只需一步,快速开始

分布式系统框架(V2.0) 轻松承载百亿数据,千万流量!讨论专区 - 源码下载 - 官方教程

HttpHelper爬虫框架(V2.7-含.netcore) HttpHelper官方出品,爬虫框架讨论区 - 源码下载 - 在线测试和代码生成

HttpHelper爬虫类(V2.0) 开源的爬虫类,支持多种模式和属性 源码 - 代码生成器 - 讨论区 - 教程- 例子

查看: 3232|回复: 3

[其他] 【执行效率】循环中用到SQL数据库,求执行效率

[复制链接]
发表于 2013-6-8 12:41:27 | 显示全部楼层 |阅读模式
本帖最后由 秋日的枫叶 于 2013-6-8 13:03 编辑

在写软件的时候
需要写到一个方法,该方法通过我传递的一个string字符串到数据库表bst_System_Place中进行匹配字段cnPlaceName,取得该表中另一个字段PID的值

我写的方法如下:
  1. [code=csharp]   //匹配所在城市
  2.         public int GetCiyt (string city)
  3.         {
  4.             string strarea = city.Substring(city.Length-2);
  5.             SqlConnection conn = new SqlConnection(connstr);
  6.             conn.Open(); //打开数据库
  7.             SqlCommand cmd = conn.CreateCommand();
  8.             cmd.CommandText = "SELECT * FROM bst_System_Place WHERE cnPlaceName LIKE '@city'";
  9.             cmd.Parameters .AddWithValue ("@city",strarea);
  10.             SqlDataReader reader = cmd.ExecuteReader();
  11.             if (reader.HasRows)
  12.             {
  13.                 int x = (int)reader["PID"];
  14.                 return x;
  15.             }
  16.             else
  17.             {
  18.                 int y = 1148;
  19.                 return y;
  20.             }
  21.             reader.Dispose();
  22.             cmd.Dispose();
  23.             conn.Dispose();

  24.             //switch (strarea)
  25.             //{
  26.             //    case "江苏":
  27.             //        return 1006;
  28.             //        //break;
  29.             //    case "天津":
  30.             //        return 1003;
  31.             //        break;
  32.             //}
  33.         }
复制代码
[/code]问题1:

      由于方法GetCity在程序中需要循环的执行,这就意味着我要频繁的打开数据库关闭数据库,这样执行效率非常低,而且也不稳定。
请问有什么办法解决吗?

我自己想到的办法是通过设置全局变量二维数组int[x,y]
在程序中一次读出数据库中这2字段内容,并存放到二维数组int[x,y]中
然后在方法中直接进行和二维数组进行对比。不过总觉得这个满复杂的,还有其他简单办法?

还有解决办法我在代码中注释掉了,就是因为有400过个城市,每个城市都用switch判断,要把我敲死了哈哈。。。
问题2:
上面方法中的  cmd.Parameters .AddWithValue ("@city",strarea);这个代码我如果写成
               cmd.Parameters .AddWithValue (city,strarea);用什么不同吗?



1. 开通SVIP会员,免费下载本站所有源码,不限次数据,不限时间
2. 加官方QQ群,加官方微信群获取更多资源和帮助
3. 找站长苏飞做网站、商城、CRM、小程序、App、爬虫相关、项目外包等点这里
发表于 2013-6-8 13:09:01 | 显示全部楼层
这个使用一个List就行了吧,
先定义一下这样的类
[code=csharp] /// <summary>
        /// 构造器设置值
        /// </summary>
        /// <param name="_id">ID</param>
        /// <param name="_name">城市名称</param>
        public city(string _id, string _name)
        {
            id = _id;
            name = _name;
        }
        /// <summary>
        /// 城市ID
        /// </summary>
        public string id { set; get; }
        //城市名称
        public string name { set; get; }
    }[/code]
然后把数据添加到这里面
[code=csharp] List<city> list = new List<city>();
            DataTable dt = new DataTable();
            for (int i = 0; i < dt.Rows.Count; i++)
            {
                //将数据库的数据添加到List里面
                list.Add(new city(dt.Rows[0]["id"].ToString(), dt.Rows[0]["name"].ToString()));
            }[/code]
访问的方法,就是你要查询得到的
[code=csharp]  /// <summary>
        /// 根据城市名称查ID
        /// </summary>
        /// <param name="name">城市名</param>
        /// <param name="list">列表</param>
        /// <returns>ID值</returns>
        public string GetId(string name, List<city> list)
        {
            return list.Where(f => f.name == name).FirstOrDefault().id;
        }[/code]
这样就行了
 楼主| 发表于 2013-6-8 14:04:23 | 显示全部楼层
谢谢,高手就是高手!
您需要登录后才可以回帖 登录 | 马上注册

本版积分规则

QQ|手机版|小黑屋|手机版|联系我们|关于我们|广告合作|苏飞论坛 ( 豫ICP备18043678号-2)

GMT+8, 2024-11-22 19:04

© 2014-2021

快速回复 返回顶部 返回列表