设为首页 加入收藏

TOP

sql server主动推送客户端更新数据(一)
2014-11-23 20:25:57 来源: 作者: 【 】 浏览:25
Tags:sql server 主动 推送 客户端 更新 数据
sql server主动推送客户端更新数据
小谈需求:
最近工作上接到一个需求,做一个web展示数据的报表,最好能实时更新,不限制所用技术。
第一个问题:web服务器推送给浏览器新数据,一开始我想到的最快的最简单的方法就是 在web页面上js轮询了。因为我们的数据更新频率并不快。 后来觉得这种办法有点太土了。 或许长轮询更有效。 当然长轮询的技术很多了。 java 的dwr,c#的 signalr。c#还可以同过异步请求来自己写长轮询。
遇到的第二个问题,就是数据库如何通知web服务器更新数据,下面便是sql server2008的推送了,通过sql server的触发器,当数据表有变化时(增,删,改)就通过tcp请求服务器,服务器会在启动后开启端口一直监听,随时等待通信请求。当收到请求后,就从数据库读取新数据,推送给浏览器。整体大概就这样。
下面是数据库通知服务器。这是一个 winform的demo ,winfom就相当于我们展示数据的服务器了。
最后demo图:
现在我插入一条数据:
然后再看那个客户端:
刚插入的数据已经出现了哦。
客户端代码:
winform:
程序启动后,开启端口监听,如果有收到通信,则通知 dataview更新数据。
using System;
02
using System.Collections.Generic;
03
using System.ComponentModel;
04
using System.Data;
05
using System.Data.SqlClient;
06
using System.Drawing;
07
using System.Linq;
08
using System.Net;
09
using System.Net.Sockets;
10
using System.Text;
11
using System.Windows.Forms;
12
using System.Threading;
13

14
namespace sql_dependency
15
{
16
  public partial class Form1 : Form
17
  {
18
  public Form1()
19
  {
20
  InitializeComponent();
21
  }
22

23
  System.Data.SqlClient.SqlConnection conn = null;
24
  string _connstr = "Data Source = 10.6.154.251; database=Temp;user id=sa;pwd=MOcyou0543_";
25
  System.Data.SqlClient.SqlCommand command = null;
26

27
  private void Form1_Load(object sender, EventArgs e)
28
  {
29
  conn = new System.Data.SqlClient.SqlConnection(_connstr);
30
  command = conn.CreateCommand();
31
  command.CommandText = "select [A],[B],[C] From [Temp].[dbo].[Simple]";
32
  SqlDependency.Start(_connstr);//启动
33
  Thread t = new Thread(new ThreadStart(GetData));
34
  t.Start();
35
  }
36

37

38
  private void GetData()
39
  {
40

41
  SetData();
42
  IPAddress localAddr = IPAddress.Parse("127.0.0.1");
43
  TcpListener tcplistener = new TcpListener(localAddr, 10010);
44
  tcplistener.Start();
45
  byte[] btServerReceive = new byte[2048];
46
  string strServerReceive = string.Empty;
47
  while (true)
48
  {
49
  TcpClient tcp = tcplistener.AcceptTcpClient();
50
  Console.WriteLine("Connected!");
51
  NetworkStream ns = tcp.GetStream();
52
  int intReceiveLength = ns.Read(btServerReceive, 0, btServerReceive.Length);
53
  strServerReceive = Encoding.ASCII.GetString(btServerReceive, 0, intReceiveLength);
54

55
  SetData();
56
  tcp.Close();
57
  }
58

59
  }
60
  private delegate void ChangeDataView();
61
  private void SetData()
62
  {
63
  if (this.InvokeRequired)
64
  {
65
  this.Invoke(new ChangeDataView(SetData));
66
  }
67
  else
68
  {
69
  using (SqlDataAdapter adapter = new SqlDataAdapter(command)) //查询数据
70
  {
71
  System.Data.DataSet ds = new DataSet();
72
  adapter.Fill(ds, 0, 100, "Simple");
73
  dataGridView1.DataSource = ds.Tables["Simple"];
74
  }
75

76
  }
77
  }
78

79

80

81
  private void Form1_Closed(object sender, FormClosedEventArgs e)
82
  {
83
  //清理现场
84
  SqlDependency.Stop(_connstr);
85
  conn.Close();
86
  conn.Dispose();
87
  }
88

89

90
  }
91
}

数据库与clr集成,编写写dll:SqlDependency.dll,sql server将在可编程性中加载此dll,
01
using System;
02
using System.IO;
03
using System.Net;
04
using System.Net.Soc
首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇SQL With ties的理解“与” 下一篇关于SQL Server中几个未公布的访..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: