2017-10-26 12 views
1

私はボタンを押すと、SQLサーバデータベースにSQLテーブルを生成するC#プログラムを作成しています。テーブルが正常に作成されていれば、プログラムの大きなテキストボックスにメッセージが表示されます。そうしないと、テキストボックスの画面にメッセージエラーが表示されます。c# - SQLクエリが作成されている場合、テキストボックスにメッセージを表示します。

これまでのところ、すべてが期待通りに機能しますが、何回ボタンを押しても、同じ表示メッセージ(テーブルが作成されています)が画面にポップされます。 私のデータベースにテーブルがまだ存在しない場合にのみ、メッセージが表示されます(正常に)。テーブルがすでに存在する場合は、画面にエラーメッセージが表示されます。私はwhileステートメントを使用していると思っていますが、それがどのように解決するのか理解できませんでした。ここで

は私のコードは次のとおりです。

private void btnCreateTables_Click(object sender, EventArgs e) 
{ 
    string query = "IF OBJECT_ID('dbo.AuditCardTypeBenefit_TEST','U') IS NULL "; 
    query += "BEGIN "; 
    query += "CREATE TABLE[dbo].[AuditCardTypeBenefit_TEST]("; 
    query += "[AuditID] [decimal](18, 0) IDENTITY(1,1) NOT NULL, "; 
    query += "[AuditType] [char](5) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, "; 
    query += "[CardTypeBenefitID] [decimal](18, 0) NOT NULL, "; 
    query += "[EventCode] [varchar](8) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, "; 
    query += "[CardTypeGroupID] [varchar](5) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, "; 
    query += "[AgeFrom] [int] NULL, "; 
    query += "[AgeTo] [int] NULL, "; 
    query += "[Gender] [char](1) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, "; 
    query += "[CreateBy] [nvarchar](128) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, "; 
    query += "[CreateDate] [datetime] NOT NULL, "; 
    query += "[Status] [char](2) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, "; 
    query += "[CancelReason] [varchar](250) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, "; 
    query += "[LastChangeBy] [nvarchar](128) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, "; 
    query += "[LastChangeDate] [datetime] NOT NULL, "; 
    query += "[RecordVersion] [timestamp] NOT NULL "; 
    query += ") ON [PRIMARY] "; 
    query += "END "; 

    string constr = ConfigurationManager.ConnectionStrings["constr"].ConnectionString; 

    try 
    { 
     using (SqlConnection con = new SqlConnection(constr)) 
     { 
      using (SqlCommand cmd = new SqlCommand(query)) 
      { 
       cmd.Connection = con; 
       con.Open(); 
       cmd.ExecuteNonQuery(); 
       Display("AuditCardTypeBenefit_Test table has been created successfully"); 
       con.Close(); 
      } 
     } 
    } 
    catch(Exception ex) 
    { 
     MessageBox.Show(ex.Message); 
     textBox1.AppendText(string.Format("{0}", Environment.NewLine)); 
     textBox1.AppendText(string.Format("{0} MainPage_Load() exception - {1}{2}", _strThisAppName, ex.Message, Environment.NewLine)); 
     Debug.WriteLine(string.Format("{0} MainPage_Load() exception - {1}", _strThisAppName, ex.Message)); 
    } 

注:表示方法は、画面にメッセージを表示する責任があります。

+0

*ボタンを何度何回押しても、同じメッセージが画面にポップされます。*同じメッセージはどういう意味ですか?どのメッセージ? – CodingYoshi

+0

while文ではどうしますか? – astidham2003

+0

メッセージ「AuditCardTypeBenefit_Testテーブルが正常に作成されました」 –

答えて

0

SqlCommand.ExecuteNonQuery()メソッドは、影響を受ける行の数を返します。

UPDATE、INSERT、およびDELETEステートメントの場合、戻り値はコマンドの影響を受ける行の数です。挿入または更新される表にトリガーが存在する場合、戻り値には、挿入操作または更新操作の両方によって影響を受ける行数と、トリガーの影響を受ける行数が含まれます。 他のすべてのタイプのステートメントの場合、戻り値は-1です。ロールバックが発生した場合、戻り値も-1になります。

たぶん

if (cmd.ExecuteNoneQuery() == -1) 
    Display("AuditCardTypeBenefit_Test table has been created successfully"); 

con.Close(); 

はあなたの問題を解決しますやって?テーブルを作成するときに0を返すかどうかわかりませんが、これは単なる提案に過ぎません。

+0

これを試してみます –

+0

これはSQLクエリを実行するのにも適していますか?私は複数のSQLスクリプトファイルを持っているので、私はこれらのファイルをC#でハードコーディングするのではなく、実行することを考えていました。 50個のSQLスクリプトがあり、コードに含める必要があると想像してみてください。面倒です。 –

+0

私はあなたのコードを試しましたが、それはまだ同じ問題です。それはまだテーブルが私のSQLサーバーに存在するとき、そのメッセージを生成します。それはそれをしてはならない。 –

関連する問題