1

データベースへの ODBC 接続があり、ユーザーが任意のテーブル内のデータを表示できるようにしたいと考えています。これは ASP.net アプリケーションであるため、送信されたテーブル名に問題が含まれていないとは信じられません。パラメータ化されたクエリを使用しようとしましたが、「テーブル変数を宣言する必要があります」というエラーが常に表示されます-これはテーブル名であるため、問題のようです

 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);

安全な方法でこれを達成するための最良の方法は何ですか?

4

1 に答える 1

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);
        }
    }
}

もう 1 つの方法は、すべてのテーブル名を取得し、tableName文字列変数をリスト内のエントリとして検証することです。おそらく次を使用します。

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

シナリオに基づく簡単な実装を次に示します。

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
    }
}
于 2012-12-17T13:50:35.290 に答える