2013-02-26 2 views
2

내 SQL 프로 시저가 완벽하게 작동합니다. 하지만 클래스에서 호출하면 데이터를 반환하지 않습니다. 그리고 나는이 오류가 발생합니다. Column 'Territory_Name' does not belong to table . 코드를 디버깅하고 모든 매개 변수가 올바르게 전달되지만 프로 시저가 데이터를 반환하지 않는 것을 발견했습니다. 누구든지 아이디어가 있다면 저를 도와주십시오. enter image description hereSQL 서버 프로 시저가 데이터를 반환하지 않습니다

내 저장 프로 시저

enter image description here 은 다음과 같습니다 DataProvider.SelectStoreProcedure의

public static List<CRM_Doctor_Request> FilterCRM_Doctor_Request_Details(string WeekList, string MonthList, string YearList, string QuaterList, string PriorityList, string Division_IdList, string CRM_Service_Type_IdList, string CRM_Notation_IdList, string CRM_State_IdList, string Service_State_IdList, float Estimated_Amount) 
     { 
      string proc = "SPFilterCRMRequests"; 

      List<SqlParameter> arrParam = new List<SqlParameter>(); 
      SqlParameter pWeekList = new SqlParameter("@WeekList", SqlDbType.VarChar); 
      SqlParameter pMonthList = new SqlParameter("@MonthList", SqlDbType.VarChar); 
      SqlParameter pYearList = new SqlParameter("@YearList", SqlDbType.VarChar); 
      SqlParameter pQuaterList = new SqlParameter("@QuaterList", SqlDbType.VarChar); 
      SqlParameter pPriorityList = new SqlParameter("@PriorityList", SqlDbType.VarChar); 
      SqlParameter pDivision_IdList = new SqlParameter("@Division_IdList", SqlDbType.VarChar); 
      SqlParameter pCRM_Service_Type_IdList = new SqlParameter("@CRM_Service_Type_IdList", SqlDbType.VarChar); 
      SqlParameter pCRM_Notation_IdList = new SqlParameter("@CRM_Notation_IdList", SqlDbType.VarChar); 
      SqlParameter pCRM_State_IdList = new SqlParameter("@CRM_State_IdList", SqlDbType.VarChar); 
      SqlParameter pService_State_IdList = new SqlParameter("@Service_State_IdList", SqlDbType.VarChar); 
      SqlParameter pEstimated_Amount = new SqlParameter("@Estimated_Amount", SqlDbType.Float); 

      pWeekList.Value = WeekList; 
      pMonthList.Value = MonthList; 
      pYearList.Value = YearList; 
      pQuaterList.Value = QuaterList; 
      pPriorityList.Value = PriorityList; 
      pDivision_IdList.Value = Division_IdList; 
      pCRM_Service_Type_IdList.Value = CRM_Service_Type_IdList; 
      pCRM_Notation_IdList.Value = CRM_Notation_IdList; 
      pCRM_State_IdList.Value = CRM_State_IdList; 
      pService_State_IdList.Value = Service_State_IdList; 
      pEstimated_Amount.Value = Estimated_Amount; 

      arrParam.Add(pWeekList); 
      arrParam.Add(pMonthList); 
      arrParam.Add(pYearList); 
      arrParam.Add(pQuaterList); 
      arrParam.Add(pPriorityList); 
      arrParam.Add(pDivision_IdList); 
      arrParam.Add(pCRM_Service_Type_IdList); 
      arrParam.Add(pCRM_Notation_IdList); 
      arrParam.Add(pCRM_State_IdList); 
      arrParam.Add(pService_State_IdList); 
      arrParam.Add(pEstimated_Amount); 

      DataTable table = DataProvider.SelectStoreProcedure(proc, arrParam); 

      List<CRM_Doctor_Request> ListCRM_Doctor_Request = new List<CRM_Doctor_Request>(); 

      foreach (DataRow row in table.Rows) 
      { 
       CRM_Doctor_Request CRM_Doctor_RequestObj = new CRM_Doctor_Request(); 

       CRM_Doctor_RequestObj.Territory_Name = Convert.ToString(row["Territory_Name"]); 
       CRM_Doctor_RequestObj.Request_For_Id = Convert.ToString(row["Request_For_Id"]); 
       CRM_Doctor_RequestObj.Request_For_Name = Convert.ToString(row["Request_For_Name"]); 
       CRM_Doctor_RequestObj.Requester_Name = Convert.ToString(row["Requester_Name"]); 
       CRM_Doctor_RequestObj.Division_Name = Convert.ToString(row["Division_Name"]); 
       CRM_Doctor_RequestObj.Suggester_Name = Convert.ToString(row["Suggester_Name"]); 
       CRM_Doctor_RequestObj.Id = Convert.ToInt32(row["Id"]);  
       CRM_Doctor_RequestObj.Compute_Priority = Convert.ToString(row["Compute_Priority"]); 
       CRM_Doctor_RequestObj.CRM_Notation_Name = Convert.ToString(row["CRM_Notation_Name"]); 
       CRM_Doctor_RequestObj.CRM_Service_Type_Name = Convert.ToString(row["CRM_Service_Type_Name"]);      
       CRM_Doctor_RequestObj.Compute_CRM_State = Convert.ToString(row["Compute_CRM_State"]); 
       CRM_Doctor_RequestObj.Compute_Service_State = Convert.ToString(row["Compute_Service_State"]); 

       ListCRM_Doctor_Request.Add(CRM_Doctor_RequestObj); 
      } 
      return ListCRM_Doctor_Request; 
     } 

코드 :

class DataProvider 
    { 
     public static string connectionString = ConfigurationManager.ConnectionStrings["connect_str"].ConnectionString; 

     public static DataTable SelectStoreProcedure(string ProcName, List<SqlParameter> ParaArr) 
     { 
       DataTable data = new DataTable(); 
       SqlConnection cn = new SqlConnection(connectionString); 
       cn.Open(); 
       SqlCommand cmd = new SqlCommand(ProcName, cn); 
       foreach (SqlParameter para in ParaArr) 
       { 
        cmd.Parameters.Add(para); 
       } 
       cmd.CommandType = CommandType.StoredProcedure; 

       SqlDataAdapter da = new SqlDataAdapter(cmd); 

       da.Fill(data); 
       cn.Close(); 
       return data; 
     } 
    } 
012

ALTER PROCEDURE dbo.SPFilterCRMRequests 
(
    /* for Time Span */ 
    @WeekList varchar(50) = null, 
    @MonthList varchar(50) = null, 
    @YearList varchar(50) = null, 
    @QuaterList varchar(50) = null, 
    /* for other specific criteria */ 
    @PriorityList varchar(50) = null, 
    @Division_IdList varchar(50) = null, 
    @CRM_Service_Type_IdList varchar(50) = null, 
    @CRM_Notation_IdList varchar(50) = null, 
    @CRM_State_IdList varchar(50) = null, 
    @Service_State_IdList varchar(50) = null, 
    @Estimated_Amount float 

    /* for Designation 
    @Requester varchar(20), 
    @Suggester varchar(20) */ 
) 
AS 
    SET NOCOUNT ON 
    /*Declare @date3 DateTime = CONVERT(date,'2/8/2013 5:17:00 PM')*/ 
    DECLARE @sql nvarchar(4000) 

    SELECT @sql='SELECT 
    CRMDR.Id as Id, 
    LEFT(GEOTREE.GEONAME,15) as Territory_Name, 
    CRMDR.Request_For_Id as Request_For_Id, 
    DRMST.DRNAME as Request_For_Name, 
    USERSTBM.USERNAME as Requester_Name, 
    Division.Div_Name as Division_Name, 
    USERSABM.USERNAME as Suggester_Name, 
    CRMDR.Estimated_Amount as Estimated_Amount, 
    CRMDR.Actual_Amount as Actual_Amount, 
    CRMDR.Compute_Priority as Compute_Priority, 
    CRMNotation.Notation_Name as CRM_Notation_Name, 
    CRMServiceType.ServiceName as CRM_Service_Type_Name, 
    CRMDR.Deadline as Deadline, 
    CRMDR.Executed_Date as Executed_Date, 
    CRMDR.Date_Created as Date_Created, 
    CRMDR.Compute_CRM_State as Compute_CRM_State, 
    CRMDR.Compute_Service_State as Compute_Service_State 

    From [CRM].[dbo].[CRM_Doctor_Request] AS CRMDR 

    JOIN [ASES].[dbo].[USERS] AS USERSTBM 
    ON CRMDR.Requester COLLATE SQL_Latin1_General_CP1_CI_AS = USERSTBM.RID COLLATE SQL_Latin1_General_CP1_CI_AS 

    JOIN [ASES].[dbo].[USERS] AS USERSABM 
    ON CRMDR.Suggester COLLATE SQL_Latin1_General_CP1_CI_AS = USERSABM.RID COLLATE SQL_Latin1_General_CP1_CI_AS 

    JOIN [ASES].[dbo].[GEOTREE] AS GEOTREE 
    ON CRMDR.Territory COLLATE SQL_Latin1_General_CP1_CI_AS = GEOTREE.RID COLLATE SQL_Latin1_General_CP1_CI_AS 

    JOIN [ASES].[dbo].[DRMST] AS DRMST 
    ON CRMDR.Request_For_Id COLLATE SQL_Latin1_General_CP1_CI_AS = DRMST.MDLNO COLLATE SQL_Latin1_General_CP1_CI_AS 

    JOIN [CRM].[dbo].[CRM_Request_For_Type] AS CRMReqForType 
    ON CRMDR.CRM_Request_For_Type_Id = CRMReqForType.Id 

    JOIN [CRM].[dbo].[CRM_Notation] AS CRMNotation 
    ON CRMDR.CRM_Notation_Id = CRMNotation.Id 

    JOIN [CRM].[dbo].[CRM_Service_Type] AS CRMServiceType 
    ON CRMDR.CRM_Service_Type_Id = CRMServiceType.Id 

    JOIN [CRM].[dbo].[Division] AS Division 
    ON CRMDR.Division_Id = Division.Id 

    WHERE CRMDR.Is_Deleted=0 ' 
    If (@MonthList) IS NOT NULL 
     SELECT @[email protected] + ' AND MONTH(CRMDR.Date_Created) in (' + @MonthList + ') ' 
    If (@YearList) IS NOT NULL 
     SELECT @[email protected] + ' AND (CRMDR.Date_Created) in (' + @YearList + ') ' 
    If (@WeekList) IS NOT NULL 
BEGIN 
    DECLARE @DateCondition varchar(1000) 
    DECLARE @ColumnName varchar(50) = 'CRMDR.Date_Created' 
    -- pass the columnname on which condition needs to be aaplied 
    EXEC dbo.SPWhereconditionForMultipleWeeks @WeekList, @ColumnName, @DateCondition OUTPUT 
    SELECT @DateCondition 
    -- if (LEN(@DateCondition) > 0) 
     SELECT @[email protected] + ' AND '+ SUBSTRING(@DateCondition, 1, LEN(@DateCondition)-3) 
END 
If (@QuaterList) IS NOT NULL 
BEGIN 
    DECLARE @MonthsList varchar(1000) 
    EXEC dbo.SPGetMonthsListforMultipleQuaters @QuaterList, @MonthsList OUTPUT 
    SELECT @MonthsList 
    -- print @MonthsList 
    -- if (LEN(@MonthsList) > 0) 
    SELECT @[email protected] + ' AND MONTH(CRMDR.Date_Created) in (' 
    + SUBSTRING(@MonthsList, 1, LEN(@MonthsList)-1) +')' 
END 
    If (@PriorityList) IS NOT NULL 
     SELECT @[email protected] + ' AND Priority in (' + @PriorityList + ') ' 
    If (@Division_IdList) IS NOT NULL 
     SELECT @[email protected] + ' AND Division_Id in (' + @Division_IdList + ') ' 
    If (@CRM_Service_Type_IdList) IS NOT NULL 
     SELECT @[email protected] + ' AND CRM_Service_Type_Id in (' + @CRM_Service_Type_IdList + ') ' 
    If (@CRM_Notation_IdList) IS NOT NULL 
     SELECT @[email protected] + ' AND CRM_Notation_Id in (' + @CRM_Notation_IdList + ') ' 
    If (@Estimated_Amount) IS NOT NULL 
     SELECT @[email protected] + ' AND Estimated_Amount > (@Estimated_Amount) ' 
    If (@CRM_State_IdList) IS NOT NULL 
     SELECT @[email protected] + ' AND CRM_State_Id in (' + @CRM_State_IdList + ') ' 
    If (@Service_State_IdList) IS NOT NULL 
     SELECT @[email protected] + ' AND Service_State_Id in (' + @Service_State_IdList + ') ' 

    SELECT @[email protected] + ' ORDER BY CRMDR.Id DESC ' 
    --print @sql 

    EXEC sp_executesql @sql, N' @MonthList varchar(50), 
    @YearList varchar(50), 
    @QuaterList varchar(50), 
    @PriorityList varchar(50), 
    @Division_IdList varchar(50), 
    @CRM_Service_Type_IdList varchar(50), 
    @CRM_Notation_IdList varchar(50), 
    @Estimated_Amount float, 
    @CRM_State_IdList varchar(50), 
    @Service_State_IdList varchar(50) ', 
     @MonthList, 
     @YearList, 
     @QuaterList, 
     @PriorityList, 
     @Division_IdList, 
     @CRM_Service_Type_IdList, 
     @CRM_Notation_IdList, 
     @Estimated_Amount, 
     @CRM_State_IdList, 
     @Service_State_IdList 
RETURN 

내 클래스 프로 시저 호출 3,516,

+0

foreach 루프를 입력하면 일부 행이 반환되는 것으로 나타 났지만 코드에 바로 잘못된 내용이 표시되지 않습니다. 서버에 전달되는 내용을 정확하게 확인하기 위해 프로파일 러를 검사하여이를 실행하고 결과가 무엇인지 확인하고자 할 것입니다. 스키마가 SqlCommand에 정의되어 있지 않기 때문에 (예 :'dbo 대신에'MyUserName.SPFilterCRMRequests '를 호출하는 등) 잘못된 SP를 호출하는 것만큼이나 사소한 일일 수 있습니다.SPFilterCRMRequests' – GarethD

+0

'SPFilterCRMRequests'가 DataTable의 서브 프로 시저'SPWhereconditionForMultipleWeeks'에 의해 반환 된 값을 반환한다는 것을 알았습니다. – blue

+0

어떤 경우에는'DataSet'을 채워야하고 DataSet의 마지막 테이블에는 찾고있는 데이터가 들어 있습니다. – GarethD

답변

0

귀하의 문제는 당신이 DataTable table = data.Tables[0]-DataSet data = new DataSet();

DataTable table = data

변화 DataTable data = new DataTable(); (정의 된 스키마) 테이블을 채우기 위해 노력하고 있다는 것입니다;

및 스키마가 자동으로 생성되며 모든 것이 작동합니다.

** 수정 **

테스트 응용 프로그램을 작성

이 저장 프로 시저

CREATE PROCEDURE [dbo].[TestProc1] 
AS 
BEGIN 
    SET NOCOUNT ON; 

    DECLARE @sql NVARCHAR(MAX) = 'SELECT 1 x UNION ALL SELECT 2' 

    EXEC sp_executesql @sql 
END 

정의 ...이 설정에서 쿼리를 구축 시도 이 코드가 포함 된

class Program 
{ 
    public const string ConnectionString = @"???"; 

    static void Main(string[] args) 
    { 
     var t = Execute("TestProc1"); 

     Trace.Assert(t.Rows.Count == 2); 
    } 

    private static DataTable Execute(string sql) 
    { 
     using (var connection = new SqlConnection(ConnectionString)) 
     { 
      connection.Open(); 

      using (var command = new SqlCommand(sql, connection)) 
      { 
       command.CommandType = CommandType.StoredProcedure; 
       var da = new SqlDataAdapter(command); 

       var ds = new DataSet(); 
       da.Fill(ds); 

       return ds.Tables[0]; 
      } 
     } 
    } 
} 

여기서 연결 문자열은 연결 문자열입니다.

정상적으로 작동하며 작동하는 것과 기능적으로 동일합니다. 일단 당신이 그 일을하면 특정 상황에 맞게 구축하십시오.

+0

그것은 작동하지 않았다 .... – blue

1

이것은 너무 지저분 해 보입니다. 둘 이상의 쿼리를 실행하고 있으므로 데이터를 DataSettake the 0th Table으로 채우거나 Datatable에 올바른 쿼리의 결과를 채워야한다고 생각합니다.

또한 Parameters.AddWithValue()으로 코드를 반으로 줄이고 using을 연결 개체와 함께 사용할 수 있습니다.

//Your method 
DataSet data = new DataSet(); //Note Dataset here **** 
string connectionString = ConfigurationManager.ConnectionStrings["connect_str"].ConnectionString; 

using(SqlConnection cn = new SqlConnection(connectionString)) 
{ 
    string proc = "SPFilterCRMRequests"; 
    SqlCommand cmd = new SqlCommand(proc, cn); 
    cmd.CommandType = CommandType.StoredProcedure; 

    cmd.Parameters.AddWithValue("@WeekList", WeekList); 
    cmd.Parameters.AddWithValue("@MonthList", pMonthList); 
    cmd.Parameters.AddWithValue("@YearList", pYearList); 
    cmd.Parameters.AddWithValue("@QuaterList", pQuaterList); 
    cmd.Parameters.AddWithValue("@PriorityList", pPriorityList); 
    cmd.Parameters.AddWithValue("@Division_IdList", pDivision_IdList); 
    cmd.Parameters.AddWithValue("@CRM_Service_Type_IdList", pCRM_Service_Type_IdList); 
    cmd.Parameters.AddWithValue("@CRM_Notation_IdList", pCRM_Notation_IdList); 
    cmd.Parameters.AddWithValue("@CRM_State_IdList", pCRM_State_IdList); 
    cmd.Parameters.AddWithValue("@Service_State_IdList", pService_State_IdList); 
    cmd.Parameters.AddWithValue("@Estimated_Amount", pEstimated_Amount); 


    SqlDataAdapter da = new SqlDataAdapter(cmd); 
    cn.Open(); 
    da.Fill(data); 
} 

List<CRM_Doctor_Request> ListCRM_Doctor_Request = 
         new List<CRM_Doctor_Request>(); 

foreach (DataRow row in data.Tables[0].Rows) //**** Note 0th table here ****** 
{ 
//rest of the code 
} 
//... 
+0

그것은 일하지 않았다 .... – blue

관련 문제