【问题标题】:sql table udt, vs 2008, csharpsql 表 udt,vs 2008,csharp
【发布时间】:2009-06-15 20:49:29
【问题描述】:

我正在尝试从 Visual Studio 2008 运行 SQL 存储过程,该过程将表值 UDT 参数作为输入。我在 Visual Studio 2008 中添加了这个参数,但是当我运行这个程序时,它得到一个“ArgumentException - 指定类型未在目标服务器上注册”。 所以我用谷歌搜索了这个问题,并认为我需要在 Visual Studio 2008 中创建一个新类,以匹配 SQL Server 2008 中此表类型的属性。但我在互联网上找不到任何涉及 table 的示例UDT 的。我尝试了所有标量 UDT 示例,但我不确定如何修改这些示例以使其基于表。
我还阅读了我可能需要创建一个程序集,尽管我不知道这是否仅用于将类型导入 SQL Server 2008 或者它是否也可用于将类型导入 Visual Studio。顺便说一句,我没有看到 VS 2008 中的服务器资源管理器列出的任何类型,尽管我确实看到了数据库及其 SP。我尝试刷新数据库,但类型仍然没有显示。 我需要做的很简单。我有一个像这样的表 UDT:

CREATE TYPE [dbo].[parseInputFile] AS TABLE(
[NumCols] [int] IDENTITY(1,1) NOT NULL,
[strRow] [varchar](500) NOT NULL,
PRIMARY KEY CLUSTERED 

我的 C# 代码中的代码 sn-p 是:

    public static int AppendData(string[] myStringArray)
    {
            SqlConnection conn = new SqlConnection(connString);
            SqlCommand cmd = conn.CreateCommand();
            cmd.CommandText = "dbo.uspAppendTableFromInput";
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Connection = conn;
            SqlParameter param = cmd.Parameters.Add("@InputFileParam", SqlDbType.Udt);
            param.UdtTypeName = "AdventureWorks.dbo.parseInputFile";
            param.Value = myStringArray;
            conn.Open();
            RowsAffected = cmd.ExecuteNonQuery();

RowsAffected 显示运行此命令后受影响的零行。我错过了什么?你能把我指向一个展示这个简单例子的网站吗?还是给我小费?我也试过'param.UdtTypeName="parseInputFile";'对于上面的 sn-p,但这返回了相同的错误。顺便说一句,“myStringArray”本质上是一个表。它是一系列字符串。例如myStringArray[0] = "Hello|Bob|How|Do", myStringArray[1] = "I|Am|Fine|And" 等等。

【问题讨论】:

  • 你的存储过程是什么样的?主要是你声明的参数列表
  • 你到底想完成什么?用用户定义的表类型中的一组参数调用存储过程?或者调用存储过程以从中获取这样的表 RETURNED?不太清楚...

标签: sql sql-server-2008 table-valued-parameters


【解决方案1】:

基本上,您的设置几乎正确 - 进行到一半:-)

查看那些关于 TVP 的介绍性文章 - 表值参数 - 我 GUESS 您正在尝试使用它,对吗?

基本上你需要做的是:

  • 创建用户定义的表类型 - 你已经拥有了
  • 创建一个将这些表类型作为 READONLY 输入参数的存储过程(不确定您是否知道 - 还没有看到您的代码)
  • 从 .NET 调用;您需要创建一个 DataTable 实例并重新创建相同的结构(在字段及其类型方面 - 显示在 SQL 团队文章中)
  • 填写该数据表
  • 在 .NET 中创建一个 SqlConnection 和 SqlCommand(CommandType = Stored Proc),将表类型参数定义为 .NET 中的“SqlDbType.Structured”类型,并将其值设置为上面创建的 DataTable
  • 从 .NET 调用该存储过程(打包在 SqlCommand 中)

这有帮助吗?我强烈推荐 SQL Team 文章 - 内容丰富!

马克

【讨论】:

  • 感谢您的提示,马克!我刚刚发布了关于同样问题的另一个问题。我在这个网站上遇到了一些问题,所以我将它作为一个不同的问题发布。你能看看另一个问题吗?应该很容易找到,因为我现在只在这个网站上发布了两个问题。谢谢。
猜你喜欢
  • 2010-10-13
  • 2010-12-27
  • 2011-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-18
相关资源
最近更新 更多