3

作業コードの形式は次のとおりです。

string sql = "SELECT foo from myTable";
SqlCommand cmd = new SqlCommand(sql, conn);
SqlDataAdapter da = new SqlDataAdapter(cmd);
contractTable = new DataTable();
da.Fill(contractTable);

データベース スキーマが dbo から mySchema に変更されました。これはユーザーの既定のスキーマではなく、変更する管理者権限がありません。コードを実行しようとすると、次のようになります。

System.Data.SqlClient.SqlException: オブジェクト名 'myTable' が無効です。

OK、わかりました。もう見つからないので見つかりませんdbo.

次の行を追加してみました:

cmd.Parameters.AddWithValue("@SchemaName", 'mySchema');

しかし、それには目に見える効果はありませんでした。

次に、 SqlCommand パラメータを使用して選択クエリのスキーマ名を指定する方法に基づいて

SQLに行を追加してみました

DECLARE @SchemaName sysname
SET @SchemaName = 'mySchema'
SELECT foo FROM @SchemaName.[myTable]

しかし、SQL SELECTを実行すると、テーブル名で無効な構文エラーが発生します

これの正しい構文は何ですか?

4

2 に答える 2

3

SQL が実際にコードである場合、これは機能するはずです。

string aSchema = "newSchema";
string sql = "SELECT foo from " + aSchema + ".myTable"; 

ただし、SQL インジェクションの危険性があります。

さらに、構成ファイルにスキーマ名を入力し、C# コードで構成エントリを参照することもできます。これにより、将来、スキーマが再び変更された場合に保護されます。

string aSchema = ConfigurationManager.AppSettings.Get("schema_name");
string sql = "SELECT foo from " + aSchema + ".myTable"; 
于 2013-04-12T19:24:47.567 に答える
1

スキーマ修飾子は、変数で指定できない項目の 1 つです (列名やテーブル名と同様)。

これには動的 SQLを使用する必要があります - SQL を構築して実行します。

これには独自の危険性があります ( SQL インジェクションが主な原因です)。

The Curse and Blessings of Dynamic SQL は Erland Sommarskog による記事で、さまざまな問題について詳しく説明しています。

于 2013-04-12T19:16:49.490 に答える