【问题标题】:Teradata Query Using Dapper C#使用 Dapper C# 进行 Teradata 查询
【发布时间】:2019-03-15 12:21:29
【问题描述】:

我正在尝试使用 Dapper 动态查询 Teradata 数据库,但遇到了一些问题。代码如下:

// model variable is the parameter passed in with search information
using (IDbConnection con = new TdConnection(connection.GetConnectionString()))
{
    var builder = new SqlBuilder();
    var selector = builder.AddTemplate($"SELECT * FROM Temp_Table /**where**/");

    if (model.Id != 0)
    {
        builder.Where("Id = ?", new { model.Id });
    }

    if (!string.IsNullOrEmpty(model.Employee_Id))
    {
        builder.Where("Employee_Id = ?", new { model.Employee_Id });
    }

    var data= con.Query<TableModel>(selector.RawSql, model).ToList();
    return data;
}

我得到的错误是:

[Teradata Database] [3939] 的数量不匹配 指定的参数和所需的参数数量。

我使用了非常相似的代码来查询 DB2,效果很好;我需要对 Teradata 做些什么不同的事情?

【问题讨论】:

    标签: c# .net teradata dapper


    【解决方案1】:

    乍一看,它似乎正在失败并且没有添加任何“where”条件。尝试以这样的方式构建它,如果它失败,则添加 1=1 或 Teradata 等效项(如果这不起作用)。

    我不熟悉SqlBuilder() 类;但是如果您有办法查看是否没有添加任何 Where 约束,那么添加一个通用的约束。或者,更脏的方法是保留 bool 引用并在最后检查。

    更新

    尝试传入参数:

    var data= con.Query<TableModel>(selector.RawSql, selector.Parameters).ToList();
    

    【讨论】:

    • 添加 where 类就好了 - selector.RawSQL 是 "SELECT * FROM DMMKP.RCRG_EMAIL_CAPTURE WHERE Id = ?"当id刚刚传入时
    • 啊,我想我看到了问题所在。我认为您需要传递参数而不是模型。
    • 我在您发表评论之前就注意到了这一点。不过这很奇怪,我有非常相似的代码在查询未传入参数的 DB2。不知道为什么在这种情况下不一样。
    • 我想这是它映射对象的方式。它似乎是一个对象的对象......而不仅仅是模型(单一对象)。如果你想进入杂草,这里是来源:github.com/StackExchange/Dapper/blob/master/Dapper.SqlBuilder/…
    【解决方案2】:

    设法弄明白了。将获取数据的行更改为:

    var data= con.Query<TableModel>(selector.RawSql, selector.Parameters).ToList();
    

    不知道为什么传入模型在我的 DB2 版本中工作得很好,但在这个 Teradata 版本中却不行。

    【讨论】:

      猜你喜欢
      • 2020-07-25
      • 1970-01-01
      • 2021-08-26
      • 1970-01-01
      • 2021-09-02
      • 1970-01-01
      • 2018-03-06
      • 1970-01-01
      • 2012-02-16
      相关资源
      最近更新 更多