2

以下のc#コードは自明です。DataTableをテーブル値パラメーターとしてWebMatrix.Data.Database.Queryを介してSQLServer2008のストアドプロシージャに渡したいのですが、以下のc#コード(つまりappDatabase.Query)の最後の行で例外がスローされます

「テーブルタイプパラメータ「0」には有効なタイプ名が必要です。」

public JsonResult GetUserListForRoles(int[] RoleIds)
            {
                using (Database appDatabase = Database.Open("DefaultConnection"))
                {
                    DataTable roleIdsTable = new DataTable();
                    roleIdsTable.Columns.Add("RoleId", typeof(int));

            foreach(int role in RoleIds)
            {
                roleIdsTable.Rows.Add(role);
            }


            List<UserNameIdModel> userNameIdModelList = new List<UserNameIdModel>();


 var userNameIdList = appDatabase.Query("EXEC dbo.sp_GetUserListForRoles @roleIdsList=@0", roleIdsTable);

データベースで、TSQLのこのビットを使用してユーザー定義のテーブルタイプを作成しました

CREATE TYPE dbo.RoleIdsList AS TABLE (RoleId int)

正常に実行され、SQL ServerManagementStudioの[タイプ/ユーザー定義テーブルタイプ]の下に表示されます

これはストアドプロシージャです(@roleIdsListパラメーターに正しいタイプを割り当て、テーブル値パラメーターに必要なREADONLYとしてマークしたことを示すために、関連する部分のみを追加します)

ALTER PROCEDURE [dbo].[sp_GetUserListForRoles] 
    -- Add the parameters for the stored procedure here
    @roleIdsList dbo.RoleIdsList READONLY

かなりの検索を行いましたが、WebMatrix.Data.Databaseを処理するソリューションを見つけることができませんでした...私が見つけたすべてのソリューションには、SqlCommandとSqlParameterが含まれていました。アプリ全体でWebMatrix.Data.Databaseを使用しており、一貫性を保つ必要があります。

注意:私はWebMatrixIDEを使用していません。私は、MVC4アプリでのDBインタラクションのために、コントローラーでこの名前空間を使用しています。

これに関する専門知識を持っている誰かからのいくつかのガイダンスを熱心に待っています。よろしくお願いします。

4

1 に答える 1

1

ドキュメントによると、のTypeNameプロパティを使用して、テーブル値パラメーターのタイプ名を指定する必要がありますSqlParameter。ヘルパーは、値以外のパラメーターの側面を指定するためのWebMatrix.Data.DatabaseAPIを提供していません。ストアドプロシージャで使用するようには設計されていません。当初は、プレーンSQLでのみ使用するように設計されていました。したがって、このインスタンスではプレーンなADO.NETを使用する以外に選択肢はなく、SqlParameter自分の必要なプロパティを設定できます。

于 2013-02-18T08:02:51.620 に答える