Pertanyaan Masalah SqlDependency dengan asp.net


Saya mencoba mendapatkan nilai yang diubah dari sqlserver menggunakan fitur server_broker.

kode saya seperti di bawah ini

 protected void Page_Load(object sender, EventArgs e)
{
    GetData2();

}
private void GetData2()
{
    List<Masa> lst = new List<Masa>();
    using (SqlConnection con = Baglan.Sql)
    {
        string sql = "SELECT [Id],[Ad],[Durum] FROM [dbo].[Masa]";
        using (SqlCommand cmd = new SqlCommand(sql, con))
        {
            con.Open();
            SqlDependency dependency = new SqlDependency(cmd);
            dependency.OnChange += new OnChangeEventHandler(dependency_OnDataChangedDelegate);

            using (IDataReader reader = cmd.ExecuteReader(CommandBehavior.CloseConnection))
            {
                while (reader.Read())
                {
                    Masa alt = new Masa
                    {
                        Ad = reader["Ad"].ToString(),
                        Id = reader["Id"].ToString(),
                        Durum = reader["Durum"].ToString()
                    };

                    lst.Add(alt);
                }

                gridMasa.GetStore().DataSource = lst;
                gridMasa.GetStore().DataBind();
            }


        }
    }


}

public void dependency_OnDataChangedDelegate(object sender, SqlNotificationEventArgs e)
{   GetData2();
    SqlDependency dependency = sender as SqlDependency;

    dependency.OnChange -= new OnChangeEventHandler(dependency_OnDataChangedDelegate);

}

ketika saya memeriksa kode melalui breakpoint yang saya buat beberapa perubahan pada database, itu bisa mencapai metode yang disebut dependency_OnDataChangedDelegate, tetapi saya tidak melihat perubahan pada datagrid saya. mana yang saya lakukan salah ??

sumber halaman saya adalah sebagai berikut:

 <ext:ResourceManager runat="server" ID="mymanager"></ext:ResourceManager>
<ext:GridPanel runat="server"  ID="gridMasa" Title="MASALAR" Height="580" Layout="FitLayout" Flex="1"
                        IDMode="Static">

                        <Store>
                            <ext:Store ID="strMasa" runat="server">

                                <Model>
                                    <ext:Model ID="Model1" runat="server">
                                        <Fields>
                                            <ext:ModelField Name="Id" />
                                            <ext:ModelField Name="Ad" />
                                            <ext:ModelField Name="Durum" />
                                        </Fields>
                                    </ext:Model>
                                </Model>
                                <Listeners>
                                    <Exception Handler="Ext.Msg.alert('Products - Load failed', operation.getError());" />
                                </Listeners>
                            </ext:Store>
                        </Store>

                        <ColumnModel ID="ColumnMxodel1" Flex="1" runat="server">
                            <Columns>

                                <ext:RowNumbererColumn ID="Column5" runat="server" Text="Id" 
                                    >
                                </ext:RowNumbererColumn>

                                <ext:Column ID="KisxiId" runat="server" Hidden="true" Text="Id" DataIndex="Id" 
                                    Flex="1">
                                </ext:Column>
                                <ext:Column ID="Coluxmn2w" runat="server" Text="Masa Adı" Flex="1" Align="Center" DataIndex="Ad">

                                </ext:Column>
                                   <ext:Column ID="Column8" runat="server" Text="Durum" Flex="1" Align="Center" DataIndex="Durum">

                                </ext:Column>
                                      <ext:Column ID="Column11" Hidden="true" runat="server" Text="Durum" Flex="1" Align="Center" DataIndex="Durum">

                                </ext:Column>

                            </Columns>
                        </ColumnModel>
                        <SelectionModel>
                            <ext:RowSelectionModel ID="rowSelectioxnModel2" ClientIDMode="Static" runat="server">
                                <SelectedRows>
                                    <ext:SelectedRow RowIndex="0"></ext:SelectedRow>
                                </SelectedRows>


                            </ext:RowSelectionModel>
                        </SelectionModel>

                    </ext:GridPanel>

kode sumbernya adalah seperti di bawah ini:

Ext.net.ResourceMgr.init ({id: "mymanager", aspForm: "form1"});   Ext.onReady (function () {Ext.create ("Ext.grid.Panel", {store: {model: Ext.define ("App.Model1",   {Perluas: "Ext.data.Model",   fields: [{name: "Id"}, {name: "Ad"}, {name: "Durum"}]   }), storeId: "strMasa", autoLoad: true, proxy: {data: [{"Id": "8", "Ad": "44448989", "Durum": "2"}, {"Id": "9", "Ad": "MASA   55i "," Durum ":" 1 "}, {" Id ":" 12 "," Ad ":" MASA   3 "," Durum ":" 1 "}, {" Id ":" 44 "," Ad ":" MASA   4 "," Durum ":" 1 "}, {" Id ":" 45 "," Ad ":" MASA   5 "," Durum ":" 1 "}, {" Id ":" 46 "," Ad ":" MASA   6 "," Durum ":" - 1 "}, {" Id ":" 47 "," Ad ":" MASA   7 "," Durum ":" - 1 "}, {" Id ":" 48 "," Ad ":" MASA   8 "," Durum ":" - 1 "}, {" Id ":" 49 "," Ad ":" MASA   9 "," Durum ":" 1 "}, {" Id ":" 51 "," Ad ":" MASA   10 "," Durum ":" 2 "}, {" Id ":" 52 "," Ad ":" MASA   11 "," Durum ":" - 1 "}, {" Id ":" 53 "," Ad ":" MASA   12 "," Durum ":" - 1 "}, {" Id ":" 54 "," Ad ":" MASA   13 "," Durum ":" - 1 "}, {" Id ":" 55 "," Ad ":" MASA   14 "," Durum ":" - 1 "}, {" Id ":" 56 "," Ad ":" MASA   15 "," Durum ":" - 1 "}, {" Id ":" 57 "," Ad ":" MASA 166 "," Durum ":" - 1 "}], ketikkan:   'memory'}, pendengar: {exception: {fn: function (proxy, respon, operasi) {Ext.Msg.alert ('Produk   - Muat gagal ', operation.getError ());}}}}, id: "gridMasa", tinggi: 580, renderTo: "App.gridMasa_Container", flex: 1, tata letak: "cocok", judul: "MASALAR" , kolom: {id: "ColumnMxodel1", flex: 1, item: [{id: "Column5", xtype: "rownumberer", teks: "Id"}, {id: "KisxiId", tersembunyi: true, flex: 1, dataIndex: "Id", teks: "Id"}, {id: "Coluxmn2w", flex: 1, align: "center", dataIndex: "Ad", teks: "Masa   Adı "}, {id:" Column8 ", flex: 1, align:" center ", dataIndex:" Durum ", teks:" Durum "}, {id:" Column11 ", tersembunyi: true, flex: 1, align : "pusat", dataIndex: "Durum", teks: "Durum"}]}, selModel: window.App.rowSelectioxnModel2 = Ext.create ("Ext.selection.RowModel", {proxyId: "rowSelectioxnModel2", selType: " rowmodel ", selectedData: [{rowIndex: 0}]})});});

memperbarui

beginilah cara mengaktifkan database (sql server express 2012) yang melakukan triger setiap perubahan yang terjadi pada database.

alter database [Your database name here] set enable_broker with rollback immediate 
select name, is_broker_enabled from sys.databases 

enter image description here


6
2018-03-31 07:43


asal


Jawaban:


Semua kode yang Anda tunjukkan adalah kode sisi ASP.Net. Grid ditampilkan pada klien, adalah elemen HTML. Anda perlu memberi tahu klien tentang perubahan itu. Penyegaran ulang HTTP bukanlah masalah sepele, Anda harus:

  • gunakan timer dari klien dan jajak pendapat berkala untuk perubahan
  • menggunakan WebSockets
  • menggunakan Acara Terkirim Server (Content-Type: text/event-stream) tetapi ini tidak didukung oleh IE

Polling berfungsi tetapi bisa mendapatkan pajak di server, khususnya dengan sejumlah besar klien. Ada banyak contoh polling yang didukung ASP.Net menggunakan Ajax.

WebSockets memerlukan Windows 8 / windows Server 2012 dan IIS 8, lihat Dukungan untuk Protokol WebSockets

Anda mungkin juga harus melihat ke dalam SignalR, yang merupakan perpustakaan khusus ASP.Net untuk mendorong pembaruan ke klien.

Seperti yang Anda lihat, jawaban saya bahkan tidak menyentuh topik Notifikasi Kueri. Mendapatkan pemberitahuan dari DB ke ASP.Tingkat tengah yang bersih hanya satu bagian dari persamaan, dan SqlDependency memang jawaban yang benar. Tapi Anda benar-benar kehilangan bagian kedua, mendorong pemberitahuan dari tingkat menengah ke browser. Anda hanya harus memberi tahu browser bahwa pembaruan terjadi dan klien harus menyegarkan. Biarkan penyegaran memuat data menggunakan peristiwa Page_load biasa. Menggunakan SqlCacheDependency ke server halaman, ini secara otomatis akan menyimpan hasil dan menyegarkan cache pada pembaruan apa pun.


6



Untuk aplikasi ASP.NET Anda harus menggunakan SqlCacheDependency kelas di ruang nama System.Web.Caching; jadi kamu tidak butuh itu OnChange pawang dalam skenario ini.

Artikel ini menjelaskan cara mengimplementasikan SqlCacheDependency untuk klien asp.net:

Notifikasi Permintaan menggunakan SqlDependency dan SqlCacheDependency

Namun, Anda telah menyebutkan bahwa Anda menggunakan SQL Server Express 2012 dan menurut halaman Fitur yang didukung oleh Edisi SQL Server 2012 dan kasus serupa di edisi SQl Server Express yang lebih lama Menggunakan Broker Layanan dengan Sql Server Express 2008, sejak SQL Server 2012 Express tidak mendukung layanan brokerAnda akan tidak bisa untuk melakukan Notifikasi Query di SQL Server 2012 Express.

Edit: paragraf ini tidak benar (anggap karena halaman MSDN yang berdasarkan menyesatkan). Edisi Express mendukung Layanan Broker dan Notifikasi Permintaan baik-baik saja, pada semua versi sejak SQL Server 2005. Komentar 'Klien Saja' lebih baik dijelaskan pada Express Fitur SQL Server Express halaman:

SQL Server Express mendukung Layanan Broker, tetapi komunikasi langsung antara dua server SQL Server Express tidak didukung.

pembatasan ini tidak memengaruhi Pemberitahuan Kueri.

Referensi ini sekarang hanya sekedar informasi Mendeteksi Perubahan dengan SqlDependency , Membuat Notifikasi Query , SqlDependency dalam Aplikasi ASP.NET.


1