为存储过程设置参数时,是否可以在新SqlParameter的构造函数中设置TypeName

本文关键字:设置 SqlParameter TypeName 构造函数 参数 存储过程 是否 | 更新日期: 2023-09-27 18:25:45

我正在使用以下代码为对存储过程的调用设置参数:

        List<SqlParameter> parameterList = new List<SqlParameter>();
        parameterList.Add(new SqlParameter("@Title", adminTest.Title));
        parameterList.Add(new SqlParameter("@Text", adminTest.Text));
        var questionsList = new SqlParameter("@Questions", questions);
        questionsList.TypeName = "dbo.QuestionList";
        parameterList.Add(questionsList);

代码片段是有效的,但我想知道的是,是否有人找到了在新的SqlParameter构造函数中设置TypeName的方法?我试着看了一下文档,但唯一能找到的就是在之后添加类型名。

为存储过程设置参数时,是否可以在新SqlParameter的构造函数中设置TypeName

您可以使用初始化程序来实现这一点。下面的示例指定了强类型参数和变量值的最大长度,从SQL性能的角度来看,这是一个很好的做法。

    List<SqlParameter> parameterList = new List<SqlParameter>()
        {
            new SqlParameter("@Title", SqlDbType.VarChar) {Size = 30, Value = adminTest.Title},
            new SqlParameter("@Text", SqlDbType.VarChar) {Size = 30, Value = adminTest.Text},
            new SqlParameter("@Questions", SqlDbType.Structured) {TypeName = "dbo.QuestionList", Value = questions}
        };

这样尝试:

在C#中创建数据表

 DataTable myDataTable = new DataTable("QuestionList");
    myDataTable.Columns.Add("Title", typeof(string));
    myDataTable.Columns.Add("Text", typeof(string));
    myDataTable.Rows.Add("Title", "Text1");
    myDataTable.Rows.Add("Text", "Text2");

创建sql参数

  string conStr = "Server=localhost;Database=master;Trusted_Connection=True;";
        con = new SqlConnection(conStr);
        con.Open();
  using (con)
        {
            SqlCommand insertCommand = new SqlCommand("InsertQuestionList", con);
            SqlParameter tvpParam = insertCommand.Parameters.AddWithValue(
                "@QuestionList", myDataTable);
            insertCommand.CommandType = CommandType.StoredProcedure;
            tvpParam.SqlDbType = SqlDbType.Structured;
            tvpParam.TypeName = "dbo.QuestionList";
            tvpParam.Value = myDataTable;
            insertCommand.ExecuteNonQuery();
        }
        con.Close();

创建表格类型

 CREATE TYPE dbo.QuestionList AS TABLE
    ( Title varchar(50), TEXT nvarchar(50) )

PRODCEDURE插入

ALTER PROCEDURE  InsertQuestionList
   @QuestionList QuestionList READONLY
AS
BEGIN
 --insert into Your table
 select * from @QuestionList
END
GO