【问题标题】:How to store a sql result to a variable in C# using Dapper.NET如何使用 Dapper.NET 将 sql 结果存储到 C# 中的变量中
【发布时间】:2013-06-13 20:54:31
【问题描述】:

我在我的项目中使用,这是一个漂亮的工具,用于将SQL query 结果存储到List,效果很好。

我写了一个SQL query 来从数据库中获取一条记录并将结果存储在一个变量中,我尝试使用 dapper 但遇到了一个错误。我已经粘贴了对应的代码。

异常:无法转换类型的对象 'System.Collections.Generic.List`1[Dapper.SqlMapper+DapperRow]' 到 输入“System.IConvertible”。

try
{
  using(var connection = ...)
  {
   connection.Open();
   const string masterSelectQuery = "SELECT Id as [fileId], FileName as [fileName], Frequency as [frequency], Scheduled_Time as scheduledTime FROM MASTER_TABLE";
   masterTableList = connection.Query<MasterTableAttributes>(masterSelectQuery).ToList();//Working fine

   const string lastProcessedTimeQuery = "SELECT TOP 1 file_transfered_time as [lastProcessedTime] FROM PROCESS_LOGS ORDER BY file_transfered_time DESC";
   DateTime lastProcessedTime = Convert.ToDateTime(connection.Query(lastProcessedTimeQuery)); //Here it fails
  }    
}

为了克服这个错误,我使用了SQLCommand,如下所示

using (command = new SqlCommand(lastProcessedTimeQuery, connection))
{
  DateTime lastProcessedTime = (DateTime)command.ExecuteScalar();//working fine  
}

我在使用 dapper 时犯了一个错误,有人可以指导我吗?

提前致谢。

【问题讨论】:

  • 顺便说一句,你不需要connection.Open();,如果还没有,Dapper 会打开连接。
  • @ErenErsönmez 这取决于正在使用的版本,但是:是的
  • @ErenErsönmez 你是对的,谢谢你的指点。我正在使用 .NET Framework4 和相应的 dapper。

标签: dapper c# dapper sqlconnection


【解决方案1】:

connection.Query(lastProcessedTimeQuery) 返回一个序列 ,每个单独dynamic。假设file_transfered_timedatetime,你有两个选择:

DateTime lastProcessedTime = connection.Query<DateTime>(
                 lastProcessedTimeQuery).Single();

或者,展示非泛型 Query 如何与 dynamic 行一起使用:

DateTime lastProcessedTime = connection.Query(
                 lastProcessedTimeQuery).Single().lastProcessedTime;

如果您的PROCESS_LOGS 表可能是空的,您可能更喜欢SingleOrDefault

DateTime? lastProcessedTime = connection.Query<DateTime?>(
                 lastProcessedTimeQuery).SingleOrDefault();

或:

var row = connection.Query(lastProcessedTimeQuery).SingleOrDefault();
DateTime? lastProcessedTime = null;
if(row != null) lastProcessedTime = row.lastProcessedTime;

【讨论】:

  • 我确信我只能从您那里获得解决方案。它发生了 :) 感谢您的清晰解释,我更正了我的代码。
  • @user1671639 我有一组电子邮件警报,当人们发布到我的任何核心项目时触发;p
  • @MarcGravell 解释了为什么你几乎总是第一个回答 Dapper 的问题 - 并且一如既往地以一种很好的方式:)
  • @MarcGravell 如何将 Dapper 用于参数? sqlQuery="....CONVERT(VARCHAR(10),@lastProcessDateTime, 101)" command.Parameters.AddWithValue("@lastProcessDateTime", lastProcessedTime);
  • @user1671639 DateTime lastProcessDateTime = ...; var results = conn.Query&lt;Foo&gt;("select * from Foo where created &gt; @lastProcessDateTime", new { lastProcessDateTime });
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-19
  • 2014-04-24
  • 2014-06-30
相关资源
最近更新 更多