【问题标题】:Oracle database multiple row -> c# [closed]Oracle数据库多行-> c# [关闭]
【发布时间】:2018-01-26 18:01:49
【问题描述】:

如何使用 c#.net 从 oracle 数据库中检索多个数据行?并将数据行显示到列表框。

【问题讨论】:

  • 允许发布您在 StackOverflow 上提出的问题的答案。但是您必须确保该问题以前没有被问过,并且您的答案是无懈可击的。否则,您应该考虑改用博客。

标签: c# oracle


【解决方案1】:

让我们重新编写您的代码:

// Extract methods, don't cram everything in OnClick
private void FeedFriendsListBox() {
  string oracleDb = @"connection string";

  //DONE: wrap IDisposable into using
  using (OracleConnection conn = new OracleConnection(oracleDb)) {
    conn.Open();

    //DONE: Make Sql readable - format it out and use names for the parameter(s)
    string sql =
      @"SELECT NAME, 
               ADDRESS  
          FROM FRIENDS 
         WHERE AGE = :prm _Age";

    //DONE: wrap IDisposable into using
    using (OracleCommand cmd = new OracleCommand(sql, conn)) {
      cmd.Parameters.Add(new OracleParameter(txtlist.Text, OracleDbType.Decimal));

      //DONE: wrap IDisposable into using 
      using (var reader = cmd.ExecuteReader()) {
        if (!reader.HasRows) {
          listBox1.Text = "Not Found";

          MessageBox.Show("Data Not found", "NOT FOUND", 
                           MessageBoxButtons.OK, MessageBoxIcon.Information);

          return;
        }

        //DONE: Value is zero based
        //DONE: use formatting (string interpolation), not concatenating
        while (reader.Read())
          listBox1.Items.Add($"{reader.GetValue(0)} from {reader.GetValue(1)}");
      }
    }
  }
}

然后使用提取方法:

private void button2_Click(object sender, EventArgs e) {
  FeedFriendsListBox();   
} 

【讨论】:

    【解决方案2】:
    private void button2_Click(object sender, EventArgs e)
            {
                //database connection string and opening area
                string oracleDb = @"connection string";
                OracleConnection conn = new OracleConnection(oracleDb);
                conn.Open();
    
                //declareing paramater and readning parameter input
                OracleParameter param = new OracleParameter();
                param.OracleDbType = OracleDbType.Decimal;
                param.Value = txtlist.Text;
    
                OracleCommand cmd = new OracleCommand();
                cmd.Connection = conn;
    
                //sendting the parameter to the tabase query 
                cmd.Parameters.Add(param);
                cmd.CommandText = "SELECT NAME, ADDRESS  FROM FRIENDS WHERE age = :1";
    
                cmd.CommandType = CommandType.Text;
                OracleDataReader dataread = cmd.ExecuteReader();
                dataread.Read();
    
                if (dataread.HasRows)
                {
                    while (dataread.Read())
                    {
                        listBox1.Items.Add(dataread.GetString(1) + " from " + dataread.GetString(2));
                    }
                }
                else
                {
                    listBox1.Text = "Not Found";
                    MessageBox.Show("Data Not found", "NOT FOUND", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
                conn.Dispose();
            }
    

    【讨论】:

    • 而且,即使您打算发布一个示例,您自己的答案也不应该被视为一个好的答案,因为这里有一个大问题。如果这段代码中某处发生异常会发生什么?您将保持连接打开且未处理,从而导致严重的资源泄漏。请理解 using 语句的工作原理。
    • 刚刚看到另一个问题。您是否尝试过至少一次运行此代码?这段代码在第一个循环中就在你面前爆炸了。您检索了两列,然后在检索数据时使用了错误的索引。 IndexOutOfRangeException 将发生在 GetString(2)-
    猜你喜欢
    • 1970-01-01
    • 2020-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-11
    • 2017-04-05
    • 2014-12-15
    • 2016-12-31
    相关资源
    最近更新 更多