爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 6331|回复: 9

c#代码结合sql实现自动站数据动态行转列输出

[复制链接]

新浪微博达人勋

发表于 2012-7-1 21:12:26 | 显示全部楼层 |阅读模式

登录后查看更多精彩内容~

您需要 登录 才可以下载或查看,没有帐号?立即注册 新浪微博登陆

x
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace tester
{
    public class getsql
    {
        /// <summary>
        /// 返回列表sql,但站单要素多时次。
        /// </summary>
        /// <param name="tday">日期,yyyyMMdd格式</param>
        /// <param name="sid">站点id</param>
        /// <param name="zdname">查询字段名</param>
        /// <returns></returns>
        public string getsqlstr(string tday ,string sid,string zdname)
        {
            string sql = @"select
                        right([ObservTimes],2) as [时次/日期],";
            string sqlw = "";
            string sqlm = "";
            DateTime mydatetime;
            mydatetime = DateTime.ParseExact(tday, "yyyyMMdd", System.Globalization.CultureInfo.InvariantCulture);
            for (int i = 0; i < 15; i++)
            {
                string day = mydatetime.AddDays(i * -1).ToString("yyyyMMdd");
                sqlw += "[" + day + "]" + "=max(case when left([ObservTimes],8)='" + day + "' then [" + zdname + "] else null end),";
                for (int k = 0; k < 24; k++)
                {
                    sqlm += "'" + day + k.ToString("00") + "',";
                }
            }
            sqlw += "[" + mydatetime.AddDays(-15).ToString("yyyyMMdd") + "]" +
                "=max(case when left([ObservTimes],8)='" + DateTime.Now.AddDays(-15).ToString("yyyyMMdd") +
                "' then [DryBulTemp] else null end)";
            for (int k = 0; k < 23; k++)
            {
                sqlm += "'" + mydatetime.AddDays(-15).ToString("yyyyMMdd") + k.ToString("00") + "',";
            }
            sqlm += "'" + mydatetime.AddDays(-15).ToString("yyyyMMdd") + "23'";
            sql += sqlw + @"
                FROM
                [ELEMENT].[dbo].[tabTimeData]
                where
                [ObservTimes]in(" + sqlm + @") and [StationNum]='"+sid+@"'
                group by right([ObservTimes],2)";
            return sql;
        }
        /// <summary>
        /// 获取多站单数据25时次
        /// </summary>
        /// <param name="tday">时间(yyyyMMddHH)</param>
        /// <param name="zdname">字段名</param>
        /// <returns></returns>
        public string getsqlstan(string tday, string zdname)
        {
            string sql = @"select
                        [StationNum] as [站点/时次],";
            string sqlw = "";
            string sqlm = ""; DateTime mydatetime;
            mydatetime = DateTime.ParseExact(tday, "yyyyMMddHH", System.Globalization.CultureInfo.InvariantCulture);
            for (int i = 0; i < 24; i++)
            {
                string day = mydatetime.AddHours(i * -1).ToString("yyyyMMddHH");
                sqlw += "[" + mydatetime.AddHours(i * -1).ToString("dd日HH时") + "]" + "=max(case when [ObservTimes]='" + day + "' then [" + zdname + "] else null end),";

            }
            sqlw += "[" + mydatetime.AddHours(-24).ToString("dd日HH时") + "]" + "=max(case when [ObservTimes]='" + mydatetime.AddHours(-23).ToString("yyyyMMddHH") + "' then [DryBulTemp] else null end)";
            for (int k = 0; k < 24; k++)
            {
                sqlm += "'" + mydatetime.AddHours(k * -1).ToString("yyyyMMddHH") + "',";
            }
            sqlm += "'" + mydatetime.AddHours(-24).ToString("yyyyMMddHH") + "'";
            sql += sqlw + @"
                FROM
                [ELEMENT].[dbo].[tabTimeData]
                where
                [ObservTimes]in(" + sqlm + @")
                group by [StationNum]";
            return sql;
        }
    }
}



以上类返回sql为自动站数据查询自动转换行转列,可设定查询数据,可设定站点、查询时间等。具体相关设定自己可以在where中调整。
查询速度中等,查询后结果用:
System.Data.SqlClient.SqlConnection conn = new System.Data.SqlClient.SqlConnection
("server=数据库地址;database=数据库;uid=用户名;pwd=密码");
            System.Data.SqlClient.SqlDataAdapter sdb = new System.Data.SqlClient.SqlDataAdapter((new getsql()).getsqlstr(DateTime.Now.ToString("yyyyMMdd"), "区站号", "查询字段"), conn);
            System.Data.SqlClient.SqlDataAdapter sdbtan = new System.Data.SqlClient.SqlDataAdapter((new getsql()).getsqlstan(DateTime.Now.ToString("yyyyMMddHH"), "DryBulTemp"), conn);
            System.Data.DataSet dst = new System.Data.DataSet();
            System.Data.DataSet dstan = new System.Data.DataSet();
            sdb.Fill(dst, "mytab");
            sdbtan.Fill(dstan, "mytab");
            GridView1.DataSource = dst;
            GridView1.DataBind();
            GridView2.DataSource = dstan;
            GridView2.DataBind();
绑定到GridView即可实现输出。
节省大家用forecah或其他循环处理数据的时间。

评分

参与人数 2金钱 +20 贡献 +7 体力 +50 收起 理由
言深深 + 10 + 4 + 50 赞一个!
mofangbao + 10 + 3

查看全部评分

密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2012-7-1 21:13:38 | 显示全部楼层
sql的部分不知道发到什么地方,干脆整个模块拿下来发出来发在C#版了,用的到的人随意取用。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

0
早起挑战累计收入
发表于 2012-7-1 21:33:17 | 显示全部楼层

谢谢楼主的分享,发在这里就可以啦~
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 成长值: 0
发表于 2012-7-1 23:51:15 | 显示全部楼层
不错
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2012-7-2 12:55:35 | 显示全部楼层
楼上的谢谢顶贴,其实自己研究研究,可以加上多数据读取等功能。只是现在暂时没做。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2013-8-17 13:10:16 | 显示全部楼层
谢谢楼主的分享
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2014-2-16 12:34:51 | 显示全部楼层
问个低级问题,想知道,自动站的数据是实时进入数据库保存的么?
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2014-7-18 21:13:17 | 显示全部楼层
十分感谢分享  
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2014-7-21 17:47:18 | 显示全部楼层
谢谢楼主的分享
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2014-8-4 21:17:32 | 显示全部楼层
就是在构造sql语句  
密码修改失败请联系微信:mofangbao
您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

Copyright ©2011-2014 bbs.06climate.com All Rights Reserved.  Powered by Discuz! (京ICP-10201084)

本站信息均由会员发表,不代表气象家园立场,禁止在本站发表与国家法律相抵触言论

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