2011-12-29 5 views
0

SSMSで以下を実行すると、テーブルが存在しなければ作成されます。しかし、私のSQLCommandコードでは、接続してエラーなしでクエリを送信しますが、存在しない場合はテーブルを作成しません。何か案は?SQLコマンドはC#SqlCommandではなくSSMSで動作します

string[] tables = new string[6]; 
    tables[0] += ("IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[AD_Authorization]') AND type in (N'U')) " + 
        "CREATE TABLE [AD_Authorization]([ID] [bigint] IDENTITY(1,1) NOT NULL, " + 
        " [AD_Account] [varchar](255) NOT NULL, " + 
        " [AD_SID] [varchar](255) NOT NULL, " + 
        " [AD_EmailAddress] [varchar](255) NULL, " + 
        " [DateImported] [datetime] NOT NULL, " + 
        " [Active] [bit] NULL) ON [PRIMARY]"); 

for (int i = 0; i <= 5; i++) 
         { 
          using (SqlConnection connection = new SqlConnection(ConnectionString)) 
          { 
           using (SqlCommand cmd = new SqlCommand(tables[i], connection)) 
           { 
            connection.Open(); 
            cmd.CommandType = CommandType.Text; 
            cmd.ExecuteNonQuery(); 
            connection.Close(); 
           } 
          } 
         } 
+0

SSMSのようにログインしているユーザーとは異なるコードでこれを実行するユーザーには、 が異なる場合は、プロジェクト内で使用しているのと同じユーザとして接続してみてください。 –

+0

他にも:sys.objectsではなく、より正確で集中的な 'sys.tables'を使用しますあなたが興味を持っているオブジェクトのタイプを指定する) - '存在しない場合(SELECT * FROM sys.tables WHERE Name = 'AD_Authorization').... - しかし、これは何か違いが生じるのではないかと疑問に思う –

+0

fullコード。 –

答えて

1

はあなたが正しいデータベースを指定したりすることをことを、データベースへの接続を行うときに、最初の接続をChangeDatabaseていることを確認してください。そうしないと、オブジェクトはMASTERデータベースで終了します。

1

これを試してみてください:

SqlConnection DbConn = new SqlConnection(YourConnectionStringHere); 
SqlCommand CreateTable = new SqlCommand(); 
CreateTable.Connection = DbConn; 
CreateTable.CommandText = "IF NOT EXISTS 
    (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[AD_Authorization]') 
    AND type in (N'U')) 
     CREATE TABLE [AD_Authorization] 
     (
      [ID] [bigint] IDENTITY(1,1) NOT NULL, 
      [AD_Account] [varchar](255) NOT NULL, 
      [AD_SID] [varchar](255) NOT NULL, 
      [AD_EmailAddress] [varchar](255) NULL, 
      [DateImported] [datetime] NOT NULL,[Active] [bit] NULL 
     ) 
     ON [PRIMARY]"; 

try 
{ 
    DbConn.Open(); 
    CreateTable.ExecuteNonQuery(); 
} 
catch (Exception ex) 
{ 
    DbConn.Dispose(); 
    // Handle your error 
} 
0

SQLCommandを介してsys.objectsを使用することはできません。アクセスは、SQL Serverのセキュリティ目的で特にブロックされます。私はこれがデフォルトの設定か、上書きできないものかどうかはわかりません。

関連する問題