0

我认为交易会在以下示例中对我有所帮助,但我可能是错的。如果我在以下场景中没有太多,我试图避免的是对数据库进行 3 次不同的调用。

我想做以下事情:

  1. 从员工中选择姓名、地址
  2. 从状态中选择状态
  3. 从错误表中选择错误

在这种情况下,我必须调用几个不同的选择来获取数据。处理这个场景以返回我想要读取的所有数据以最小化对数据库的几次调用的最佳方法是什么?

注意:没有表在它们之间存在关系。

4

7 回答 7

2

如果表之间没有关系,你可以做一种

Select [Your selected columns]
From (select * from table1 where [conditon for table1]) t1
Inner join (select * from table2 where [condition for table2]) t2 on 1=1 
Inner join (select * from table3 where [condition for table3]) t3 on 1=1 

这使得一次访问数据库。

于 2013-07-23T19:40:06.870 回答
1

我认为您可以使用它reader.NextResult()来遍历结果集。从codeproject借来的一个例子:

connection.Open();
dataReader = command.ExecuteReader(); // a multi-select query
while (loopResult) {
   stringBuilder = new System.Text.StringBuilder();
   while (dataReader.Read()) {
      stringBuilder.AppendLine(dataReader.GetInt32(0).ToString());
   }
   System.Windows.MessageBox.Show(stringBuilder.ToString(), "Data from the result set");
   loopResult = dataReader.NextResult();
}

但是,我不确定对不相关数据的查询进行分组的基本原理是什么。这可能会使您的项目更难理解和维护。

于 2013-07-23T19:45:38.823 回答
0

如果您不能使用存储过程,那么您可以选择:select在一个批次中执行多个语句。此“批处理”由 SQL Server 作为单个实体处理,返回多个结果集。一旦你有了它,你可以

  1. 通过 SqlDataReader 读取它,因此:

    using ( SqlConnection connection = new SqlConnection(connectionString))
    using ( SqlCommand cmd = connection.CreateCommand() )
    {
    
      cmd.CommandText = " select * from foo"
                      + " select * from bar"
                      + " select * from baz"
                      + " select * from bat"
                      ;
      cmd.CommandType = CommandType.Text; ;
    
      using ( SqlDataReader reader = cmd.ExecuteReader() )
      {
        int n = 0 ;
    
        do
        {
    
          Console.WriteLine( "Result set #{0}", ++n ) ;
          int rows = 0 ;
          while ( reader.Read() )
          {
            ++rows ;
            for ( int i = 0 ; i < reader.FieldCount ; ++i )
            {
              object o1 = reader[i] ; // get object by ordinal column number
              string columnName = reader.GetName(i) ;
              object o2 = reader[columnName];
            }
          }
          Console.WriteLine("  {0} rows", rows ) ;
    
        } while ( reader.NextResult() ) ;
      }
    
  2. 通过 a 阅读它SqlDataAdapter,因此:

    DataSet results = new DataSet() ;
    
    using ( SqlConnection connection = new SqlConnection(connectionString))
    using ( SqlCommand cmd = connection.CreateCommand() )
    using ( SqlDataAdapter adapter = new SqlDataAdapter(cmd) )
    {
      cmd.CommandText = " select * from foo"
                      + " select * from bar"
                      + " select * from baz"
                      + " select * from bat"
                      ;
      cmd.CommandType = CommandType.Text; ;
    
      connection.Open() ;
      int rowcount = adapter.Fill(results) ;
      connection.Close() ;
    
    }
    
    Process(results) ;
    
于 2013-07-23T21:28:11.463 回答
0

您可能要考虑使用存储过程。

于 2013-07-23T19:30:10.817 回答
0

如果它们之间存在关系,您可以尝试使用 JOIN 表进行选择查询

于 2013-07-23T19:32:57.987 回答
0

我假设您使用的是 ASP.Net 4.0 ...

您可以通过执行以下操作将查询“链接”在一起:

select name, address from employee;select state from states;select error from errorTable;

然后像这样填充数据集:

string sql = "...";
SqlCommand comm = new SqlCommand(sql, con);
SqlDataAdapter adpr = new SqlDataAdapter(comm);
DataSet ds = new DataSet();
adpr.Fill(ds);
于 2013-07-23T19:33:17.673 回答
0

没有理由不能从 sql server 返回多个集合。

select name, address from employee;
select state from states;
select error from errorTable;

使用 sql 阅读器并获取 .NextResult 将转到下一个数据集。

http://csharp.net-informations.com/data-providers/csharp-multiple-resultsets.htm

于 2013-07-23T21:43:56.937 回答