Параметр таблицы значений - не удается найти тип данных dbo.typeQuestionSort

Здравствуйте, я сталкиваюсь с ошибкой, используя табличные параметры. Я нашел эту хорошую статью здесь ( 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 ответ

Кредит идет на комментарий Damien_The_Unbeliever.

Я не уверен, почему, но в статье есть пользователь, опускающий стол. Как заявил Дэмиен, это должен быть долгоживущий объект. Поэтому я воссоздал таблицу и удалил дроп. Теперь это работает чудесно.

Это:

        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();
        }
Другие вопросы по тегам