SubSonic เป็นเฟรมเวิร์กการเข้าถึงข้อมูลที่ดีมาก ซึ่งรวมการสร้างโค้ด/Build Provider (ฟีเจอร์ใหม่ของ asp.net 2.0) ได้รับแรงบันดาลใจจาก ActionPack ใน ROR เหมาะมากสำหรับการพัฒนาเว็บไซต์ขนาดเล็กอย่างรวดเร็ว
ฉันเริ่มใช้เฟรมเวิร์กนี้เมื่อวานนี้และพบปัญหาเล็กๆ น้อยๆ
ฉันมีฟิลด์ชื่อคีย์ และ SQL รายงานข้อผิดพลาดเมื่อสร้างแบบสอบถามสำหรับคำสั่ง Select เนื่องจาก Key เป็นคีย์เวิร์ด จึงไม่มีการ Escape ใน SQL ที่สร้างโดย SubSonic
SQL ที่สร้างขึ้นเมื่อมีการดีบักสามารถรับได้ดังนี้:
เลือก 100 PERCENT อันดับแรก [cfg_Tips].[Id], [cfg_Tips].[Key], [cfg_Tips].[Descr], [cfg_Tips].[Value], [cfg_Tips] . [ป้ายกำกับ] จาก [cfg_Tips] โดยที่ [cfg_Tips].Key = @Key เรียงลำดับตาม [Id];
ฉันแก้ไขเมธอด BuildWhere ใน SqlDataProvider.cs ในซอร์สโค้ดเพื่อแก้ไขปัญหานี้ชั่วคราว
สตริงคงที่ที่ได้รับการป้องกัน BuildWhere (แบบสอบถาม qry)
-
สตริงโดยที่ = "";
string WhereOperator = " WHERE "
;
-
ถ้า (wWhere.ParameterValue != DBNull.Value)
-
โดยที่ += โดยที่ตัวดำเนินการ + "[" + wWhere.TableName + "].[" + wWhere.ColumnName + "] " +
Where.GetComparisonOperator (wWhere.Comparison) + " @" + wWhere.ParameterName;
-
อื่น
-
โดยที่ += โดยที่ตัวดำเนินการ + "[" + wWhere.TableName + "].[" + wWhere.ColumnName + "] " + การเปรียบเทียบคือ +
"โมฆะ";
-
โดยที่ตัวดำเนินการ = "และ";
}
foreach (ระหว่างและระหว่างใน qry.betweens)
-
โดยที่ += โดยที่ตัวดำเนินการ + "[" + between.TableName + "].[" + between.ColumnName + "] ระหว่าง @start" +
between.ColumnName + "และ @end" + between.ColumnName;
โดยที่ตัวดำเนินการ = "และ";
}
สำหรับ (int i = qry.wheres.Count - 1; i >= 0; i--)
-
ถ้า (qry.wheres[i].ParameterValue == DBNull.Value)
-
qry.wheres.RemoveAt(i);
-
-
กลับไปที่ไหน;
-
ส่วนที่ฉันเพิ่มจะมีเครื่องหมายสีเขียวในโค้ดด้านบน
เป็นเรื่องแปลกที่ผู้เขียนเพิ่มวงเล็บเหลี่ยมให้กับชื่อตารางแต่ไม่ได้ใส่ชื่อคอลัมน์ ซึ่งเห็นได้ชัดว่าไม่เข้มงวด
นอกจากนี้ยังมีคลาสเช่น MySqlDataProvider ในไลบรารีนี้ที่มีปัญหานี้เช่นกัน เนื่องจากฉันไม่ได้ใช้ MySQL ในขณะนี้ ฉันจึงไม่เปลี่ยนแปลงสิ่งเหล่านั้น
ประสบการณ์อีกอย่างหนึ่งก็คือ เมื่อใช้ไลบรารีบุคคลที่สามแบบโอเพ่นซอร์ส ให้ลองเพิ่มไลบรารีเหล่านั้นลงในโปรเจ็กต์ด้วยซอร์สโค้ด มิฉะนั้นจะไม่สามารถแก้ไขจุดบกพร่องได้หากมีข้อผิดพลาดเกิดขึ้น
ตอนนี้ วิธีที่ฉันใช้เฟรมเวิร์กนี้คือการใช้เว็บเพจคลาสที่สร้างขึ้น GenerateAllClasses.aspx เพื่อสร้างโค้ด จากนั้นจึงอ้างอิงด้วยตัวเอง แม้ว่าจะยุ่งยากกว่าการสร้างโดยตรงเริ่มต้นเล็กน้อย จากนั้นจึงคอมไพล์และรันในหน่วยความจำ แต่ก็ยังคุ้มค่าเพื่อความสะดวกในการแก้ไขจุดบกพร่อง
โพสต์เมื่อ 22-01-2550 00:28 Kinoho Reading (62) ความคิดเห็น (4) แก้ไขคอลเลกชัน Quote Network ข้อความที่ตัดตอนมา หมวดหมู่: .NET
ความคิดเห็น
# re: แก้ไขปัญหาชื่อฟิลด์ SubSonic ที่ไม่ได้ใช้ Escape 2007-01-22 00:47 TerryLee
SubSonic ก็ไม่เลว เป็นที่รู้จักในชื่อชั้นการเข้าถึงข้อมูลแบบรหัสศูนย์ :) ตอบความคิดเห็นเพิ่มเติม
# เรื่อง: ชื่อฟิลด์ SubSonic การแก้ปัญหาที่ไม่ได้ใช้ Escape 2007-01-22 00:49 Kinohu
@เทอร์รี่ลี
ฮ่าๆ ใช่แล้ว อย่างไรก็ตาม ฉันไม่กล้าใช้โหมดอัตโนมัติของมัน เพราะฉันรู้สึกควบคุมได้น้อยลง เหตุผลเป็นไปตามที่อธิบายไว้ในโพสต์นี้
ตอบกลับ ความคิดเห็นเพิ่มเติม
# เรื่อง: ชื่อฟิลด์ SubSonic การแก้ปัญหาที่ไม่ได้ใช้ Escape 2007-01-22 00:53 TerryLee
@ 木野湖 ใช่แล้ว
ฉันใช้มันเพื่อเขียนการสาธิตเล็กๆ เท่านั้น :) ตอบกลับ ความคิดเห็นเพิ่มเติม
# re: ชื่อฟิลด์ SubSonic การแก้ไขปัญหาที่ไม่ได้ใช้ Escape 2007-01-22 01:02 木野湖 รู้สึกสิ่งนี้เมื่อใช้แยกกัน เอกสารประกอบคือ ยังเบาบาง ตัวอย่างที่ให้มาก็ง่ายมากเช่นกัน การใช้งานที่มีประโยชน์มากกว่าเล็กน้อยนั้นขึ้นอยู่กับการสำรวจของฉันเอง
ตัวอย่างเช่น:
ในการโหลดวัตถุตามเงื่อนไข เอกสาร (pdf) ระบุว่าคุณสามารถใช้
object.Load(...) เพื่อโหลด และพารามิเตอร์สามารถเป็น IDataReader, DataRow, DataTable
ฉันใช้ IDataReader เพื่อส่งผ่าน และ ฉันใช้เวลานานในการทำมัน มันเป็นข้อผิดพลาด ในที่สุด หลังจากการดีบั๊กในซอร์สโค้ดของเฟรมเวิร์ก ฉันพบว่าฉันต้องอ่านมันหนึ่งครั้งก่อนที่จะส่ง IDataReader เข้าไปจึงจะสำเร็จ ตัวอย่างเช่น มันถูกใช้ในตัวอย่างนี้ที่ฉันเขียนว่า:
/// <summary>
/// รับผู้รับผิดชอบในแผนกที่ผู้รับผิดชอบตั้งอยู่
/// </สรุป>
/// <ชื่อพารามิเตอร์ = "พนักงาน" ></ พารามิเตอร์>
/// <ส่งคืน></ส่งคืน>
GetManager พนักงานแบบคงที่สาธารณะ (พนักงานเจ้าหน้าที่) {
SubSonic.Query qry = SubSonic.Query ใหม่ (Staff.Schema.Name);
qry.AddWhere(Staff.Columns.IsFunctionary, จริง);
qry.AddWhere(Staff.Columns.OfficeId, staff.OfficeId);
ผู้จัดการพนักงาน = พนักงานใหม่();
เครื่องอ่าน IDataReader = qry.ExecuteReader();
ถ้า (reader.Read())
-
manager.Load (ผู้อ่าน);
-
ผู้จัดการฝ่ายส่งคืน;
}
http://www.cnblogs.com/RChen/archive/2007/01/22/actionpack1.html