Di bidang pengembangan .Net, apakah Anda dan perusahaan Anda bermasalah dengan masalah berikut?
1. DataRow di DataSet hanya dapat memperoleh data dalam bentuk DataTable[0].Rows[0]["Name"]
2. Konfigurasi Sql Sql tidak dinamis dan jelas.
3. Gunakan ORM JAVA untuk mendesain .Net dan gunakan lapisan objek. Setiap modifikasi akan mempengaruhi objek yang dipantulkan.
Kemudian silahkan lanjutkan membaca artikel berikut ini
Object/DataSet Relational Mapping
(Pemetaan Relasional Objek/Data Set)
Mode NickLee.ODRM dapat menyelesaikan permasalahan diatas dengan baik
1. DataRow pada DataSet hanya dapat berupa DataTable[0].Rows[0][" Nama"] metode untuk mendapatkan
solusi data: DataRow diubah menjadi objek serial, tetapi objek serial hanya digunakan sebagai entitas operasi objek yang jelas untuk memproses penilaian bisnis dan data
2. Konfigurasi Sql tidak dinamis dan
solusi tambal sulam Sql tidak jelas: menggunakan arsitektur Lapisan data IBatisNet, menggunakan sintaks SQL dinamis IBatisNet, tetapi mengembalikan DataSet
3. Gunakan ORM JAVA untuk mendesain .Net dan menggunakan lapisan objek. Setiap modifikasi akan mempengaruhi objek yang dipantulkan.
Solusi: Hapus O (lapisan objek), tidak ada mekanisme refleksi, hindari perubahan pada lapisan objek dengan setiap modifikasi.
Penjelasan detailnya diberikan di bawah ini.
Demonstrasi kode berikut akan disertakan dalam NickLee.Framework.2.0.1.2 ke atas. Tentu saja, kami hanya memberikan ide dan solusi fleksibel, yang hanya mewakili pemikiran tim TheFallAngel.
Dll yang harus direferensikan
IBatisNet (Versi 1.5 dan yang lebih baru) dengan NickLee.Framework versi modifikasi
NickLee.Web.UI (Versi 2006.2.1447 dan yang lebih baru)
1. cXTM_User.cs
menggunakan System
menggunakan System.Data
menggunakan System.Configuration;
menggunakan System.Web;
menggunakan System.Web.Security;
menggunakan System.Web.UI
;
menggunakan System.Web.UI.HtmlControls
;
///
///
cXTM_User.Serialization
///
[
Serializable]
public class cXTM_User
{
private int _dID;
private
string
_userName
;
/
}
public int DID
{
get
{
return _dID
}
set
{
_dID=
nilai;
}
}
public string Nama Pengguna
{
get
{
return _userName
}
set
{
_userName
=
nilai
;
properti di kelas ini untuk array di Daftar Properti, dan pastikan namanya unik
/// dan konsisten dengan nama kueri di SelectXTM_UserByKey_Test di XTM_User
///
public string[] Propertylist
{
get
{
return new string[
]
{ "Nama
Pengguna, "DID
"
}
;
ibatis.apache .org/mapping " xmlns:xsi=" http://www.w3.org/2001/XMLSchema-instance ">
PILIH
5 Teratas
[DID],
[UserName],
[LoginName],
[PWD],
[LoginFlag],
[StopFlag],
[LoginTime],
[LASTUPDATE]
DARI [XTM_User]
3. test.aspx
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="test.aspx.cs" Inherits="ODRM_test" %>
<%@ Daftar Majelis="NickLee.Web.UI" Namespace= "NickLee.Web.UI" TagPrefix="NickLee" %>
http://www.w3.org/TR/xhtml1/DTD /xhtml1-transitional.dtd ">
http://www.w3.org/1999/xhtml " >
4. test.aspx.cs
menggunakan Sistem;
menggunakan Sistem.Data
menggunakan Sistem.Konfigurasi
menggunakan Sistem.Koleksi
; Web;
menggunakan System.Web.Security;
menggunakan System.Web.UI;
menggunakan
System.Web.UI.WebControls
;
menggunakan IBatisNet.DataMapper;
menggunakan System.Reflection;
kelas parsial publik ODRM_test : PageBase
{
protected void Page_Load(pengirim objek, EventArgs e)
{
if (!IsPostBack)
{
DataSet set11 = Mapper.Instance().QueryForDataSet("SelectXTM_UserByKey_Test",UIhashtable
table1 = ConvertDataTable(set11, " ");
//Berikut adalah kelas serialisasi yang ditentukan sendiri
cXTM_User[] objModel = new cXTM_User[table1.Rows.Count];
//DataTable diubah menjadi array kelas serialisasi
untuk (int y = 0; y < table1.Rows . Hitung; y++)
{
objModel[y] = new cXTM_User();
DataTableReturnOO(table1.Rows[y], objModel[y]
}
//IkatExDataGrid1.DataSource = table1
dalam mode DataSet
;// Buat serialisasi Mode objek mengikat
//ExDataGrid1.DataSource = objModel;
ExDataGrid1.DataBind(
)
;
protected void ExDataGrid1_ItemDataBound(pengirim objek, DataGridItemEventArgs e)
{
/*
* Cakupan aplikasi bagian ini
* Untuk menanyakan modifikasi suatu bagian data, Anda dapat menggunakan objModel.UserName
* alih-alih menggunakan DataTable[0].Rows[0] ["UserName"] Pola
* Meningkatkan tingkat berorientasi objek dan mengurangi bagian dari pengkodean proses bisnis
*/
if (e.Item.ItemIndex != -1)
{
cXTM_User objModel = cXTM_User() baru;
//Jika DataGrid diisi untuk DataSet
if (e.Item.DataItem.GetType().FullName == "System.Data.DataRowView")
{
DataTableReturnOO((DataRow)((DataRowView)e.Item.DataItem). Row, objModel);
}
//Jika tidak maka dianggap sebagai objek berseri yang diisi
else
{
objModel = (cXTM_User)e.Item.DataItem;
}
}
}
///
/// DataSet diubah menjadi fungsi kelas serialisasi, definisi kelas mengacu pada cXTM_User
///
private void DataTableReturnOO(DataRow row, cXTM_User objModel)
{
Hashtable hTable = new Hashtable();
hTable = ReturnHashtable (baris);
Ketik tipe entitas = Tipe.GetType(objModel.GetType().AssemblyQualifiedName);
for (int j = 0; j < objModel.Propertylist.Length; j++)
{
PropertyInfo propertyinfo = tipe entitas.GetProperty(objModel.Propertylist[j]
propertyinfo.SetValue(objModel, hTable[objModel.Propertylist[j]]), null )
;
}
///
/// Konversi ke DataTable
///
/// Sumber data
/// Nama tabel data
public static DataTable ConvertDataTable(Sumber objek, string DataMember)
{
DataTable
baseTable =new
DataTable();
if (Sumber adalah DataTable)
{
baseTable
= (DataTable)Sumber
;
DataSet set1 = (DataSet)Sumber;
if ((set1.Tables.Count > 1) && ((DataMember == null) || (DataMember == "")))
{
throw new Exception("Jika ada lebih dari satu tabel dalam kumpulan data Anda, Anda harus mendefinisikan properti DataMember untuk menentukan tabel mana yang akan digunakan.");
}
if (set1.Tables.Count < 1)
{
throw new Exception("Tidak ada tabel di sumber data.");
}
if ((DataMember!
=
null) && (DataMember!
= ""))
{
baseTable =set1.Tables
[
DataMember
]
;
}
kembalikan tabel dasar;
}
///
/// Mengembalikan DataTable sebagai pasangan kunci-nilai tabel hash
///
/// Objek baris data
///
public static Hashtable ReturnHashtable(DataRow SourceRow)
{
Hashtable hTable = new Hashtable();
daftar IList = SourceRow.ItemArray
object[] tObj = objek baru[SourceRow.Table.Columns.Count];
for (int i = 0; i < SourceRow.Table.Columns.Count; i++)
{
tObj[SourceRow.Table.Columns.IndexOf(SourceRow.Table.Columns[i].ColumnName)] = SourceRow.Table.Columns[i ].Nama Kolom;
}
for (int x = 0; x < daftar.Jumlah; x++)
{
hTable.Tambahkan(tObj[x].ToString(), daftar[x]
}
kembalikan hTable
;
}
5. PageBase.cs
menggunakan Sistem;
menggunakan Sistem.Data;
menggunakan
Sistem.Konfigurasi;
menggunakan Sistem.Web.Keamanan
menggunakan
Sistem.Web.UI
;
Web.UI.WebControls.WebParts;
menggunakan Sistem.Web.UI.HtmlControls;
menggunakan System.Reflection;
menggunakan
System.Text;
//namespace diperlukan
//namespace Framework.Web.UIProcess
//{
///
/// Deskripsi ringkasan PageBase
///
///
/// Lapisan halaman ( Lapisan presentasi ) kelas dasar, semua halaman mewarisi halaman ini
///
kelas publik PageBase : System.Web.UI.Page
{
#region Seluruh sistem memiliki beberapa
string pribadi _baseselect;
///
/// Bidang kueri
///
string yang dilindungi baseselect
{
get
{
// TODO: Tambahkan pengambil BaseRule.OperationCode untuk mengimplementasikan
return _baseselect
;
set
{
// TODO: Tambahkan penyetel BaseRule.OperationCode untuk mengimplementasikan
_baseselect = value;
}
}
///
/// Tabel hash kelas dasar, ada di seluruh sistem
///
protected Hashtable baseHashtable = new Hashtable( );
///
/// Tabel hash antarmuka, memperoleh kontrol dan nilai kontrol yang diperoleh dari pabrik UI
///
protected
Hashtable UIhashtable = new Hashtable();
/// Perintah kesalahan, nilai bawaan ""
///
string yang dilindungi errMsg = "";
///
/// Status kesalahan, nilai bawaan salah
///
dilindungi bool errState = false;
/ //
/// Variabel pribadi _UISet
///
Kumpulan Data pribadi _UISet = DataSet baru();
///
/// Kumpulan data lapisan antarmuka
///
protected DataSet UISet
{
get
{
// TODO: Tambahkan pengambil BaseRule.OperationCode untuk mengimplementasikan
return
_UISet;
}
set
{
// TODO:
Tambahkan
penyetel BaseRule.OperationCode untuk mengimplementasikan
_UISet = value
;
//
/// Tabel data lapisan antarmuka
///
protected DataTable UITable
{
dapatkan
{
// TODO: Tambahkan pengambil BaseRule.OperationCode untuk mengimplementasikan
return _UITable
}
set
{
// TODO: Tambahkan BaseRule.OperationCode
penyetel
untuk mengimplementasikan
_UITable = value
;
private string _pageTitle = "";
///
/// Judul halaman
///
string yang dilindungi pageTitle
{
get
{
// TODO: Tambahkan pengambil BaseRule.OperationCode untuk mengimplementasikan
return _pageTitle
}
set
{
//
TODO
: Tambahkan penyetel BaseRule.OperationCode untuk mengimplementasikan
_pageTitle
= value
;
#region Kueri bagian halaman yang ada
///
/// Daftar tabel hash kelas dasar halaman
///
protected Hashtable baseListHashtable = new Hashtable();
///
/// Total jumlah halaman. Variabel. 1000w, penggunaan kumpulan data 10000w
///
dilindungi int pageCount;
///
/// Jumlah total record Variabel. Penggunaan kumpulan data 1000w dan 10000w
///
protected int recordCount;
///
/// Jumlah total record. Kumpulan data 1000w dan 10000w Gunakan
///
protected int RecordCount
{
get
{
return recordCount;
}
}
#endregion
#region Bagian yang ada dari halaman edit
///
Edit
tabel hash kelas dasar halaman
///
protected
Hashtable baseEditHashtable = new Hashtable();
halaman, Edit tabel hash data
///
protected Hashtable baseEditFillHashtable = new Hashtable()
;
///
/// Konstruktor
///
public PageBase()
{
this.Load += new EventHandler(PageBase_Load)
;
private void PageBase_Load(pengirim objek, EventArgs e)
{
if (!Page.IsPostBack)
{
//Bagian kontrol diperlukan untuk seluruh proses
if (Session["baseHashtable"] != null)
{
//Dapatkan daftar objek hash dari Session
baseHashtable = (Hashtable)Session["baseHashtable"]
}
//Hak akses edit halaman dan kontrol akses hanya valid saat halaman dimuat pertama kali
if (Session["baseEditHashtable"] != null)
{
//Dapatkan daftar objek hash halaman Edit
baseEditHashtable = (Hashtable)Session[ "baseEditHashtable"];
//Lepaskan objek Session yang sesuai setelah akuisisi
Session.Remove
("baseEditHashtable");
//
Jikaini
adalah keadaan awal, tambahkan apakah aman untuk mengedit nilai keadaan, nilai defaultnya adalah salah, ini adalah
baseEditHashtable.Add ("EditSafeState", false
)
;
//Kontrol akses halaman kueri
if (Session["baseListHashtable"] != null)
{
//Dapatkan daftar objek hash halaman Edit
baseListHashtable = (Hashtable)Session["baseListHashtable"];
//Lepaskan objek Session yang sesuai setelah akuisisi
. .Remove("baseListHashtable");
}
else
{
//Jika ini adalah keadaan awal, tambahkan apakah akan menyegarkan halaman kueri, nilai defaultnya adalah false,
baseListHashtable tidak akan disegarkan.Add("IsRefresh", false
}
}
#fungsi umum UI wilayah
///
/// Menampilkan pesan kesalahan
///
/// Page
/// Pesan kesalahan
dilindungi void throwErrMsg(Halaman halaman, string errMsg)
{
page.Response.Write("