Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用存储过程pivot中的参数填充gridview_C#_Asp.net_Sql Server_Gridview_Pivot - Fatal编程技术网

C# 如何使用存储过程pivot中的参数填充gridview

C# 如何使用存储过程pivot中的参数填充gridview,c#,asp.net,sql-server,gridview,pivot,C#,Asp.net,Sql Server,Gridview,Pivot,我是新来的,有人能帮我解决这个问题吗?我一直在尝试,但无法通过。我试图使用一个存储过程来填充gridview,该存储过程使用pivot参数,在我的where子句中,当我直接赋值时,它工作正常,但当我使用参数以便用户可以选择时,它会抛出一个错误。提前谢谢 我的程序: SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO ALTER PROCEDURE [dbo].[GetMarksheetByExamId] (@SubjectId INT) A

我是新来的,有人能帮我解决这个问题吗?我一直在尝试,但无法通过。我试图使用一个存储过程来填充gridview,该存储过程使用pivot参数,在我的where子句中,当我直接赋值时,它工作正常,但当我使用参数以便用户可以选择时,它会抛出一个错误。提前谢谢

我的程序:

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;
我的网格视图:

<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>

看起来变量赋值在动态查询中。您需要更改@Query分配,如下所示:

set @query = 'SELECT SubjectId, StudentName ' + @cols + ' from 
         (
            select SubjectId, StudentName, Subjects, TotalM 
            from SMarksheet  
            where SubjectId=@SubId


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

exec sp_executesql @query, @SubId = @SubjectId;

可以如上所述将subject作为int参数传递

看起来变量赋值在动态查询中。您需要更改@Query分配,如下所示:

set @query = 'SELECT SubjectId, StudentName ' + @cols + ' from 
         (
            select SubjectId, StudentName, Subjects, TotalM 
            from SMarksheet  
            where SubjectId=@SubId


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

exec sp_executesql @query, @SubId = @SubjectId;

您可以如上所述将subject作为int参数传递

嘿,谢谢,我试过了,但抛出了一个错误。转换nvarchar valueUpdated查询时转换失败,因为SubjectId为int,您可能需要在sp_executesql中将其作为参数传递,或者您需要在连接期间强制转换为VARCHAR,或者您可能需要CONCAT,我认为2008年不存在CONCAT。。。不确定Though仍在抛出错误System.Data.SqlClient.SqlException:过程需要类型为“ntext/nchar/nvarchar”的参数“@parameters”。我在这里修复了它,感谢您的努力:从SMarksheet,其中SubjectId='''+CAST(@SubjectId AS varchar(31))+''嘿,谢谢,我尝试了,但抛出了一个错误。转换nvarchar valueUpdated查询时转换失败,因为SubjectId为int,您可能需要在sp_executesql中将其作为参数传递,或者您需要在连接期间强制转换为VARCHAR,或者您可能需要CONCAT,我认为2008年不存在CONCAT。。。不确定Though仍在抛出错误System.Data.SqlClient.SqlException:过程需要类型为“ntext/nchar/nvarchar”的参数“@parameters”。我在这里修复了它,感谢您的努力:从SMarksheet开始,其中SubjectId=''+CAST(@SubjectId AS varchar(31))+''