c#:将dataTable传递给存储过程:列顺序问题

san*_*eep 5 .net c# sql sql-server-2008

我有接受的存储过程的用户定义的表类型称为SeasonTable看起来像这样:

SeasonTable

    [SeasonId] [int] NOT NULL,
    [SeasonName] [varchar](50) NOT NULL,
    [Month] [int] NULL, 
    [IsDeleted] [bit] NOT NULL
Run Code Online (Sandbox Code Playgroud)

存储过程如下所示

CREATE PROCEDURE [dbo].[udpTest] 
(
    @STable dbo.SeasonTable READONLY
)   
AS
BEGIN
SELECT [SeasonName] as SeasonName,[SeasonId],[Month],[IsDeleted] 
    FROM @AdminBillingSeasonsTable
END
Run Code Online (Sandbox Code Playgroud)

当我从C#应用程序调用它时

private DataTable TestCreateDataTable()
{
            DataTable dt = new DataTable();

            dt.Columns.Add("SeasonName", typeof(string));
            dt.Columns.Add("SeasonId", typeof(int));                
            dt.Columns.Add("Month", typeof(int));
            dt.Columns.Add("IsDeleted", typeof(bool));
            dt.Rows.Add("season1",1, 4,  false);
            dt.Rows.Add("season2",2, 9, false);
            dt.Rows.Add("season3",3, 11,  false);
            return dt;
}
Run Code Online (Sandbox Code Playgroud)

当我使用上面的表作为来自C#app的SP的参数时,它会抛出错误:

无法将"season1"转换为int.

这是否意味着C#app中的列顺序应该与SQL中的列顺序相同?

对此有任何帮助表示高度赞赏.

提前致谢

yog*_*ogi 6

尝试切换像这样的列序列

 private DataTable TestCreateDataTable()
            {
                DataTable dt = new DataTable();

                dt.Columns.Add("SeasonId", typeof(int));     // seasonId and then
                dt.Columns.Add("SeasonName", typeof(string)); // seasonName
                dt.Columns.Add("Month", typeof(int));
                dt.Columns.Add("IsDeleted", typeof(bool));
                dt.Rows.Add("season1",1, 4,  false);
                dt.Rows.Add("season2",2, 9, false);
                dt.Rows.Add("season3",3, 11,  false);
                return dt;
            }
Run Code Online (Sandbox Code Playgroud)

  • 实际上`用户定义的表类型`除了它们已经在SQL中创建的那种格式的列,我们不能兼顾它们,至少我不知道如何做到这一点,所以最好保持序列正确和同步. (2认同)
  • 我为此自动生成数据表,并且我可以确认,如此处所述,SQL Server 会忽略表列名称和类型,并且仅在存储过程获取表参数时依赖它们的顺序。所以你必须在某个地方对这些列进行排序。 (2认同)