2011-08-18 3 views
3

이전에 우연히 발견되어 일반적인 문제입니다. 관련 질문 중 하나는 GridView is empty입니다. 그러나 그것은 내 문제를 해결하지 못합니다.SQLDatasource에서 저장 프로 시저를 사용할 때 Gridview가 표시되지 않습니다.

내가 원하는 것은 '찾기'버튼을 클릭 할 때 텍스트 상자의 값에 따라 그리드 뷰를 업데이트하는 것입니다. 내 다른 페이지에서 나에게 도움이된다. 하지만 여기에 약간의 문제가 있습니다. 기본 매개 변수를 변경하지 않았습니다. 여기에 gridview가 있습니다

<asp:GridView ID="GridView1" runat="server" AllowPaging="True" 
    DataSourceID="SqlDataSource1" AutoGenerateColumns="False" 
    DataKeyNames="ID"> 
    <Columns> 
     <asp:BoundField DataField="ID" HeaderText="ID" InsertVisible="False" 
      ReadOnly="True" SortExpression="ID" /> 
     <asp:BoundField DataField="companyname" HeaderText="companyname" 
      SortExpression="companyname" /> 
     <asp:BoundField DataField="contactfirstname" HeaderText="contactfirstname" 
      SortExpression="firstname" /> 
     <asp:BoundField DataField="contactlastname" HeaderText="contactlastname" 
      SortExpression="lastname" /> 
     <asp:BoundField DataField="phonenumber" HeaderText="phonenumber" 
      SortExpression="phonenumber" /> 
     <asp:BoundField DataField="contactid" HeaderText="contactid" 
      SortExpression="contactno" /> 
    </Columns> 
</asp:GridView> 

내 "찾기"버튼 클릭 이벤트에서. 이 코드를 사용하고 있습니다.

protected void btnFind_Click(object sender, EventArgs e) 
{ 
    SqlDataSource1.DataBind(); /* Edit: I don't need this, I realized */ 
} 

하지만 아무 것도로드하지 않습니다. 전체 gridview dos 나타나지 않습니다. select 문을 사용하면 gridview가 결과와 함께 표시됩니다. gridview 내부에서 내 storedprocedure 테스트 한 및 그것을 작동하는 방식으로 작동합니다. 정확히 여기서 문제가 될지 모릅니다. 누구든지 그것을 발견 했습니까?

저장 프로 시저가 0 개의 결과를 반환하면 어딘가에 읽었을 것이라고 생각합니다. gridview는 표시되지 않습니다.

내 SqlDataSource와

<asp:SqlDataSource ID="SqlDataSource1" runat="server" 
    ConnectionString="<%$ ConnectionStrings:MyDBconn %>" 
    SelectCommand="usp_GetContactNo" SelectCommandType="StoredProcedure"> 
    <SelectParameters> 
     <asp:FormParameter DefaultValue="" FormField="txtCompanyName" 
      Name="companyname" Type="String" /> 
     <asp:FormParameter FormField="txtFirstName" Name="firstname" Type="String" /> 
     <asp:FormParameter FormField="txtLastName" Name="lastname" Type="String" /> 
     <asp:FormParameter FormField="txtPhone" Name="phone" Type="String" /> 
     <asp:FormParameter FormField="txtContactID" Name="contactNo" Type="String" /> 
    </SelectParameters> 
</asp:SqlDataSource> 

의 StoredProcedure은 다음과 같습니다. 참고 보안상의 이유로 위의 일부 이름을 변경했을 수도 있지만 아래는 원래 필드입니다.

ALTER PROCEDURE [dbo].[usp_GetContactIDs] 
    -- Add the parameters for the stored procedure here 
    @companyname varchar(255) = NULL, 
    @firstname varchar(255) = NULL, 
    @lastname varchar(255) = NULL, 
    @phone varchar(10) = NULL, 
    @contactid varchar(15) = NULL 
AS 
BEGIN 
    -- SET NOCOUNT ON added to prevent extra result sets from 
    -- interfering with SELECT statements. 
    SET NOCOUNT ON; 
    Declare @sql varchar(1000); 



    set @sql = 'select ID, companyname,contactfirstname,contactlastname,phonenumber, contactid from oet WHERE ID is not null' 

    if(@companyname is not null) 
     set @sql = @sql + ' AND companyname = '''+ @companyname + ''''; 

    if(@firstname is not null) 
     set @sql = @sql + ' AND contactfirstname = '''+ @firstname + ''''; 

    if(@lastname is not null) 
     set @sql = @sql + ' AND contactlastname = '''+ @lastname + ''''; 

    if(@phone is not null) 
     set @sql = @sql + ' AND phonenumber = '''+ @phone + ''''; 

    if(@contactid is not null) 
     set @sql = @sql + ' AND contactid = '''+ @contactid + ''''; 


    exec (@sql) 


END 
+0

? 그게 찾기 버튼이하는 유일한 것입니까? – Tim

+0

예, 그리드보기를 업데이트해야합니다. –

+0

수정 : 당신이 맞습니다'DataBind()'는 필요하지 않습니다. –

답변

2

해결하기 위해 하루 이상 걸렸습니다. 마스터 페이지에 문제가있었습니다. 페이지에서 마스터 페이지를 제거했을 때 모든 것이 잘 작동했습니다. 무슨 일이 있었는지 txtFirstName 컨트롤이 페이지에 있었지만 마스터 페이지를 사용했기 때문에 발견되지 않았습니다. 결과적으로 매번 null 값이 전달되었습니다. 디버깅을 매우 까다롭게 만들었던 어떤 오류도 발생하지 않았습니다.

다른 속성이 필요했습니다. 중요한 것은 다음과 같습니다.

SQL DataSource, 구성 데이터 소스, 매개 변수 섹션에서 매개 변수를 선택하고 'Show advance options', ConvertEmptyStringToNull을 클릭하십시오. 이 값을 false로 변경해야 할 수도 있습니다.

SQLDatasourc -> property는이 -> CancelSelectOnNullParamter = 나는 CancelSelectOnNullParameter [의 SqlDataSource]에서거짓 설정하여 해결 마지막에, 난 그냥 비슷한 문제를 경험 거짓

+0

C#에서 FindControl을 사용하는 경우 같은 페이지에 ID가있는 텍스트 상자 이름을 찾는 데 문제가 없어야하므로 문제가 있다고 생각하지 않습니다. – Jake

+0

C# 암호. 모든 것이 ASP입니다. findcontrol 문제를 해결하기 위해 $ 연산자를 찾고 있습니다. –

1

로 변경 -> [속성]을보기 또는 코드로 : 그것은 기본적으로 true로 설정이야로 저장 프로 시저가 null 매개 변수를 허용하는 경우 <asp:SqlDataSource ID="..." runat="server" ... CancelSelectOnNullParameter="False">

이 쉽게 놓친 왜 당신은`SqlDataSource`에`데이터 바인딩()`호출

+0

이것은 생명의 은인이었습니다. 진지하게 MSFT에서이 사실에 대한 불이행을 "사실"이라고 생각한 사람은 누구입니까? – contactmatt

관련 문제