C# c:将dataTable传递给存储过程:列顺序问题
我有一个存储过程,它接受一个用户定义的表类型,名为seasureTable,如下所示: 季节性 存储过程如下所示C# c:将dataTable传递给存储过程:列顺序问题,c#,.net,sql,sql-server-2008,C#,.net,Sql,Sql Server 2008,我有一个存储过程,它接受一个用户定义的表类型,名为seasureTable,如下所示: 季节性 存储过程如下所示 CREATE PROCEDURE [dbo].[udpTest] ( @STable dbo.SeasonTable READONLY ) AS BEGIN SELECT [SeasonName] as SeasonName,[SeasonId],[Month],[IsDeleted] FROM @AdminBillingSeasonsTable END
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 app中SP的参数时,它抛出错误:
无法将季节1转换为整数
这是否意味着C应用程序中的列顺序应该与SQL中的列顺序相同
非常感谢您对此提供的任何帮助
提前感谢试着像这样切换你的列顺序
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;
}
您是否尝试过在dt中切换您的列SequenceSequenceSequenceId然后是SequenceName???@yogi ya,切换后效果很好@yogi可能需要补充这一点作为答案:这样人们就知道答案是正确的。实际上,用户定义的表类型除了在SQL中创建的列以外,其他列的格式都是在SQL中创建的,我们不能处理它们,至少我不知道怎么做,因此,最好保持顺序正确并同步。我正在为此自动生成数据表,并且我可以确认,如本文所述,SQL Server会忽略表列名和类型,并且在存储过程获取表参数时仅依赖它们的顺序。因此,您必须在某个地方对这些列进行排序。@philw在这里有相同的经验,只是它不忽略类型。如果存在转换,它将尝试转换类型。名称被忽略是的。我们有自动生成数据表的解决方案吗?索引肯定不匹配,那么最好的方法是什么呢?我们可以试试下面的代码来创建动态表DataTable=newdatatable;//声明所需表类型的变量,以使用其架构生成结果集。SqlDataAdapter adapter=new SqlDataAdapterDECLARE@tableType dbo.UserDefinitTableType选择*FROM@tableType,ConnectionString;//将DataTable架构设置为与dbo.UserDefinitTableType匹配。adapter.FillSchematable,SchematType.Source;
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;
}