2017-02-09 4 views
0

ストアドプロシージャのwhileループを使用するとSQLサーバーで正しく動作しますが、最初の行のみがasp.netグリッドビューに戻ります。sqlのストアドプロシージャのループはasp.netのグリッドビューに1行しか返しません

SQLマイストアドプロシージャ

create procedure [dbo].[DoorDetails] 
@emp varchar(16), 
@fromdate datetime, 
@todate datetime, 
@cdate datetime [email protected] 
as 
while @cdate<= @todate 
Begin 
    select convert(varchar,(CONVERT(date,@cdate,103)),103) as Date, Empname, min(TransactionDateTime) as EntryTime ,max(TransactionDateTime) as ExitTime, 
    (DateDIFF (MINUTE,min(TransactionDateTime), max(TransactionDateTime)))/60 as Hours, 
    (DateDIFF (MINUTE,min(TransactionDateTime), max(TransactionDateTime)))%60 as minutes from 
    ceptEmpTxn where EmpName = @emp and cast(TransactionDateTime as Date)=cast(@cdate as date) group by empname 
    SET @cdate = DATEADD(dd,1,@cdate) 

end 

GO 

結果

------------------------------------------------------------------------------------------------------------- 
|Date|   |Empname|  |EntryTime|    |ExitTime|   |Hours| minutes| 
|14/09/2016| |PRAVEEN KUMAR| |2016-09-14 09:28:13.000||2016-09-14 18:42:14.000 9 14 

------------------------------------------------------------------------------------------------------------ 
|Date|   |Empname|  |EntryTime|    |ExitTime|   |Hours| minutes| 

|15/09/2016| |PRAVEEN KUMAR| |2016-09-15 09:27:13.000||2016-09-15 17:16:46.000 7 49 

------------------------------------------------------------------------------------------------------------- 
|Date|   |Empname|  |EntryTime|    |ExitTime|   |Hours| minutes| 
|16/09/2016| |PRAVEEN KUMAR| |2016-09-16 09:30:33.000||2016-09-16 19:03:14.000 9 33 

ヘッダが

------------------------------------------------------------------------ 
Date|  Empname|  EntryTime|    ExitTime|   Hours| minutes| 
15/09/2016| PRAVEEN KUMAR| 15-09-2016 09:27:07| 15-09-2016 17:16:46| 7|  49| 

(グリッドビューを使用して)ウェブページ内のSQLに

検索結果をその都度繰り返しれます私のf asp.net

一度だけ、すべての行に続くテーブルヘッダを持つようにもどのようにストアドプロシージャからすべての値を返す方法
public DataTable tottime(string empname, DateTime fromdate, DateTime todate) 
{ 
    System.Data.SqlClient.SqlConnection myConn = new System.Data.SqlClient.SqlConnection(ConfigurationManager.ConnectionStrings["ceptConnectionString"].ConnectionString.ToString()); 
    DataTable myDt = new DataTable(); 
    System.Data.SqlClient.SqlCommand myCmd = new System.Data.SqlClient.SqlCommand(); 
    myCmd.CommandType = System.Data.CommandType.StoredProcedure; 
    System.Data.SqlClient.SqlDataAdapter da = new System.Data.SqlClient.SqlDataAdapter(); 
    myCmd.CommandText = "DoorDetails"; 
    myCmd.Parameters.AddWithValue("@emp", empname); 
    myCmd.Parameters.AddWithValue("@fromdate", fromdate); 
    myCmd.Parameters.AddWithValue("@todate", todate); 
    da.SelectCommand = myCmd; 
    try 
    { 
     myCmd.Connection = myConn; 
     da.Fill(myDt); 
     return myDt; 
    } 
    catch (Exception ex) 
    { 
     throw; 
    } 
    finally 
    { 
     myDt = null; 
     da.Dispose(); 
     myCmd.Dispose(); 
     myConn.Close(); 
     myConn.Dispose(); 
    } 

} 

で慰め。

+0

以下のSPを使用できましたか? – balaji

+0

はいストアドプロシージャは正常に動作しています。クエリはSQLサーバーで必要な出力を与えますが、グリッドビューでは得られない期待される結果が得られます。 – praveenrsmart

+0

SQL Serverでは、1つの結果セットとして取得できますか?グリッドの代わりに? – balaji

答えて

1

おそらく、テーブル変数を作成しそこに結果セットを格納し、その結果セットを最後にフェッチする必要があるかもしれません。これを試して。

P.Sテーブル変数(@t)のデータ型を適宜変更してください。それで、何のトラブルもないでしょう。

create procedure [dbo].[DoorDetails] 
@emp varchar(16), 
@fromdate datetime, 
@todate datetime, 
@cdate datetime [email protected] 
as 
while @cdate<= @todate 
Begin 
DECLARE @T TABLE 
(
    [Date] Date 
    ,Empname VARCHAR(200) 
    ,EntryTime DATETIME 
    ,ExitTime DATETIME 
    ,[Hours] INT 
    ,[minutes] INT 
) 

INSERT INTO @T 
    select convert(varchar,(CONVERT(date,@cdate,103)),103) as Date 
    , Empname, min(TransactionDateTime) as EntryTime 
    ,max(TransactionDateTime) as ExitTime 
    ,(DateDIFF (MINUTE,min(TransactionDateTime), max(TransactionDateTime)))/60 as Hours 
    ,(DateDIFF (MINUTE,min(TransactionDateTime), max(TransactionDateTime)))%60 as minutes 
    from 
    ceptEmpTxn where EmpName = @emp and cast(TransactionDateTime as Date)=cast(@cdate as date) group by empname 

    SET @cdate = DATEADD(dd,1,@cdate) 

end 
SELECT * FROM @T 

GO 
+0

ループ内のテーブルを宣言する必要がありますか?それはいくつかの変換エラーを表示しています。私はちょうどそれを試しています – praveenrsmart

+0

はい、@ tテーブルの不適切なデータ型のために、変換エラーがループ内に宣言する必要があります。それに応じて変更してください – balaji

+0

[日付]はchar(10)datataypeになり、SQLサーバーとGridviewの両方で正常に動作するはずです – praveenrsmart

関連する問題