2012-12-17 5 views
1

데이터베이스에 ODBC 연결이 있는데 사용자가 모든 테이블 내에서 데이터를 볼 수 있기를 바랍니다. 이것은 ASP.net 응용 프로그램이므로 전송 된 테이블 이름에도 nasties가 포함되지 않는다고 나는 믿을 수 없습니다. 나는 매개 변수화 쿼리를 사용하여 시도했지만 난 항상 "변수가 테이블 선언해야합니다"라고 말하는 오류가 - 그것은 가장 좋은 방법은 무엇 테이블 이름ODBC 쿼리에서 테이블 이름을 매개 변수화하는 방법

string sql = "SELECT TOP 10 * FROM ? "; 
OdbcCommand command = new OdbcCommand(sql, dbConnection); 
command.Parameters.Add(new OdbcParameter("@table", tableName)); 
OdbcDataAdapter adapter = new OdbcDataAdapter(); 
adapter.SelectCommand = command; 
adapter.Fill(tableData); 

때문에이 문제가 될 나타납니다 이것을 안전하게하는 방법은?

답변

2

저장 프로 시저를 사용하면 가장 안전한 방법입니다.

일부 힌트 :

:

  1. 당신은 아마 또한 System.Data.SqlClient 네임 스페이스
  2. 가 연결, 명령 및 어댑터가 using

다음은 간단한 예제의에서 초기화를 개체를 동봉 개체를 사용할 수있다

string sqlStoredProcedure = "SelectFromTable"; 
using (OdbcConnection dbConnection = new OdbcConnection(dbConnectionString)) 
{ 
    dbConnection.Open(); 
    using (OdbcCommand command = new OdbcCommand(sqlStoredProcedure, dbConnection)) 
    { 
     command.CommandType = System.Data.CommandType.StoredProcedure; 
     command.Parameters.Add(new OdbcParameter("@table", tableName)); 
     using (OdbcDataAdapter adapter = new OdbcDataAdapter(command)) 
     { 
      adapter.SelectCommand = command; 
      adapter.Fill(tableData); 
     } 
    } 
} 

어쩌면 사용하여, 모든 테이블 이름을 검색하고 목록의 항목으로 tableName 문자열 변수의 유효성을 확인하는 것입니다 이동하는 또 다른 방법 :

string sql = "SELECT TOP 10 * FROM {0}"; 
using (OdbcConnection dbConnection = new OdbcConnection(dbConnectionString)) 
{ 
    dbConnection.Open(); 

    DataTable tables = dbConnection.GetSchema(OdbcMetaDataCollectionNames.Tables); 
    var matches = tables.Select(String.Format("TABLE_NAME = '{0}'", tableName)); 

    //check if table exists 
    if (matches.Count() > 0) 
    { 
     using (OdbcCommand command = new OdbcCommand(String.Format(sql, tableName), dbConnection)) 
     { 
      using (OdbcDataAdapter adapter = new OdbcDataAdapter(command)) 
      { 
       adapter.SelectCommand = command; 
       adapter.Fill(tableData); 
      } 
     } 
    } 
    else 
    { 
     //handle invalid value 
    } 
} 
+0

:

DataTable tables = dbConnection.GetSchema(OdbcMetaDataCollectionNames.Tables); 

여기에 시나리오를 기반으로 간단한 구현입니다 감사! 하지만 유감스럽게도 SP와 같은 것을 추가하기 위해 데이터베이스에 액세스 할 수 없으므로 응용 프로그램에서이 모든 작업을 수행해야합니다. 그러나 이것은 흥미있는 해결책입니다. 또한 http://www.troyhunt.com/2012/12/stored-procedures-and-orms-wont-save.html이 솔루션에 적용됩니까? – user692898

+0

동적 쿼리가'@ SearchTerm' 매개 변수를 사용하여 빌드 된 후에 SQL 저장 프로 시저에서'EXEC (@query)'를 제공 한 링크에서 호출됩니다. 따라서 SQL 개발자는 실제로 데이터를 사용하는 방법과 동적 쿼리의 위험을 처리해야합니다. –

+0

조금 덜 우아하더라도 편집을 가장 쉽게 볼 수있는 것처럼 보입니다. 당신의 도움을 주셔서 감사합니다! – user692898

관련 문제