【问题标题】:c# : passing dataTable to stored procedure: column order issuec#:将dataTable传递给存储过程:列顺序问题
【发布时间】:2012-06-23 07:10:42
【问题描述】:

我有一个存储过程,它接受一个名为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 ya 切换后效果很好。!!!
  • @yogi 可能需要将其添加为答案:以便人们知道它已被回答

标签: c# .net sql sql-server-2008


【解决方案1】:

尝试像这样切换列顺序

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

【讨论】:

  • 实际上User defined table type 只排除了在 SQL 中创建它们的格式的列,我们无法处理它们,至少我不知道该怎么做,所以最好保持顺序正确并同步。
  • 我正在为此自动生成我的数据表,并且我可以确认,如此处所述,SQL Server 忽略表列名称和类型,并且仅在存储过程获取时依赖它们的顺序表参数。所以你必须在某个地方订购这些列。
  • @philw 在这里有同样的经历,除了它不 ignore type。如果存在转换,它会尝试转换类型。名称被忽略是的。
  • 我们有自动生成数据表的解决方案吗?索引肯定不会匹配,那么最好的方法是什么?
  • 我们可以试试这段代码动态创建表 DataTable table = new DataTable(); // 声明所需表类型的变量以生成带有其模式的结果集。 SqlDataAdapter 适配器 = new SqlDataAdapter("DECLARE @tableType dbo.UserDefindTableType SELECT * FROM @tableType", ConnectionString); // 设置 DataTable 模式以匹配 dbo.UserDefindTableType 。 adapter.FillSchema(table, SchemaType.Source);
猜你喜欢
  • 2011-07-29
  • 1970-01-01
  • 1970-01-01
  • 2014-09-26
  • 2017-09-07
  • 1970-01-01
  • 2011-09-15
  • 1970-01-01
相关资源
最近更新 更多