【问题标题】:Dapper custom helper (for Table-Valued Parameters) comma instead of dot in floating point valueDapper 自定义助手(用于表值参数)逗号而不是浮点值中的点
【发布时间】:2013-04-17 17:07:18
【问题描述】:

Does Dapper support SQL 2008 Table-Valued Parameters? 的代码效果很好。

但是使用 MSSQL SQL_VARIANT 列(通常)会带来麻烦......

private static string ConnectionString = @"data source=192.168.1.1;initial catalog=;persist security info=False;user id=sa;password=";

private static void TestTVP2()
    {
        var connection = new SqlConnection(ConnectionString);
        connection.Open();

        var nums =
            connection
            .Query<BigIntKeySqlVariantValueType.TypeFields>("[dbo].[pmesAttributeValueUpdate]", new BigIntKeySQLVariantValueTVP(new[]
                    {
                        new BigIntKeySqlVariantValueType.TypeFields{ParameterName = 9976669, ParameterValue= 8.5}
                    }, "@tvp")
                ).ToList();

        foreach (var num in nums)
        {
            Console.WriteLine(num.BigIntKeySqlVariantValueTypeId + " " + num.ParameterName + " " +
                              num.ParameterValue);
        }
    }


internal class BigIntKeySQLVariantValueTVP : SqlMapper.IDynamicParameters
{
    private readonly IEnumerable<BigIntKeySqlVariantValueType.TypeFields> _values;
    private readonly string _parametername;

    public BigIntKeySQLVariantValueTVP(IEnumerable<BigIntKeySqlVariantValueType.TypeFields> values, string parametername)
    {
        this._values = values;
        this._parametername = parametername;
    }

    public void AddParameters(IDbCommand command)
    {
        var sqlCommand = (SqlCommand)command;
        sqlCommand.CommandType = CommandType.StoredProcedure;

        var numberList = new List<SqlDataRecord>();

        // Create an SqlMetaData object that describes our table type.
        SqlMetaData[] tvpDefinition =
            {
                new SqlMetaData(
                    "BigIntKeySQLVariantValueTypeId", SqlDbType.BigInt, true, false, SortOrder.Unspecified, -1),
                new SqlMetaData("ParameterName", SqlDbType.BigInt),
                new SqlMetaData("ParameterValue", SqlDbType.Variant),
            };

        foreach (var n in _values)
        {
            // Create a new record, using the metadata array above.
            var rec = new SqlDataRecord(tvpDefinition);

            rec.SetInt64(1, n.ParameterName); // Set the value.
            rec.SetValue(2, n.ParameterValue);

            numberList.Add(rec); // Add it to the list.
        }

        // Add the table parameter.
        var p = sqlCommand.Parameters.Add(_parametername, SqlDbType.Structured);
        p.Direction = ParameterDirection.Input;
        p.TypeName = "BigIntKeySQLVariantValueType";
        p.Value = numberList;
    }

    public void AddParameters(IDbCommand command, SqlMapper.Identity identity)
    {
        AddParameters(command);
    }
}

public class BigIntKeySqlVariantValueType 
{
    /// <summary>
    /// Type POCO
    /// </summary>
    public struct TypeFields
    {
        public long BigIntKeySqlVariantValueTypeId { get; private set; }

        public long ParameterName { get; set; }

        public object ParameterValue { get; set; }
    }
}

这是 Dapper 生成的代码,如 SQL Profiler 中所示:

declare @p1 dbo.BigIntKeySQLVariantValueType
insert into @p1 values(9976669,8,5)
exec [dbo].[pmesAttributeValueUpdate] @tvp=@p1

我的Table-Valued 输入:

CREATE TYPE [dbo].[BigIntKeySQLVariantValueType] AS TABLE(
    [BigIntKeySQLVariantValueTypeId] [bigint] IDENTITY(1,1) NOT NULL,
    [ParameterName] [bigint] NULL,
    [ParameterValue] [sql_variant] NULL,
    PRIMARY KEY CLUSTERED 
(
    [BigIntKeySQLVariantValueTypeId] ASC
)WITH (IGNORE_DUP_KEY = OFF)
)

Dapper 生成的代码应该是:

insert into @p1 values(9976669,8.5)

如何在SqlParameter 中用点“替换”逗号

        // Add the table parameter.
        var p = sqlCommand.Parameters.Add(_parametername, SqlDbType.Structured);
        p.Direction = ParameterDirection.Input;
        p.TypeName = "BigIntKeySQLVariantValueType";
        p.Value = numberList;

【问题讨论】:

  • 您是如何获得该输出的?您是否使用 SQL 跟踪?或者是类似于迷你分析器的东西?关键是:dapper 从不添加 declare 等 - 参数发送 作为参数。可能这里的错误只是渲染期间的 UI 错误(不使用不变的文化)。
  • “Dapper 输出”是来自 Profiler 的 Control+C 并调用:connection.Query&lt;BigIntKeySqlVariantValueType.TypeFields&gt;("[dbo].[pmesAttributeValueUpdate]", tvp).ToList(); 必须生成 INSERT INTO,对吗?
  • 很难说;这可能只是分析器渲染问题;它目前工作吗?另外:你没有显示你提供给 dapper 的命令/参数,所以我很难评论它是否正确/错误......你能显示对 Query / Execute 的调用吗? (包括命令/命令类型/等) Dapper 不添加INSERT 等。它只是添加参数。
  • @MarcGravell 它有效......天堂(Profiler)和地球(控制台)中的所有迹象表明它不应该所以我没有检查表是否有数据。额外问题:为什么 SQL Profiler 显示 INSERTS 以及实际 SQL 语句的样子。
  • 我认为这是一个善意的谎言,旨在使其易于阅读,并可以复制/粘贴到 SSMS 中进行调试

标签: c# sql-server-2008 dapper


【解决方案1】:

事实证明,逗号而不是句点的值在 SQL Profiler 和 Console.Write 中显示。

向数据库传递正确的浮点值。

【讨论】:

    猜你喜欢
    • 2015-07-20
    • 1970-01-01
    • 1970-01-01
    • 2012-02-27
    • 2014-09-17
    • 1970-01-01
    • 2012-05-17
    • 1970-01-01
    • 2018-08-16
    相关资源
    最近更新 更多