1
public bool CheckTblExist(string TblName)
    {
        try
        {  
            string cmTxt = "select case when exists" 
            + "((select * from information_schema.tables " 
            + "where table_name = '" + TblName + "')) then 1 else 0 end";

            var cmd = new OdbcCommand(cmTxt);
            if ((int)cmd.ExecuteScalar() == 1) exists = true;
            MessageBox.Show(TblName + " table Exists.");
        }
        catch
        {
            exists = false;
            MessageBox.Show(TblName + " table does not Exist.");
        }
        return exists;
    }

VS2012、C# を使用して、con という名前の接続を使用して App_Data 内に Tasoo1.mdf という名前の mdf ファイルを手動で作成しました。Tasoo.mdf には、「1010」という名前のテーブルが既に 1 つあり、

string cmdText = "CREATE TABLE [" + tblname + "]" 
                 + "(column_name1 int,column_name2 int,column_name3 int)";

コードを実行すると、me- テーブルが存在しませんか? これを解決する方法はありますか..事前に感謝します。

4

4 に答える 4

2
var cmd = new OdbcCommand(cmTxt);

このコマンドは、いかなる種類の接続オブジェクトにも関連付けられることはありません (開いているものは言うまでもありません)。

catch
    {
        exists = false;
        MessageBox.Show(TblName + " table does not Exist.");
    }

このコードは、発生した例外を無視し、テーブルが存在しないことを報告するだけです。実際に変数を指定して例外を格納し、それを調べていれば、私が言及した最大の問題を発見できたはずです。


もちろん、それらを修正したとしても、テーブルが存在しない場合でも、(記述されているように) コードが例外をスローすることはありません。を呼び出すと、結果の値が異なるだけですExecuteScalar

非常に多くの問題があるため、これは宿題のように感じます。

後の部分は次のように書き直すことができます。

if ((int)cmd.ExecuteScalar() == 1)
{
   MessageBox.Show(TblName + " table exists.");
   return true;
}
else
{
   MessageBox.Show(TblName + " table does not exist.");
   return false;
}
于 2013-01-03T07:31:58.170 に答える
2

if ステートメントの下にあるステートメントは 1 つだけですexists = true。MessageBox.Show は if ステートメントの外にあります。そのため、if ステートメントが false を返した場合でも、テーブルが存在するというメッセージが常に表示されます。で囲み{}ます。

if ((int)cmd.ExecuteScalar() == 1) 
{    
     exists = true;
     MessageBox.Show(TblName + " table Exists.");
}

現在のコード:

if ((int)cmd.ExecuteScalar() == 1) exists = true;
MessageBox.Show(TblName + " table Exists."); // this is irrespective of the if 

コードを実行すると、me- テーブルが存在しませんか?

あなたはあなたのキャッチブロックでそれを示しています。つまり、何らかの例外が発生しています。空の catch ブロックを持つことはお勧めできません。例外をキャッチして、何が問題なのかを確認します。

catch(SqlException ex)
{
   MessageBox.Show(ex.Message);
   //handle exception
}
于 2013-01-03T07:26:57.260 に答える
0

簡単に試す方法

bool tabex;
try
{ 
    var cmd = new OdbcCommand(
      "select case when exists((select * from information_schema.tables where table_name = '" + tableName + "')) then 1 else 0 end");

    tabex= (int)cmd.ExecuteScalar() == 1;
}
catch
{
    try
    {
        tabex = true;
        var cmdOthers = new OdbcCommand("select 1 from " + tableName + " where 1 = 0");
        cmdOthers.ExecuteNonQuery();
    }
    catch
    {
        tabex = false;
    }
}

これも確認してください:C#を使用して、テーブルがSQLに存在するかどうかをどのように確認しますか?

于 2013-01-03T07:31:17.800 に答える
0

テーブルが存在しないというのは、2 番目のメッセージ ボックスが表示されていることを意味していると思いますか? これは、スローされる例外によって発生します。スローされている例外オブジェクトをキャッチする必要があり、問題が何であるかがわかります。

于 2013-01-03T07:31:28.070 に答える