SubSonic adalah kerangka akses data yang sangat baik yang mengintegrasikan pembuatan kode/Build Provider (fitur baru asp.net 2.0). Ini terinspirasi oleh ActionPack di ROR. Ini sangat cocok untuk perkembangan pesat situs web kecil.
Saya mulai menggunakan kerangka ini kemarin dan menemukan masalah kecil.
Saya memiliki bidang bernama Kunci, dan SQL melaporkan kesalahan saat membuat kueri untuk pernyataan Pilih. Karena Kunci adalah kata kunci, maka tidak lolos dalam SQL yang dihasilkan oleh SubSonic.
SQL yang dihasilkan saat debugging dapat diperoleh sebagai berikut:
SELECT TOP 100 PERCENT [cfg_Tips].[Id], [cfg_Tips].[Key], [cfg_Tips].[Descr], [cfg_Tips].[Value], [cfg_Tips] . [Label] DARI [cfg_Tips] DI MANA [cfg_Tips].Kunci = @Kunci ORDER OLEH [Id];
Saya memodifikasi metode BuildWhere di SqlDataProvider.cs dalam kode sumber untuk menyelesaikan masalah ini sementara.
string statis yang dilindungi BuildWhere (Query qry)
{
string dimana = "";
string WhereOperator = " WHERE ";
foreach (Di mana wWhere di qry.wheres)
{
jika (wWhere.ParameterValue != DBNull.Value)
{
di mana += di manaOperator + "[" + wWhere.TableName + "].[" + wWhere.ColumnName + "] " +
Where.GetComparisonOperator(wWhere.Comparison) + " @" + wWhere.ParameterName;
}
kalau tidak
{
di mana += di manaOperator + "[" + wWhere.TableName + "].[" + wWhere.ColumnName + "] " + PerbandinganIs +
"BATAL";
}
dimanaOperator = "DAN";
}
foreach (Antara dan antara di qry.betweens)
{
di mana += di manaOperator + "[" + antara.NamaTabel + "].[" + antara.NamaKolom + "] ANTARA @start" +
antara.ColumnName + " DAN @end" + antara.ColumnName;
dimanaOperator = "DAN";
}
for (int i = qry.wheres.Count - 1; i >= 0; i--)
{
if (qry.wheres[i].ParameterValue == DBNull.Value)
{
qry.wheres.RemoveAt(i);
}
}
kembali ke mana;
}
Bagian yang saya tambahkan ditandai dengan warna hijau pada kode di atas.
Anehnya, penulis menambahkan tanda kurung siku pada nama tabel tetapi tidak pada nama kolom, yang jelas tidak tepat.
Ada juga kelas seperti MySqlDataProvider di perpustakaan ini yang juga mengalami masalah ini. Karena saya tidak menggunakan MySQL untuk saat ini, saya tidak akan mengubahnya.
Pengalaman lainnya adalah ketika menggunakan perpustakaan pihak ketiga open source, cobalah menambahkannya ke proyek dalam kode sumber. Jika tidak, debugging tidak akan dapat dilakukan jika terjadi kesalahan.
Sekarang, cara saya menggunakan kerangka kerja ini adalah dengan menggunakan halaman web kelas yang dihasilkan GenerateAllClasses.aspx untuk menghasilkan kode, dan kemudian mereferensikannya sendiri. Meskipun ini sedikit lebih merepotkan daripada pembuatan langsung default dan kemudian dikompilasi dan dijalankan di memori, ini masih layak dilakukan demi kenyamanan debugging.
diposting pada 22-01-2007 00:28 Kinoho Membaca (62) Komentar (4) Edit Koleksi Kutipan Jaringan Kutipan Kategori: .NET
Komentar
# re: Nama kolom SubSonic masalah yang tidak lolos diperbaiki 22-01-2007 00:47 TerryLee
SubSonic tidak buruk, ini dikenal sebagai lapisan akses data tanpa kode :) Balas lebih banyak komentar
# re: Nama bidang SubSonic koreksi masalah yang tidak lolos 22-01-2007 00:49 Kinohu
@TerryLee
Haha, ya. Namun saya tidak berani menggunakan mode otomatisnya, lagipula saya merasa kendali saya kurang. Alasannya seperti yang dijelaskan dalam postingan ini.
Balas Komentar lainnya
# re: Nama bidang SubSonic koreksi masalah yang tidak lolos 22-01-2007 00:53 TerryLee
@木野湖 Ya,
saya hanya menggunakannya untuk menulis Demo kecil :) Balas Komentar lainnya
# re: Nama bidang SubSonic koreksi masalah yang tidak lolos 22-01-2007 01:02 木野湖 merasakan hal ini ketika menggunakannya secara terpisah Dokumentasinya adalah masih jarang. Contoh yang diberikan juga sangat sederhana. Penggunaan yang sedikit lebih berguna tergantung pada penjelajahan saya sendiri.
Misalnya ini:
Untuk memuat objek berdasarkan kondisi, dokumen (pdf) menyebutkan bahwa Anda dapat menggunakan
object.Load(...) untuk memuat, dan parameternya dapat berupa IDataReader, DataRow, DataTable.
Saya menggunakan IDataReader untuk meneruskannya, dan butuh waktu lama bagi saya untuk melakukannya. Akhirnya, setelah melakukan debug ke dalam kode sumber kerangka kerja, saya menemukan bahwa saya harus membacanya sekali sebelum meneruskan IDataReader agar berhasil. Misalnya, digunakan dalam contoh sederhana yang saya tulis:
/// <ringkasan>
/// Dapatkan penanggung jawab departemen tempat penanggung jawab tersebut berada
/// </ringkasan>
/// <param nama="staf"></param>
/// <pengembalian></pengembalian>
GetManager Staf statis publik(Staf staf) {
SubSonic.Query qry = SubSonic.Query baru (Staf.Schema.Name);
qry.AddWhere(Staff.Columns.IsFunctionary, true);
qry.AddWhere(Staff.Columns.OfficeId, staff.OfficeId);
Manajer staf = Staf baru();
Pembaca IDataReader = qry.ExecuteReader();
jika (pembaca.Baca())
{
manager.Load(pembaca);
}
manajer pengembalian;
}
http://www.cnblogs.com/RChen/archive/2007/01/22/actionpack1.html