이번엔 변수 영역에 관련된 문제인것 같은데
제가 scope rule 을 잘못 썼는지 자꾸 에러가 발생하네요..
아.. razor 로 가는길.. 좀 힘이 들어요...
# index.cshtml
@{
var _HD = new Dictionary<string, string>();
var _HS = "";
var _HS_sql = "";
var s = Request["s"];
if(s.IsEmpty()) {
_HD.Add("site", @_DB.GetDbData(@AppState["table_s_domain"].ToString(), "name='"+Request["SERVER_NAME"].Replace("www.", "")+"'", "site").ToString());
if(_HD["site"] != "") {
_HS_sql = "SELECT * FROM "+@AppState["table_s_site"]+" WHERE uid='"+_HD["site"]+"'";
}
else {
_HS_sql = "SELECT top 1 * FROM "+@AppState["table_s_site"].ToString()+" ORDER BY gid asc";
}
}
else {
_HS_sql = "SELECT * FROM "+@AppState["table_s_site"]+" WHERE uid='"+s+"'";
_HS = db.QuerySingle(_HS_sql);
}
}
위 굵게 된 부분인데, _HS를 아래와 같이 if~else 안쪽에서 선언하면
else {
_HS_sql = "SELECT * FROM "+@AppState["table_s_site"]+" WHERE uid='"+s+"'";
var _HS = db.QuerySingle(_HS_sql);
}
Compiler Error Message: CS0103: The name '_HS' does not exist in the current context
이런 에러가 발생하여 조건문 상단으로 다시 올렸는데, 올리고 다시 선언하고 나니 아래와 같이 에러가 나더라구요.
아무래도 razor 관련 scope 룰을 알아야 할듯한 느낌이...
조건문 사이에서 변수를 지정할때 조건문을 빠져나가면 적용이 되지 않는건지요..?
만약 적용시키고자 하면 어캐 해야 하는지 궁금합니다.
항상 감사드립니다. ^^
* 에러메시지
Server Error in '/' Application.
Cannot implicitly convert type 'WebMatrix.Data.DynamicRecord' to 'string'
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.
Exception Details: Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: Cannot implicitly convert type 'WebMatrix.Data.DynamicRecord' to 'string'
Source Error:
Line 72: _HS_sql = "SELECT * FROM "+@AppState["table_s_site"]+" WHERE uid='"+s+"'";
Line 73:
Line 74: _HS = db.QuerySingle(_HS_sql);
Line 75: }
Line 76: // @_HS["uid"].ToString();
Comment 3
-
태지등장
2010.12.02 12:16
아.. dynamic이라는 타입도 있었구나.. 감사합니다.
-
SuYoung Kim
2010.12.07 18:09
우선 var 타입은 컴파일 시점에 타입이 확정되는 형식입니다.
위에서의 오류는 var 초기 설정시 string으로 설정을 하고 실제 사용은 DB 결과값 객체로 사용하였기 때문에 타입이 맞지 않아 발생한 오류 입니다.
var 타입은 한번 설정된 형식은 변경이 되지 않습니다..
위에서 말씀하진 dynamic이 대안이 될 수 있지만 dynamic은 런타임에서 타입이 확인이 되므로 성능에 그렇게 좋지 않습니다.
구조를 위에서 선언한 부분을 빼고.. 적어주신 코드처럼
else {
_HS_sql = "SELECT * FROM "+@AppState["table_s_site"]+" WHERE uid='"+s+"'";
var _HS = db.QuerySingle(_HS_sql);
}이런 식으로 하시는게 나을것 같네요~


제가 택한 방법은 dynamic type으로 선언한겁니다. 더 좋은 방법도 있을 것 같은데...
아래 db.query 항목도 바뀌어야 합니다. type casting 관련해 잘은 모르지만, db.QuerySingle과 db.query는 다른 듯 하네요. querysingle을 쓸 일이 있을지...
@{
var db = Database.Open("CohoWinery");
var _HD = new Dictionary<string, string>();
dynamic _HS;
var _HS_sql = "";
var s = Request["s"];
if(1!=1) {
}
else {
//_HS_sql = "SELECT * FROM "+@AppState["table_s_site"]+" WHERE uid='"+s+"'";
//@ObjectInfo.Print(db.QuerySingle("select * from Customers"));
_HS = db.Query("select * from Customers");
}
<p>@_HS</p>
foreach (var row in _HS)
{
<td>@row.firstname</td>
}
}