C#:将DataTable传递给存储过程:列顺序问题

9

我有一个存储过程,它接受一个名为SeasonTable用户定义表类型,看起来像这样:

SeasonTable

    [SeasonId] [int] NOT NULL,
    [SeasonName] [varchar](50) NOT NULL,
    [Month] [int] NULL, 
    [IsDeleted] [bit] NOT NULL

存储过程如下所示:

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

当我从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;
}

当我将上述表格作为参数从C#应用程序传递给SP时,它会抛出错误:

无法将“season1”转换为int。

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

非常感谢您提供任何帮助。

提前致谢。


你尝试过在dt中切换列顺序(SeasonId然后是SeasonName)吗? - yogi
@yogi,切换后它运行良好!!! - sandeep
@yogi 或许需要将其添加为答案:这样人们就知道已经得到了回答。 - whytheq
1个回答

12

尝试像这样切换列序列

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

2
实际上,“用户定义的表类型”仅接受按SQL中创建的格式设置的列,我们无法对它们进行调整,至少我不知道如何操作,因此最好保持正确的顺序并同步。 - yogi
2
我正在自动生成我的数据表,并且可以确认,正如在这里描述的那样,当存储过程获取表参数时,SQL Server会忽略表格列名和类型,并仅依赖它们的顺序。因此,你必须在某个地方对这些列进行排序。 - philw
@philw 我也有同样的经历,只是它不会忽略 类型。如果存在转换,它会尝试转换类型。名称是被忽略的。 - nawfal
我们有自动生成数据表的解决方案吗?索引肯定不会匹配,那么最好的方法是什么? - Prince
1
我们可以尝试使用以下代码进行动态表格创建: DataTable table = new DataTable();// 声明一个变量,用于生成带有其模式的结果集的所需表类型。 SqlDataAdapter adapter = new SqlDataAdapter("DECLARE @tableType dbo.UserDefindTableType SELECT * FROM @tableType", ConnectionString);// 设置 DataTable 模式以匹配 dbo.UserDefindTableType。 adapter.FillSchema(table, SchemaType.Source); - Prince
这不是一个很好的解决方案,应该由 ADO.NET 来处理。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接