gpt4 book ai didi

varchar - Dapper 和 varchars

转载 作者:行者123 更新时间:2023-12-03 22:38:02 30 4
gpt4 key购买 nike

我在 the Dapper .NET project home page 上发现了以下评论.

Dapper supports varchar params, if you are executing a where clause on a varchar column using a param be sure to pass it in this way:


    Query<Thing>("select * from Thing where Name = @Name", new {Name = 
new DbString { Value = "abcde", IsFixedLength = true, Length = 10, IsAnsi = true });

On Sql Server it is crucial to use the unicode when querying unicode and ansi when querying non unicode



我正在评估 Dapper 与旧数据库(SQL Server 2008)一起使用,有很多带有 varchar 参数的存储过程,我对这个限制有点困惑。

使用手工制作的 ADO.NET 代码,我将对上述查询使用以下内容:
new SqlParameter("@Name", "abcde")

没有指定它是否是unicode,也没有指定长度。
  • 为什么我需要这种带有 Dapper 的冗长 DbString 语法,指定列长度、IsFixedLength 和 IsAnsi?
  • 为什么 IsFixedLength = true 对于 varchar 列(我希望对于 char 或 nchar 列是 true)?
  • 我是否必须像这样将 DbString 用于存储过程参数?

  • 我期待 Dapper 使我的 DAL 代码更加简洁,但这似乎使它对于 varchar 参数更加冗长。

    更新

    我进一步研究了一下,试图理解为什么 Dapper 会有这个 varchar 限制,我在手工编写的代码中似乎没有,我通常会创建一个输入参数,如下所示:
    var parameter = factory.CreateParameter(); // Factory is a DbProviderFactory
    parameter.Name = ...;
    parameter.Value = ...;

    并且通常让提供者推断 DbType使用它自己的规则,除非我特别想强制它。

    看着Dapper的 DynamicParameters类,它有一个方法 AddParameters它创建的参数如下:
    var dbType = param.DbType; // Get dbType and value
    var val = param.Value; // from

    ...
    // Coerce dbType to a non-null value if val is not null !!!!!
    if (dbType == null && val != null) dbType = SqlMapper.LookupDbType(val.GetType(),name);
    ...
    var p = command.CreateParameter();
    ...
    if (dbType != null)
    {
    p.DbType = dbType.Value;
    }

    IE。它明确强制 IDataParameter.DbType到一个它用自己的算法查找的值,而不是让提供者使用自己的规则。

    这有充分的理由吗?这对我来说似乎是错误的,特别是考虑到有关 Dapper 支持 varchar 参数的评论。

    最佳答案

    使用 ODBC 时需要此语法。

    您需要在 c# 中为 Dapper 定义一个 CHAR(30) 字段作为 DbString,并设置长度 (30) 和 ansi (true) 值以防止 Dapper 假设字符串是文本/blob 类型。否则,您可能会收到错误:“非法尝试转换文本/字节 blob 类型”。

    我使用 ODBC 连接到 Informix 时遇到此错误,直到我将参数定义为 DbString() 并设置长度和 ansi 值。

    More info here .

    关于varchar - Dapper 和 varchars,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19362113/

    30 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com