2

Web アプリケーションが複数のデータベース、特に SQL Server と MySQL をサポートできるようにする方法を実験しています。

データベースへの接続とクエリの実行を処理する SQL ヘルパー クラスを既にセットアップしています。IDBCommand、などを使用してIDBConnectionいます。コンソール アプリケーションでクラスをテストしましたが、パラメーターなしのクエリで問題なく動作します。

しかし、パラメーターを追加すると、そこから問題が始まります。

現在のテーブル名が変更される可能性があり、クエリでテーブルの名前を変更するのが面倒になるため、テーブル名にパラメーターを使用したいと考えています。

にパラメーターを追加する方法を著者が共有している記事を見つけましたIDBCommand。記事へのリンクが見つかりませんが、記事から得たもののサンプルを次に示します (作成者に感謝します! :D) パラメータが追加されたことを確認できますIDBCommand。 QuickWatch ですが、「テーブル変数 "@myTable" を宣言する必要があります」というメッセージが表示されます。エラー。

    internal static int AddInputParameter<T>(this IDbCommand cmd,
    string name, T value)
    {
        var p = cmd.CreateParameter();
        p.ParameterName = name;
        p.Value = value;
        return cmd.Parameters.Add(p);
    }

私が間違っていることについて何か考えはありますか?

編集:
bew の返信に応えて、 と の両方SqlCommandを使用してこれを行うことができましたMySqlCommand

Edit2:
間違って覚えていたようです。string.format()過去のプロジェクトでテーブル名に使用しました。

4

2 に答える 2

4

簡単に言えば、テーブルをパラメーターとして渡すことはできません。代わりに、実行時にテーブルを決定するクエリは、パラメーター化されたクエリで使用する前に文字列として組み立てる必要があります。cmd.ExecuteReaderより長い答えは、パラメータ化された動的 SQL ステートメントで何かを呼び出すときに何が起こるかを理解する必要があります。そのシナリオでは、.NET クラスは を使用して呼び出しを作成しますsp_executesql。例えば:

Declare @Sql nvarchar(max);
Set @Sql = 'Select Count(*) From sys.objects Where object_id > @SomeNum';
exec sp_executesql @Sql, N'@SomeNum int', 10000;

ここで、テーブルのパラメーターを SQL ステートメントに挿入しようとしているとします。結果のステートメントは次のようになります。

Declare @Sql nvarchar(max);
Set @Sql = 'Select Count(*) From @SomeTable Where object_id > @SomeNum';
exec sp_executesql @Sql, N'@SomeTable nvarchar(256),@SomeNum int', 'sys.objects', 10000;

これにより、 の行に沿ってエラーが発生しますMust declare the table variable "@SomeTable"。SQL Server はそれ@SomeTableがパラメーターであることを認識せず、テーブル変数とは言いません。したがって、オブジェクト参照 (テーブル、ビュー、プロシージャなど) はパラメータ化できるものではありません。パラメータ化できるのは基準のみです。

于 2013-08-16T17:48:31.560 に答える