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();
}
嘿感謝我試過,但拋出一個錯誤。轉換nvarchar值時轉換失敗 – Turing
更新後的查詢由於SubjectId是int,您可能需要將其作爲sp_executesql中的參數傳遞,或者需要在連接期間轉換爲VARCHAR,或者您可能需要CONCAT,我認爲Concat在2008年不存在。 ..不知道雖然 –
仍然拋出一個錯誤System.Data.SqlClient.SqlException:過程期望類型爲'ntext/nchar/nvarchar'的參數'@parameters'。 – Turing