Dapper - 带字符串查询的表值参数

问题描述 投票:0回答:2

我需要将表值参数与字符串查询一起使用

我有以下代码

string query = "SELECT * FROM Tabla1 T1 INNER JOIN @listItems T2 ON T2.Id = T1.Id";
var results = sqlConnection.Query(query , new TableValuedParameter<string>("@listItems", "string_list_Type", valuesList));

变量 valueList 是一个 List

执行时出现错误:“找不到存储过程”

是否可以在不使用程序的情况下使用美国表值参数?

谢谢 问候

dapper
2个回答
28
投票

如果没有看到完整的代码示例,很难判断问题出在哪里。考虑一下这个,它执行得非常好:

一、TVP定义

CREATE TYPE [dbo].[TVPSTRING] AS TABLE(
    [VALUE] NVARCHAR(MAX) NULL
)

然后是 Dapper 示例代码:

using System;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using Dapper;

namespace CPTVP
{
    class Program
    {
        static void Main(string[] args)
        {
            var dt = new DataTable();
            dt.Columns.Add("StringsStringsEverywhere", typeof(string));
            foreach (int i in Enumerable.Range(0,10))
            {
                dt.Rows.Add(string.Format("{0:0000}", i));
            }

            using (var conn = new SqlConnection("Data Source=.;Initial Catalog=Scratch;Integrated Security=true;"))
            {
                Console.WriteLine(String.Join("\n", conn.Query<string>("SELECT * FROM @tvpstr", new {tvpstr=dt.AsTableValuedParameter("dbo.TVPSTRING")})));
            }
        }
    }
}

0
投票

假设 OP 使用与我相同的通用 TableValuedParameter 类,解决方案在于其 SqlMapper.IDynamicParameters

AddParameters
方法的实现,以及它显式将 IDbCommand 的 CommandType 设置为 CommandType.StoredProcedure 的事实,如下所示:

public void AddParameters(IDbCommand command, SqlMapper.Identity identity)
{
    var sqlCommand = (SqlCommand)command;
    sqlCommand.CommandType = CommandType.StoredProcedure;
    var list = _values.Select(s =>
    {
        var sqlDataRecord = new SqlDataRecord(_tvpDefinition);
        _actionMapping(sqlDataRecord, s);
        return sqlDataRecord;
    }).ToList();

    if (list.Count == 0)
    {
        return;
    }

    var sqlParameter = sqlCommand.Parameters.Add(_name, SqlDbType.Structured);
    sqlParameter.Direction = ParameterDirection.Input;
    sqlParameter.TypeName = _typeName;
    sqlParameter.Value = list;
}

通过删除显式设置 CommandType 的行,TableValuedParameter 类现在也适用于普通查询。

© www.soinside.com 2019 - 2024. All rights reserved.