2011-11-22 2 views
0

데이터 바인딩는 C#의 파라미터

private DataSet BindGridView(List<int> userids) 
    { DataSet ds = new DataSet(); 
    string MysqlStatement = "SELECT OrganisationID, OrganisationName FROM tbl_organisation WHERE [email protected]"; 
    MySqlParameter[] param = new MySqlParameter[1];  
    foreach (var OrgID in userids) 
    { 
     param[0] = new MySqlParameter("@OrganisationID", MySqlDbType.Int32); 
     param[0].Value = OrgID; 
     ds = server.ExecuteQuery(CommandType.Text, MysqlStatement, param); 
     ds.Merge(ds); 
    } 
    Grid_Organisationtable.DataSource = ds; 
    Grid_Organisationtable.Columns[0].Visible = false; 
    Grid_Organisationtable.DataBind(); 
    return ds; 
} 

데이터 바인딩 같은 값의 목록을 전달하는 방법은 바인딩 방식에 값의리스트를 전달한다. 나는 organistionID와 함께 목록을 전달합니다. 데이터 바인딩은 어떻게해야합니까? 빈 데이터 집합을 반환하고 있습니다. 60,61,62와 같은 값을 가진 목록을 전달합니다. 오류가 발생했습니다

'System.Collections.Generic.List`1 [System.Int32]'형식의 개체를 'System.IConvertible'형식으로 캐스팅 할 수 없습니다.

+0

당신은 DB에 값을 정수로 목록을 설정하려고 :

그래서 효과적인 코드는 식으로 뭔가를 할 수 있습니다. 목록의 항목은 그렇게 할 수 있지만 목록 자체는 할 수 없습니다. 무엇을 성취하려고합니까? – Kangkan

+0

코드에서 일부 변경했지만 마지막 값 레코드 만 반환 중입니다. – John

답변

1

이 방법으로 SQL 쿼리에 ID 목록을 전달할 수 없습니다. SELECT 문은 그대로 전달 된 매개 변수가 WHERE 절에서 사용되는 단일 값이 될 것으로 기대합니다.
당신은 당신이 당신의 목록을 반복 할 필요가 예를 들어, 한 번에 각각의 값으로 이동하고 별도의 데이터베이스 호출을 할 것이 쿼리를 고수한다면 : 더 나은 대안에

string MysqlStatement = "SELECT OrganisationID, OrganisationName FROM tbl_organisation WHERE [email protected]"; 
foreach(var id in userids) 
{ 

    MySqlParameter[] param = new MySqlParameter[1];  
    param[0] = new MySqlParameter("@OrganisationID", MySqlDbType.Int32); 
    param[0].Value = id;  
    ds = server.ExecuteQuery(CommandType.Text, MysqlStatement, param); 
    ... add result to another list which is used to databind to your grid 
} 

것 는 XML을 받아 저장 프로 시저를 작성하는 것입니다

string MysqlStatement = string.Format("SELECT OrganisationID, OrganisationName FROM tbl_organisation WHERE OrganisationID IN ({0})", String.Join(",", userIds)); 
ds = server.ExecuteQuery(CommandType.Text, MysqlStatement, null); 

세 번째 옵션을하십시오 WHERE...IN... 절을 사용하여 하나의 데이터베이스 호출을 발생한다이 아니라 한 번에 모든 아이디의 전달 및 매개 변수에 전달이 필요하지 않습니다 문자열 표현을 사용하여 데이터베이스를 쿼리하는 데 사용 이것은 다소 복잡합니다. 이 방법을 사용하면 매개 변수를 사용할 수 있습니다.

참고 : 동적 데이터를 매개 변수로 전달하지 않는 것이 일반적으로 매우 바람직하지는 않지만 SQL 주입 공격에 대해 열어 둘 수는 있지만이 경우 데이터가 사용자의 메서드에 전달 된 List 매개 변수에서 가져올 수 있으므로 확실히 그것은 당신의 데이터베이스를 망치지 않을 것입니다.

1

코드에서 for 루프에 매개 변수를 설정하고 있습니다. 하나의 매개 변수를 가지고 for 루프에서 동일한 시간과 시간을 설정하면 목록의 마지막 값은 루프의 마지막 반복에서 효과적으로 매개 변수로 설정됩니다.

목록을 전달해야하며 where 조건에서 목록을 충족하는 레코드 집합을 가져와야하는 경우 대체 문자는 where .. in 절을 사용하는 것입니다.

private DataSet BindGridView(List<int> userids) 
    { DataSet ds = new DataSet(); 
    string MysqlStatement = string.format("SELECT OrganisationID, OrganisationName FROM tbl_organisation WHERE OrganisationID in ({0})", String.Join(",", userIds)); 
    MySqlParameter[] param = new MySqlParameter[1];  
    ds = server.ExecuteQuery(CommandType.Text, MysqlStatement, null); 
    Grid_Organisationtable.DataSource = ds; 
    Grid_Organisationtable.Columns[0].Visible = false; 
    Grid_Organisationtable.DataBind(); 
    return ds; 
}