SubSonic은 코드 생성/빌드 공급자(asp.net 2.0의 새로운 기능)를 통합하는 매우 우수한 데이터 액세스 프레임워크입니다. ROR의 ActionPack에서 영감을 얻었으며 소규모 웹사이트의 빠른 개발에 매우 적합합니다.
어제 이 프레임워크를 사용하기 시작했는데 작은 문제를 발견했습니다.
Key라는 필드가 있는데 SQL이 Select 문에 대한 쿼리를 생성할 때 오류를 보고합니다. Key는 키워드이기 때문에 SubSonic이 생성한 SQL에서 이스케이프되지 않습니다.
디버깅 시 생성된 SQL은 다음과 같이 얻을 수 있습니다.
SELECT TOP 100 PERCENT [cfg_Tips].[Id], [cfg_Tips].[Key], [cfg_Tips].[Descr], [cfg_Tips].[Value], [cfg_Tips] . [라벨] FROM [cfg_Tips] WHERE [cfg_Tips].Key = @Key ORDER BY [Id];
이 문제를 일시적으로 해결하기 위해 소스 코드의 SqlDataProvider.cs에서 BuildWhere 메서드를 수정했습니다.
보호된 정적 문자열 BuildWhere(Query qry)
{
문자열 여기서 = "";
string whereOperator = " WHERE ";
foreach(qry.where의 wWhere)
{
if(wWhere.ParameterValue != DBNull.Value)
{
where += whereOperator + "[" + wWhere.TableName + "].[" + wWhere.ColumnName + "] " +
Where.GetComparisonOperator(wWhere.Comparison) + " @" + wWhere.ParameterName;
}
또 다른
{
where += whereOperator + "[" + wWhere.TableName + "].[" + wWhere.ColumnName + "] " + Comparison.Is +
"NULL";
}
where연산자 = " AND ";
}
foreach(qry.betweens의 BetweenAnd 사이)
{
where += whereOperator + "[" + between.TableName + "].[" + between.ColumnName + "] BETWEEN @start" +
between.ColumnName + " AND @end" + between.ColumnName;
where연산자 = " AND ";
}
for (int i = qry.wheres.Count - 1; i >= 0; i--)
{
if (qry.wheres[i].ParameterValue == DBNull.Value)
{
qry.wheres.RemoveAt(i);
}
}
어디로 돌아가나요?
}
제가 추가한 부분은 위 코드에서 녹색으로 표시되어 있습니다.
작성자가 테이블 이름에는 대괄호를 추가했지만 열 이름에는 대괄호를 추가하지 않은 것이 이상합니다. 이는 분명히 엄격하지 않습니다.
이 라이브러리에는 MySqlDataProvider와 같은 클래스에도 이 문제가 있습니다. 당분간은 MySQL을 사용하지 않기 때문에 아직은 변경하지 않겠습니다.
또 다른 경험은 오픈 소스 타사 라이브러리를 사용할 때 소스 코드로 프로젝트에 추가해 보는 것입니다. 그렇지 않으면 문제가 발생하면 디버깅이 불가능합니다.
이제 제가 이 프레임워크를 사용하는 방법은 생성된 클래스 웹 페이지인 generateAllClasses.aspx를 사용하여 코드를 생성한 다음 직접 참조하는 것입니다. 기본 직접 생성 후 메모리에서 컴파일하고 실행하는 것보다 조금 더 번거롭기는 하지만 디버깅의 편의를 위해 여전히 가치가 있습니다.
게시일 2007-01-22 00:28 Kinoho 읽기 (62) 댓글 (4) 편집 컬렉션 인용문 네트워크 발췌 카테고리: .NET
논평
# re: SubSonic 필드 이름이 이스케이프되지 않은 문제가 수정되었습니다. 2007-01-22 00:47 TerryLee
SubSonic은 나쁘지 않습니다. 제로 코드 데이터 액세스 레이어로 알려져 있습니다 :) 답변 더 많은 댓글
# re: SubSonic 필드 이름 이스케이프되지 않은 문제 수정 2007-01-22 00:49 Kinohu
@테리리
하하, 그렇죠. 하지만 자동 모드를 감히 사용하지 못하기 때문에 통제력이 떨어지는 느낌이 듭니다. 이유는 이 포스팅에 설명되어 있습니다.
답변 댓글 더보기
# re: SubSonic 필드 이름 이스케이프되지 않은 문제 수정 2007-01-22 00:53 TerryLee
@木野湖 네,
작은 데모 작성에만 사용했습니다 :) 답변 댓글 더보기
# re: SubSonic 필드 이름 이스케이프 처리되지 않은 문제 수정 2007-01-22 01:02 木노湖는 별도로 사용할 때 이런 느낌이 듭니다. 문서는 다음과 같습니다. 아직은 드물다. 주어진 예도 매우 간단합니다. 조금 더 유용한 사용법은 내 자신의 탐색에 달려 있습니다.
예를 들면 다음과 같습니다.
조건에 따라 개체를 로드하려면
object.Load(...)를 사용하여 로드할 수 있으며 매개 변수는 IDataReader, DataRow, DataTable이 될 수 있다고
문서
(pdf)에 나와 있습니다.오류가 발생했습니다. 마지막으로 프레임워크 소스 코드를 디버깅한 후 성공하려면 IDataReader를 전달하기 전에 한 번 읽어야 한다는 사실을 발견했습니다. 예를 들어, 제가 작성한 다음 간단한 예제에서는 이 단어가 사용되었습니다.
/// <summary>
/// 담당자가 위치한 부서의 담당자를 구합니다.
/// </summary>
/// <param name="직원"></param>
/// <반환></반환>
공개 정적 직원 GetManager(직원 직원) {
SubSonic.Query qry = new SubSonic.Query(Staff.Schema.Name);
qry.AddWhere(Staff.Columns.IsFunctionary, true);
qry.AddWhere(Staff.Columns.OfficeId, Staff.OfficeId);
직원 관리자 = new Staff();
IDataReader 리더 = qry.ExecuteReader();
if (리더.읽기())
{
관리자.로드(리더);
}
반품 관리자;
}
http://www.cnblogs.com/RChen/archive/2007/01/22/actionpack1.html