2017-06-01 74 views
1

我是新來的,任何人都可以幫我解決這個問題,一直在嘗試很多,但無法通過。我試圖填充gridview使用存儲過程與參數使用樞軸,在我的where子句中,當我直接分配值,然後它工作正常,但是當我使用參數,以便用戶可以有選擇,然後它會引發錯誤。提前致謝。如何使用存儲過程中的參數填充gridview

我的方法:

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 

ALTER PROCEDURE [dbo].[GetMarksheetByExamId] 
    (@SubjectId INT) 
AS 
    DECLARE @cols AS NVARCHAR(MAX), 
      @query AS NVARCHAR(MAX) 

    SELECT @cols = STUFF((SELECT ',' + QUOTENAME(Subjects) 
          FROM SMarksheet 
          GROUP BY Subjects 
          -- ORDER BY Id 
          FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '') 

    SET @query = 'SELECT SubjectId, StudentName ' + @cols + ' FROM 
      (SELECT SubjectId, StudentName, Subjects, TotalM 
       FROM SMarksheet 
       WHERE SubjectId = @SubjectId) x 
      PIVOT 
       (MAX(TotalM) 
        FOR Subjects IN (' + @cols +')) p ' 

    EXEC sp_executesql @query; 

我的GridView:

<table border="1" width="60%" align="center"> 
    <tr> 
     <td align="center"> 
      <asp:TextBox ID="txt_Id" runat="server" AutoPostBack="true">1</asp:TextBox> 
      <br /> 
      <asp:Button ID="Button1" runat="server" Text="Submit" OnClick="Button1_Click" /> 
     </td> 
    </tr> 
    <tr> 
     <td> 
      <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="true"> 
      </asp:GridView> 
     </td> 
    </tr> 
</table> 

後面的代碼:

protected void Button1_Click(object sender, EventArgs e) 
{ 
    DataSet ds = new DataSet(); 

    using (SqlConnection con = new SqlConnection(connStr)) 
    { 
     using (SqlCommand command = new SqlCommand()) 
     { 
      command.CommandType = CommandType.StoredProcedure; 
      command.CommandText = "GetMarksheetByExamId"; 
      command.Connection = con; 

      // command.Parameters.AddWithValue("@SubjectId", b); 
      command.Parameters.Add(new SqlParameter("@SubjectId", txt_Id.Text)); 

      con.Open(); 

      SqlDataAdapter a = new SqlDataAdapter(command); 
      a.Fill(ds); 
     } 
    } 

    GridView1.DataSource = ds; 
    GridView1.DataBind(); 
} 

回答

0

看起來像你的變量賦值爲動態查詢裏面。你需要如下改變@Query分配:

set @query = 'SELECT SubjectId, StudentName ' + @cols + ' from 
     (
      select SubjectId, StudentName, Subjects, TotalM 
      from SMarksheet 
      where [email protected] 


     ) x 
     pivot 
     (
      max(TotalM) 
      for Subjects in (' + @cols +') 
     ) p ' 

exec sp_executesql @query, @SubId = @SubjectId; 

你可以通過接受以int參數如上

+0

嘿感謝我試過,但拋出一個錯誤。轉換nvarchar值時轉換失敗 – Turing

+0

更新後的查詢由於SubjectId是int,您可能需要將其作爲sp_executesql中的參數傳遞,或者需要在連接期間轉換爲VARCHAR,或者您可能需要CONCAT,我認爲Concat在2008年不存在。 ..不知道雖然 –

+0

仍然拋出一個錯誤System.Data.SqlClient.SqlException:過程期望類型爲'ntext/nchar/nvarchar'的參數'@parameters'。 – Turing

相關問題