2013-09-05 3 views
4

동시에 행 수를 얻으려면 많은 (16) 개의 서로 다른 쿼리가 필요합니다. 16 개의 다른 연결을 실행하고 있었지만 하나의 저장 프로 시저 만 결합 할 수 있다고 생각했습니다. 그것은이 라인 DataReader가에 (범위 excpection 중 시스템) 오류를 제공으로하나의 저장 프로 시저에서 여러 개의 개별 sql 쿼리

내가 문제가 오전 :

Dim strConn As String = "Data Source=myDataSource" 
    Dim Conn As New SqlConnection(strConn) 
    Dim Cmd As New SqlCommand("adminStats", Conn) 
    Cmd.CommandType = CommandType.StoredProcedure 
    Dim objDRL As SqlDataReader 
    Cmd.Parameters.Add(New SqlParameter("@campDate", "June 2014")) 
    Conn.Open() 
    objDRL = Cmd.ExecuteReader(System.Data.CommandBehavior.CloseConnection) 
    If objDRL.HasRows Then 
     While objDRL.Read() 
      Count1 = Convert.ToInt32(objDRL("Row_Count1")) 
      Count2 = Convert.ToInt32(objDRL("Row_Count2")) 
      Count3 = Convert.ToInt32(objDRL("Row_Count3")) 
      Count4 = Convert.ToInt32(objDRL("Row_Count4")) 
      Count5 = Convert.ToInt32(objDRL("Row_Count5")) 
      Count6 = Convert.ToInt32(objDRL("Row_Count6")) 
      Count7 = Convert.ToInt32(objDRL("Row_Count7")) 
      Count8 = Convert.ToInt32(objDRL("Row_Count8")) 
      Count9 = Convert.ToInt32(objDRL("Row_Count9")) 
      Count10 = Convert.ToInt32(objDRL("Row_Count10")) 
      Count11 = Convert.ToInt32(objDRL("Row_Count11")) 
      Count12 = Convert.ToInt32(objDRL("Row_Count12")) 
      Count13 = Convert.ToInt32(objDRL("Row_Count13")) 
      Count14 = Convert.ToInt32(objDRL("Row_Count14")) 
      Count15 = Convert.ToInt32(objDRL("Row_Count15")) 


     End While 
    Else 

    End If 

    link1.Text = Count1.ToString 
    link2.Text = Count2.ToString 
    link3.Text = Count3.ToString 
    link4.Text = Count4.ToString 
    Link5.Text = Count5.ToString 
    Link6.Text = Count6.ToString 
    Link7.Text = Count7.ToString 
    Link8.Text = Count8.ToString 
    Link9.Text = Count9.ToString 
    Link10.Text = Count10.ToString 
    Link11.Text = Count11.ToString 
    Link12.Text = Count12.ToString 
    Link13.Text = Count13.ToString 
    Link14.Text = Count14.ToString 
    Link15.Text = Count15.ToString 

    Conn.Close() 

저장 프로 시저 :

다음

Count2 = Convert.ToInt32(objDRL("Row_Count2").ToString). 

은 내 코드입니다

CREATE PROCEDURE adminStats 
    @campDate VARCHAR(20) 
AS 
BEGIN 
    SELECT COUNT(*) AS Row_Count1 FROM Customer 
    SELECT COUNT(*) AS Row_Count2 FROM campRegistration WHERE campDate = @campDate 
    SELECT COUNT(*) AS Row_Count3 FROM campRegistration WHERE paidFull = 'True' 

    SELECT COUNT(*) AS Row_Count4 FROM campRegistration WHERE shirtSize = 'S' 
    SELECT COUNT(*) AS Row_Count5 FROM campRegistration WHERE shirtSize = 'M' 
    SELECT COUNT(*) AS Row_Count6 FROM campRegistration WHERE shirtSize = 'L' 
    SELECT COUNT(*) AS Row_Count7 FROM campRegistration WHERE shirtSize = 'XL' 
    SELECT COUNT(*) AS Row_Count8 FROM campRegistration WHERE shirtSize = 'XXL' 

    SELECT COUNT(*) AS Row_Count9 FROM campRegistration WHERE Staff = 'True' 

    SELECT COUNT(*) AS Row_Count10 FROM campRegistration WHERE days = '1' 
    SELECT COUNT(*) AS Row_Count11 FROM campRegistration WHERE days = '2' 
    SELECT COUNT(*) AS Row_Count12 FROM campRegistration WHERE days = '3' 
    SELECT COUNT(*) AS Row_Count13 FROM campRegistration WHERE days = '12' 
    SELECT COUNT(*) AS Row_Count14 FROM campRegistration WHERE days = '23' 
    SELECT COUNT(*) AS Row_Count15 FROM campRegistration WHERE days = '123' 
END 
GO 

답변

8

이 질문에 대한 답변을 변경하십시오.

CREATE PROCEDURE adminStats 
    @campDate varChar(20) 
AS 
BEGIN 

    SELECT 
     (SELECT COUNT(1) FROM dbo.Customer) AS Row_Count1 
     , COUNT(CASE WHEN campDate = @campDate THEN 1 END) AS Row_Count2 
     , COUNT(CASE WHEN paidFull = 'True' THEN 1 END) AS Row_Count3 
     , COUNT(CASE WHEN shirtSize = 'S' THEN 1 END) AS Row_Count4 
     , COUNT(CASE WHEN shirtSize = 'M' THEN 1 END) AS Row_Count5 
     , COUNT(CASE WHEN shirtSize = 'L' THEN 1 END) AS Row_Count6 
     , COUNT(CASE WHEN shirtSize = 'XL' THEN 1 END) AS Row_Count7 
     , COUNT(CASE WHEN shirtSize = 'XXL' THEN 1 END) AS Row_Count8 
     , COUNT(CASE WHEN Staff = 'True' THEN 1 END) AS Row_Count9 
     , COUNT(CASE WHEN [days] = '1' THEN 1 END) AS Row_Count10 
     , COUNT(CASE WHEN [days] = '2' THEN 1 END) AS Row_Count11 
     , COUNT(CASE WHEN [days] = '3' THEN 1 END) AS Row_Count12 
     , COUNT(CASE WHEN [days] = '12' THEN 1 END) AS Row_Count13 
     , COUNT(CASE WHEN [days] = '23' THEN 1 END) AS Row_Count14 
     , COUNT(CASE WHEN [days] = '123' THEN 1 END) AS Row_Count15 
    FROM dbo.campRegistration 
    WHERE [days] IN ('1', '2', '3', '12', '23', '123') 
     OR shirtSize IN ('S', 'M', 'L', 'XL', 'XXL') 
     OR Staff = 'True' 
     OR paidFull = 'True' 
     OR campDate = @campDate 

END 

중복 검색에 대한 추가 정보는 topic입니다.

+1

나는 진정한 SQL 천재에 감사드립니다! – mlg74

+0

@ mlg74를 환영합니다. – Devart

+2

완전한 'WHERE' 절을 남겨 둡니다. 이 경우에는 더 빠를 것입니다. –

1

---------------------------------- C# 코드 ---------- ---------------------------------- INSERT

cmd = new SqlCommand("sp_UserLogin", con); 

    cmd.CommandType = CommandType.StoredProcedure; 

    try 
    { 
     cmd.Parameters.AddWithValue("@op", "Insert");    
     cmd.Parameters.AddWithValue("@UserName", userdetail.UserName); 
     cmd.Parameters.AddWithValue("@Password", userdetail.Password); 
     cmd.Parameters.AddWithValue("@ConfirPassword", userdetail.ConfirmPassword); 

     cmd.ExecuteNonQuery(); 
    } 

에 대한

SELECT

cmd = new SqlCommand("sp_UserLogin", con); 
    cmd.CommandType = CommandType.StoredProcedure; 
    SqlDataReader dr; 


    try 
    { 

     cmd.Parameters.AddWithValue("@op", "Select"); 
     dr = cmd.ExecuteReader(); 

    } 

-------------------------------- 저장 프로 시저에 대한 ------ -----------------------------

Create PROCEDURE [dbo].[sp_UserLogin] 
    -- Add the parameters for the stored procedure here 
    @op varchar(50)='g', 
    @UserName varchar(50)=null, 
    @Password varchar(100)=null, 
    @ConfirPassword varchar(100)=null 


AS 
BEGIN 
    -- SET NOCOUNT ON added to prevent extra result sets from 
    -- interfering with SELECT statements. 
    if @op='Insert' 
    BEGIN 
    -- Insert statements for procedure here 
    insert into UserLogin values (@UserName,@Password,@ConfirPassword) 
    End 

    if @op='Update' 
    BEGIN 
    -- Insert statements for procedure here 
    Select * from UserLogin 
    End 

END 
관련 문제