2016-07-30 2 views
0

を使用してストアドプロシージャを作成しています。私の.netプロジェクトにプロシージャを作成しようとしています(プロシージャをドロップして新しいデータでリメイクしようとしています)。データベース "Create New Query"で同じクエリを実行すると問題なく動作しますが、C#で実行しようとするとエラーになります。TSQLがC#

This is the successful query completed when i run it on Database

private void makeprocedure() 
      { 
       string sqlProcedureCreate = @" 
    IF(OBJECT_ID('usp_HourData') IS NOT NULL) 
     DROP PROCEDURE IF EXISTS usp_HourData; 
    GO 

    CREATE PROCEDURE usp_HourData 
    AS 
    BEGIN 

    SELECT Employee.[First Name] + ' ' + Employee.[Last Name] AS 'Name', 
    sum(Time.[Total Hours]) AS 'Total Hours' 
    , FORMAT(Time.[Time in], 'd', 'en-gb') AS 'Worked On' 
    FROM Employee 
    inner join Time on 
    Employee.ID ='" + getID() + "' and Time.EmployeeIdFK = '" + getID() 
    + "' WHERE Time.[Time in] between '" + CalendarStart.SelectedDate + "' and '" + CalendarEnd.SelectedDate 
    + @"'GROUP BY FORMAT(Time.[Time in], 'd', 'en-gb') ,Employee.[First Name] + ' ' +Employee.[Last Name]; 
    END  
    "; 
       using (SqlCommand command = new SqlCommand(sqlProcedureCreate, con)) 
       { 
        command.CommandType = CommandType.Text; //I tried command.CommandType = CommandType.StoredProcedure; 
         con.Open(); 
         command.ExecuteNonQuery(); //Compiler says error is on this line 
         con.Close(); 
       } 
      } 

エラーは "GO" と "/ ALTER PROCEDUREを作成する" を最初に行く必要があります近くです。

System.Data.SqlClient.SqlException was unhandled by user code 
    Class=15 
    ErrorCode=-2146232060 
    HResult=-2146232060 
    LineNumber=4 
    Message=Incorrect syntax near 'GO'. 
'CREATE/ALTER PROCEDURE' must be the first statement in a query batch. 
    Number=102 
    Procedure="" 
    Server=(LocalDB)\MSSQLLocalDB 
    Source=.Net SqlClient Data Provider 
    State=1 
    StackTrace: 
     at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction) 
     at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction) 
     at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose) 
     at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady) 
     at System.Data.SqlClient.SqlCommand.RunExecuteNonQueryTds(String methodName, Boolean async, Int32 timeout, Boolean asyncWrite) 
     at System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(TaskCompletionSource`1 completion, String methodName, Boolean sendToPipe, Int32 timeout, Boolean asyncWrite) 
     at System.Data.SqlClient.SqlCommand.ExecuteNonQuery() 
     at WebApplication2.Manager.makeprocedure() in D:\Users\Albin\MyClockIn\WebApplication2\WebApplication2\Manager.aspx.cs:line 209 
     at WebApplication2.Manager.ButtonSearch_Click(Object sender, EventArgs e) in D:\Users\Albin\MyClockIn\WebApplication2\WebApplication2\Manager.aspx.cs:line 161 
     at System.Web.UI.WebControls.Button.OnClick(EventArgs e) 
     at System.Web.UI.WebControls.Button.RaisePostBackEvent(String eventArgument) 
     at System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument) 
     at System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument) 
     at System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData) 
     at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) 
    InnerException: 

このエラーについてどうすればよいですか?

+0

、私はあなたが複数の操作を行うことができないと言うだろうVisual StudioのSQLコマンド。私は確かに(私はいつもSSMSでそれをやっている)わからないが、それはエラーが示しているようだ。 – Tim

+0

あなたはC#からそれを行う必要がある理由は何ですか?通常、これはDBオブジェクトの作成方法ではありません。 – objectNotFound

+0

これは 'command.ExecuteReader(); 'でなければなりません。 – Rahul

答えて

0

これはあなたの質問に対する回答ではなく、プログラミングスタイルに関するアドバイスです。これらはコード内の悪いものです。

  1. クエリ文字列を連結しています。パラメータを使用する必要があります。
  2. クエリにパラメータではなくデータが含まれているプロシージャを作成しています。ストアドプロシージャにはパラメータを含むクエリが含まれている必要があり、データを渡す必要があります。

ストアドプロシージャは、アクセスするたびに削除および再作成されることは想定されていません。 select文を使うだけで、同じ結果が得られることがはっきり分かります。ストアドプロシージャを作成している場合は、そこに渡すデータがなければなりません。そうでなければ、ストアドプロシージャを作成する必要はありません。

十分な理論、のアクションで物事を見てみましょう。ここでは

があなたのMakeProcedure(この名前を変更してください)機能である:推測では

//Rename this function to some useful name 
private void makeprocedure() 
{ 
    string query = @" SELECT Employee.[First Name] + ' ' + Employee.[Last Name] AS 'Name', 
sum(Time.[Total Hours]) AS 'Total Hours' 
, FORMAT(Time.[Time in], 'd', 'en-gb') AS 'Worked On' 
FROM Employee 
inner join Time on 
Employee.ID = @EmpId and Time.EmployeeIdFK = @EmpId WHERE Time.[Time in] 
between @StartDate and @EndDate GROUP BY FORMAT(Time.[Time in], 'd', 'en-gb'), 
Employee.[First Name] + ' ' +Employee.[Last Name];"; 


    using (SqlCommand command = new SqlCommand(query, con)) 
    { 
     command.CommandType = CommandType.Text; 
     command.Parameters.AddWithValue("@EmpId", getID()); 
     command.Parameters.AddWithValue("@StartDate", CalendarStart.SelectedDate); 
     command.Parameters.AddWithValue("@EndDate", CalendarEnd.SelectedDate); 
     con.Open(); 
     var reader = command.ExecuteReader(); 
     //do something with data in the reader. 
     con.Close(); 
    } 
}