43

データベースに依存しない方法でSQLデータベースにテーブルが存在するかどうかを確認する最良の方法は何ですか?

私が思いついた:

   bool exists;
   const string sqlStatement = @"SELECT COUNT(*) FROM my_table";

   try
    {
       using (OdbcCommand cmd = new OdbcCommand(sqlStatement, myOdbcConnection))
       {
            cmd.ExecuteScalar();
            exists = true;
       }
    }
    catch
    {
        exists = false;
    }

これを行うより良い方法はありますか?データベースへの接続が失敗した場合、この方法は機能しません。Sybase、SQL サーバー、Oracle の方法を見つけましたが、すべてのデータベースで機能する方法はありません。

4

9 に答える 9

11

データベースの独立性を求めている場合は、最低限の基準を想定する必要があります。IIRC ANSI INFORMATION_SCHEMAビューは ODBC 準拠に必要なため、次のように照会できます。

select count (*) 
  from information_schema.tables 
 where table_name = 'foobar'

ODBC を使用している場合、さまざまなODBC API 呼び出しを使用して、このメタデータを取得することもできます。

移植性はどこでも一度だけテストを行うことと同等であるため、サポートする予定のすべてのプラットフォームでアプリケーションをテストする必要があることに注意してください。これは、テスト用のリソースが非常に限られているため、使用可能なデータベース プラットフォームの数が本質的に限られていることを意味します。

要するに、アプリケーションの最小公分母を見つけるか (SQL を探すよりもかなり難しい)、プラットフォームに依存するセクションを作成して、移植性のない関数をプラットフォームごとにプラグインできるようにする必要があります。基本。

于 2009-01-21T10:25:30.433 に答える
4

FrederikGheyselsの回答を完全にサポートします。複数のデータベースシステムをサポートする必要がある場合は、データベースシステムごとに特定の実装を使用して、抽象インターフェイスに対してコードを実装する必要があります。互換性のない構文の例は、既存のテーブルをチェックするだけではありません(たとえば、クエリを特定の行数に制限する)。

ただし、例の例外処理を使用してチェックを実際に実行する必要がある場合は、データベースに実際の選択作業がないため、COUNT(*)よりも効率的な次のクエリを使用する必要があります。

SELECT 1 FROM my_table WHERE 1=2
于 2009-01-21T09:05:16.960 に答える
3

以下は私にとってはうまくいきます...

private bool TableExists(SqlConnection conn, string database, string name)
{
    string strCmd = null;
    SqlCommand sqlCmd = null;

    try
    {
        strCmd = "select case when exists((select '['+SCHEMA_NAME(schema_id)+'].['+name+']' As name FROM [" + database + "].sys.tables WHERE name = '" + name + "')) then 1 else 0 end";
        sqlCmd = new SqlCommand(strCmd, conn);

        return (int)sqlCmd.ExecuteScalar() == 1;
    }
    catch { return false; }
}
于 2016-12-14T18:40:21.750 に答える
1

とてもシンプル

use YOUR_DATABASE --OPTIONAL
SELECT count(*) as Exist from INFORMATION_SCHEMA.TABLES where table_name = 'YOUR_TABLE_NAME'

答えが 1 の場合、テーブルがあります。答えが 0 の場合、テーブルはありません。

于 2017-12-29T19:54:48.387 に答える