【问题标题】:problem with getting data from database从数据库获取数据的问题
【发布时间】:2011-11-16 02:41:18
【问题描述】:

我正在尝试使用以下代码从数据库中获取数据.....

如果表中没有数据,它将始终转到 本声明

我正在使用 mysql.net 连接器来获取数据,并且我正在使用 winforms 应用程序 使用c#

     public DataTable sales(DateTime startdate, DateTime enddate)
     {
         const string sql = @"SELECT memberAccTran_Source as Category, sum(memberAccTran_Value) as Value
                              FROM memberacctrans
                              WHERE memberAccTran_DateTime BETWEEN @startdate AND @enddate
                              GROUP BY memberAccTran_Source";

         return sqlexecution(startdate, enddate, sql);
     }

下面的代码用于返回 sqlexceution...function..

 private static DataTable sqlexecution(DateTime startdate, DateTime enddate, string sql)
 {
         var table = new DataTable();
         using (var conn = new MySql.Data.MySqlClient.MySqlConnection(connectionstring))
         {
             conn.Open();

             var cmd = new MySql.Data.MySqlClient.MySqlCommand(sql, conn);

             var ds = new DataSet();

             var parameter = new MySql.Data.MySqlClient.MySqlParameter("@startdate", MySql.Data.MySqlClient.MySqlDbType.DateTime);
             parameter.Direction = ParameterDirection.Input;
             parameter.Value = startdate.ToString(dateformat);
             cmd.Parameters.Add(parameter);

             var parameter2 = new MySql.Data.MySqlClient.MySqlParameter("@enddate", MySql.Data.MySqlClient.MySqlDbType.DateTime);
             parameter2.Direction = ParameterDirection.Input;
             parameter2.Value = enddate.ToString(dateformat);
             cmd.Parameters.Add(parameter2);

             var da = new MySql.Data.MySqlClient.MySqlDataAdapter(cmd);

             da.Fill(ds);
             try
             {
                 table = ds.Tables[0];

             }
             catch
             {
                 table = null;
             }
         }
         return table;
     }

即使没有数据,流程也会转到这一行

table = ds.Tables[0];

我怎样才能减少这个.....

有没有人帮忙解决这个问题....

【问题讨论】:

  • 您是否考虑过使用 ORM,例如Linq 到 SQL 实体还是 EF?
  • 不..我必须使用这个....
  • Try {} 语句仅在赋值抛出异常时执行 catch {}。为什么要呢?如果结果数据集为空,它仍然会有一个 0 行的结果表。没有?
  • 尝试使用内置调试器查看 ds 尤其是 ds.Tables[0] 包含的属性值。

标签: c# .net sql winforms dataset


【解决方案1】:

在您的情况下,如果您认为如果没有可用的行,catch 块将被执行而不是您错了,因为即使一旦选择查询被无一例外地执行,它也会创建包含列但没有的数据表行。

为此,我认为您可以使用ds.table[0].rows.count 属性,如果数据表中没有行,则返回 0。

if ( ds.Tables[0].Rows.Count > 0 )
     table = ds.Tables[0];
else
     table=null;

【讨论】:

  • DataTable 的 Rows 属性在没有行时为空:msdn.microsoft.com/en-US/library/…
  • @Stuart Dunkeld - 你最好运行代码并自己检查它,如果可能的话,在你完成检查后删除你的反对意见
  • @Stuart Dunkeld - 当您使用 select 语句填充数据时,它不会误导我写的答案,如果不存在行,它会创建没有行的表,这意味着您需要检查行数以进行检查行数
  • 文档有点误导。道歉。
【解决方案2】:

它返回一个空表。这是常见的行为。如果你想让表为空,你应该检查行数:

If ( ds.Tables[0].Rows.Count >. 0 )
     table = ds.Tables[0];
Else
     table=0

【讨论】:

    【解决方案3】:

    我不太确定你在这里问什么...如果没有数据,我假设你希望它跳过 table = ds.tables[0] 行?

    如果是这种情况,try/catch 将无法工作,因为它不会引发异常...尝试类似的操作...

    if(ds.Tables.Count > 0 && ds.Tables[0].Rows.Count >0)
    {
        table = ds.Tables[0];
    }
    else
    {
        table = null;
    }
    

    【讨论】:

      猜你喜欢
      • 2013-04-17
      • 1970-01-01
      • 2019-11-12
      • 2014-11-03
      • 2011-07-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多