表值参数 - 无法找到数据类型dbo.typeQuestionSort

时间:2015-10-20 05:48:42

标签: c# sql-server table-valued-parameters

您好我使用表值参数遇到错误。我在这里发现了这篇不错的文章(Article),它解释了如何使用它,但是当我运行代码时,我收到了这个错误

  

“列,参数或变量@DT .:无法找到数据类型   dbo.typeQuestionSort“。

我不确定如何修复它。首先,我通过以下代码在我的数据库中创建了数据类型:

CREATE TYPE [dbo].[typeQuestionSort] AS TABLE(
[typeQuestionID] [int] NOT NULL,
[typeSortOrder] [int] NOT NULL
)
GO

这是成功创建的。然后在我的C#应用​​程序中,我有这个方法来更新我在数据库表中的应用程序中的一些问题的排序顺序:

    protected void UpdateSortOrder()
    {
        DataTable dt = new DataTable("Tim");
        dt.Columns.Add(new DataColumn("typeQuestionID", typeof(int)));
        dt.Columns.Add(new DataColumn("typeSortOrder", typeof(int)));

        DataRow r1 = dt.NewRow();
        r1["typeQuestionID"] = 1;
        r1["typeSortOrder"] = 0;
        dt.Rows.Add(r1);

        try
        {
            SqlConnection conn = new SqlConnection(ConnectionString);
            conn.Open();
            using (SqlCommand cmd = conn.CreateCommand())
            {
                SqlParameter p = new SqlParameter("@DT", SqlDbType.Structured);
                p.Value = dt;
                p.TypeName = "dbo.typeQuestionSort";
                cmd.Parameters.Add(p);
                cmd.CommandType = CommandType.Text;
                cmd.CommandText =
                    "UPDATE tblVQuestions"
                    + " SET [SortOrder] = typeSortOrder"
                    + " FROM @DT"
                    + " WHERE QuestionID = typeQuestionID AND PID = 12 AND SID = 12"
                    + " BEGIN TRY"
                    + " DROP TYPE dbo.typeQuestionSort"
                    + " END TRY"
                    + " BEGIN CATCH"
                    + " END CATCH";
                cmd.ExecuteNonQuery();
            }
        }
        catch
        {

        }

    }

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

归功于Damien_The_Unbeliever的评论。

我不知道为什么,但该文章让用户放弃了表格。达米恩说,它应该是一个长期存在的对象。所以我重新创建了表并删除了drop。现在它运作得非常好。

此:

        SqlConnection conn = new SqlConnection(ConnectionString);
        conn.Open();
        using (SqlCommand cmd = conn.CreateCommand())
        {
            SqlParameter p = new SqlParameter("@DT", SqlDbType.Structured);
            p.Value = dt;
            p.TypeName = "dbo.typeQuestionSort";
            cmd.Parameters.Add(p);
            cmd.CommandType = CommandType.Text;
            cmd.CommandText =
                "UPDATE tblVQuestions"
                + " SET [SortOrder] = typeSortOrder"
                + " FROM @DT"
                + " WHERE QuestionID = typeQuestionID AND PID = 12 AND SID = 12"
                + " BEGIN TRY"
                + " DROP TYPE dbo.typeQuestionSort"
                + " END TRY"
                + " BEGIN CATCH"
                + " END CATCH";
            cmd.ExecuteNonQuery();
        }

成为这个:

        SqlConnection conn = new SqlConnection(ConnectionString);
        conn.Open();
        using (SqlCommand cmd = conn.CreateCommand())
        {
            SqlParameter p = new SqlParameter("@DT", SqlDbType.Structured);
            p.Value = dt;
            p.TypeName = "dbo.typeQuestionSort";
            cmd.Parameters.Add(p);
            cmd.CommandType = CommandType.Text;
            cmd.CommandText =
                "UPDATE tblVQuestions"
                + " SET [SortOrder] = typeSortOrder"
                + " FROM @DT"
                + " WHERE QuestionID = typeQuestionID AND PID = 12 AND SID = 12";
            cmd.ExecuteNonQuery();
        }