Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用Sqldependency自动更新页面加载_C#_Asp.net_Forms_Sqldependency - Fatal编程技术网

C# 如何使用Sqldependency自动更新页面加载

C# 如何使用Sqldependency自动更新页面加载,c#,asp.net,forms,sqldependency,C#,Asp.net,Forms,Sqldependency,我试图从一个web表单类创建并运行一个sqldependency方法,其中有一个UpdateMethod,我使用一个窗口表单作为引用来实现它。 但是,当数据库发生更改时,该方法的web表单版本不会在客户端自动更新页面加载,而窗口表单会 窗口窗体方法版本: delegate void GridDelegate(DataTable table); private void UpdateGrid() { string sql = "SELECT * FR

我试图从一个web表单类创建并运行一个sqldependency方法,其中有一个UpdateMethod,我使用一个窗口表单作为引用来实现它。 但是,当数据库发生更改时,该方法的web表单版本不会在客户端自动更新页面加载,而窗口表单会

窗口窗体方法版本:

   delegate void GridDelegate(DataTable table);      
   private void UpdateGrid()
    {
        string sql = "SELECT * FROM [dbo].[User]";
        DataTable dt = new DataTable();
        using (SqlConnection con = new SqlConnection(connectionstring))
        {
            using (SqlCommand cmd = new SqlCommand(sql, con))
            {
                con.Open();
                dep = new SqlDependency(cmd); //Passing Command to SQL dependency 
                dep.OnChange += dep_OnChange;
                using (SqlDataReader rdr = cmd.ExecuteReader())
                {
                    dt.Load(rdr);
                }
            }
        }
        dataGridView1.Invoke((GridDelegate)delegate(DataTable table)
        { dataGridView1.DataSource = table; }, dt);
    }
方法的Web表单版本:

      private void UpdateGrid()
    {
        string sql = "SELECT * FROM [dbo].[User] order by uploadDate desc";
        DataTable dt = new DataTable();
        using (SqlConnection con = new SqlConnection(GetConnectionString()))
        {

            try 
            {
                using (SqlCommand cmd = new SqlCommand(sql, con))
                {
                    con.Open();
                    SqlDependency dep;
                    dep = new SqlDependency(cmd); //Passing Command to SQL dependency 
                    dep.OnChange += dep_OnChange;

                    using (SqlDataReader rdr = cmd.ExecuteReader())
                    {
                        dt.Load(rdr);
                        // GridView1.DataSource = rdr;
                    }

                }

            }

            catch (Exception ex)
            {
                throw ex;
            }
        }
        GridView1.DataSource = dt;
        GridView1.DataBind();
    }

我尝试在web表单版本中添加try..Catch语句,但没有收到任何错误。为了解决这个问题,请建议我如何进一步测试这个方法。如有任何提示/建议,将不胜感激。谢谢

这是一个模型。我没有sql server可供使用;因此,我已经完成了计时器线程的示例。我已经使用了信号器。确保浏览器也有一点现代的IE10+、Chrome、Mozilla等支持WebSocket的浏览器

使用构造函数创建中心类 构造函数初始化并触发计时器线程。线程执行代码,指示中心在客户端(即连接到中心的所有浏览器)上调用特定的js方法

这个特殊的js方法将承载刷新updatepanel中的gridview的逻辑

编写必要的javascript来执行刷新aspx aspx页面设计简单。它有一个updatepanel,其中有一个绑定到sqldatasource的gridview,还有一个linkbutton,其主要职责是刷新网格数据服务器端。这方面的代码非常简单,稍后将在下面显示。您可以注意到,为了使刷新正常工作,我们正在模拟手动单击位于面板内的LinkButton控件

编写必要的逻辑以连接集线器aspx 这是连接到集线器的代码,它编写了当您收到服务器消息时应该调用的js方法

还要确保已将owin启动类文件添加到项目中。参考更多信号员资料

DataHub.cs signalpage.aspx
我想你需要websocket来进行这种交流…谢谢你的回复。这是我可以使用的示例,它显示了一个websocket使用sqlDepepency。我发现了一些链接,这些链接使用带有WebSocket的信号器。我还想问,如果没有websocket,窗口窗体如何能够创建这种逻辑?如果可能的话,请给出建议。查看
using Microsoft.AspNet.SignalR;
using System.Threading;
using System.Diagnostics;

namespace WebApp.SignalR.GridUpdatePanel
{
    public class DataHub : Hub
    {

        public DataHub()
        {
            Debug.Print("Ctor executed...");
            Timer tmr = new Timer(new TimerCallback(this.RefreshThread), null, 1000, 5000);
        }

        //Method which invokes the client js code...
        public void Refresh()
        {
            Clients.All.refreshData();            
        }

        public void RefreshThread(object obj)
        {
            Debug.Print("RefreshThread Called...");
            Refresh();
        }
    }
}
<%@ Page Title="SignalR Page" Language="C#" MasterPageFile="~/Site.Master" AutoEventWireup="true" CodeBehind="SingalRPage.aspx.cs" Inherits="WebApp.SignalR.GridUpdatePanel.SingalRPage" %>
<asp:Content ID="Content1" ContentPlaceHolderID="cphPageHeadScripts" runat="server">
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="cphPageBody" runat="server">
    <asp:ScriptManager ID="ScriptManager1" runat="server"></asp:ScriptManager>
    <asp:UpdatePanel ID="UpdatePanel1" runat="server">
        <ContentTemplate>
            <asp:Label ID="Label1" runat="server"></asp:Label>
            <br />
            <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" DataKeyNames="Id" DataSourceID="SqlDataSource1" EmptyDataText="There are no data records to display.">
                <Columns>
                    <asp:BoundField DataField="Id" HeaderText="Id" ReadOnly="True" SortExpression="Id" />
                    <asp:BoundField DataField="PName" HeaderText="PName" SortExpression="PName" />
                    <asp:BoundField DataField="PAge" HeaderText="PAge" SortExpression="PAge" />
                </Columns>
            </asp:GridView>
            <asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:PersonsDbConnectionString1 %>" DeleteCommand="DELETE FROM [Persons] WHERE [Id] = @Id" InsertCommand="INSERT INTO [Persons] ([Id], [PName], [PAge]) VALUES (@Id, @PName, @PAge)" ProviderName="<%$ ConnectionStrings:PersonsDbConnectionString1.ProviderName %>" SelectCommand="SELECT [Id], [PName], [PAge] FROM [Persons]" UpdateCommand="UPDATE [Persons] SET [PName] = @PName, [PAge] = @PAge WHERE [Id] = @Id">
                <DeleteParameters>
                    <asp:Parameter Name="Id" Type="Int32" />
                </DeleteParameters>
                <InsertParameters>
                    <asp:Parameter Name="Id" Type="Int32" />
                    <asp:Parameter Name="PName" Type="String" />
                    <asp:Parameter Name="PAge" Type="Int32" />
                </InsertParameters>
                <UpdateParameters>
                    <asp:Parameter Name="PName" Type="String" />
                    <asp:Parameter Name="PAge" Type="Int32" />
                    <asp:Parameter Name="Id" Type="Int32" />
                </UpdateParameters>
            </asp:SqlDataSource>
            <br />
            <asp:LinkButton ID="LinkButton1" runat="server" CssClass="btn btn-default" OnClick="LinkButton1_Click">Refresh</asp:LinkButton>
        </ContentTemplate>
    </asp:UpdatePanel>
</asp:Content>
<asp:Content ID="Content3" ContentPlaceHolderID="cphPageBottomScripts" runat="server">
    <script src="Scripts/jquery.signalR-2.0.0.min.js"></script>
    <script src="signalr/hubs"></script>

    <script>
        function refreshGrid() {
            console.log('grid refresh');
            var lnk = document.getElementById('<%= LinkButton1.ClientID %>');
            lnk.click();
        }
    </script>
    <script>
        $(function () {
            var chat = $.connection.dataHub;
            chat.client.refreshData = function () {
                refreshGrid();
            };
            $.connection.hub.start().done(function () {
                console.log('hub started...');
            });
        });
    </script>
</asp:Content>
<%@ Master Language="C#" AutoEventWireup="true" CodeBehind="Site.master.cs" Inherits="WebApp.SignalR.GridUpdatePanel.Site" %>

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>Bootstrap 101 Template</title>

    <!-- Bootstrap -->
    <link href="/Content/bootstrap.min.css" rel="stylesheet">

    <!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries -->
    <!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
    <!--[if lt IE 9]>
      <script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
      <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
    <![endif]-->
    <asp:ContentPlaceHolder ID="cphPageHeadScripts" runat="server"></asp:ContentPlaceHolder>
</head>
<body>
    <form runat="server">
        <asp:ContentPlaceHolder ID="cphPageBody" runat="server"></asp:ContentPlaceHolder>
    </form>    
    <!-- jQuery (necessary for Bootstrap's JavaScript plugins) -->
    <script src="/Scripts/jquery-1.9.1.min.js"></script>
    <!-- Include all compiled plugins (below), or include individual files as needed -->
    <script src="/Scripts/bootstrap.min.js"></script>
    <asp:ContentPlaceHolder ID="cphPageBottomScripts" runat="server"></asp:ContentPlaceHolder>
</body>
</html>
using System;
using System.Diagnostics;

namespace WebApp.SignalR.GridUpdatePanel
{
    public partial class SingalRPage : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                Label1.Text = DateTime.Now.ToLongTimeString();
            }
        }       

        protected void LinkButton1_Click(object sender, EventArgs e)
        {
            Debug.Print("LinkButton1_Click");
            Label1.Text = DateTime.Now.ToLongTimeString();
            GridView1.DataBind();
        }
    }
}