1

Microsoft SQL Serverにテーブルが存在するかどうかを確認しようとしていますが、どういうわけか、使用する関数は常にテーブルが存在しないことを返し、出力は例外がスローされたことを指定していません。

これは、テーブルを作成する前(予想される)と、テーブルを作成した後(予想されない)の両方で発生します。

これは私が使用している関数です:

/// <summary>
/// Checks  if a certain Sql Server Table exists
/// </summary>
/// <param name="_databasename">The name of the database</param>
/// <param name="_password">The password of the database</param>
/// <param name="_tablename">The name of the table to check</param>
/// <returns>
///     'true' if table exists
///     'false' if table not exists or if an exception was thrown
/// </returns>
public Boolean TableExists(String _databasename, String _password, String _tablename)
{
    if (!_databasename.Contains(".sdf")) { _databasename = _databasename + ".sdf"; }
    try
    {
        String connectionString = "DataSource=" + _databasename + "; Password=" + _password;
        SqlCeConnection conn = new SqlCeConnection(connectionString);

        if (conn.State==ConnectionState.Closed) { conn.Open(); }

        using (SqlCeCommand command = conn.CreateCommand())
        {
            command.CommandType = CommandType.Text;
            command.CommandText = "SELECT * FROM Information_Schema.Tables WHERE TABLE_NAME = '" + _tablename + "'";
            Int32 count = Convert.ToInt32(command.ExecuteScalar());

            if (count == 0)
            {
                Debug.WriteLine("Table " + _tablename + " does not exist.");
                return false;
            }
            else
            {
                Debug.WriteLine("Table " + _tablename + " exists.");
                return true;
            }
        }
    }
    catch(Exception _ex)
    {
        Debug.WriteLine("Failed to determine if table " + _tablename + " exists: " + _ex.Message);
        return false;
    }
}

ここに欠けているものがあるのは明らかですが、それが何なのかわからないようです。

4

1 に答える 1

3

ExecuteScalarは、クエリによって取得された最初の行の最初の列を返します。
テーブルが実際に存在し、データベース名が正しく、予想される場所にあるとすると、返される行の最初の列は、nvarchar列であるTABLE_CATALOGからのものです。

クエリを次のように変更できるフレーズ:

command.CommandText = "SELECT COUNT(*) FROM Information_Schema.Tables " + 
                      "WHERE TABLE_NAME = .......";

そうは言っても、ExecuteScalarの戻り値をintに変換しようとしたときに、なぜ例外が発生しないのかはまだ説明できません。

于 2012-10-13T18:23:37.237 に答える