sql table udt,vs 2008,csharp

时间:2009-06-15 20:49:29

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

我正在尝试从Visual Studio 2008运行SQL存储过程,该过程采用表值UDT参数作为输入。我在Visual Studio 2008中添加了此参数,但是当我运行此程序时,它会收到“ArgumentException - 指定的类型未在目标服务器上注册”。 所以我搜索了这个问题并认为我需要在Visual Studio 2008中创建一个与SQL Server 2008中此表类型的属性相匹配的新类。但是我在Internet上找不到涉及 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#代码中的代码片段是:

    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”;'对于上面的代码片段,但这返回了相同的错误。顺便说一句,“myStringArray”本质上是一个表。这是一系列的字符串。例如myStringArray [0] =“Hello | Bob | How | Do”,myStringArray [1] =“I | Am | Fine | And”等。

1 个答案:

答案 0 :(得分:2)

基本上,你的设置几乎正确 - 中途: - )

查看TVP的那些介绍性文章 - 表值参数 - 这是我试图使用的 GUESS ,对吗?

基本上你需要做的是:

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

这有帮助吗?我强烈推荐SQL团队的文章 - 非常有用!

马克