Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何从SqlDataReader克隆数据,并以可以通过方法导出的方式保留所有列和行?_C#_Asp.net_Sqldatareader - Fatal编程技术网

C# 如何从SqlDataReader克隆数据,并以可以通过方法导出的方式保留所有列和行?

C# 如何从SqlDataReader克隆数据,并以可以通过方法导出的方式保留所有列和行?,c#,asp.net,sqldatareader,C#,Asp.net,Sqldatareader,我目前正在尝试创建一个方法,允许我在connectionstring上运行任何查询,并以可读的方式为我的ASP.Net网站返回结果。因为我需要访问查询可能需要的所有行和列,所以我不能简单地返回字符串或字符串数组。如果返回SqlDataReader,则无法读取方法外部的数据,因为连接已关闭 这就是我的方法目前的样子 private SqlDataReader QueryConnectionString (string query) { // New SQL Connecti

我目前正在尝试创建一个方法,允许我在connectionstring上运行任何查询,并以可读的方式为我的ASP.Net网站返回结果。因为我需要访问查询可能需要的所有行和列,所以我不能简单地返回字符串或字符串数组。如果返回SqlDataReader,则无法读取方法外部的数据,因为连接已关闭

这就是我的方法目前的样子

private SqlDataReader QueryConnectionString (string query)
    {
        // New SQL Connection
        SqlConnection cnn;

        // New Connection String
        string connetionString = ConfigurationManager.ConnectionStrings["ConnectionStringName"].ConnectionString;

        // Instantiate the SQL Connection with Connection String
        cnn = new SqlConnection(connetionString);

        // Create a SqlCommand with the input Query
        SqlCommand command = new SqlCommand(query, cnn);

        cnn.Open();

        // Create a SqlDataReader and tie it to the query
        SqlDataReader reader = command.ExecuteReader();        

        cnn.Close();

        return reader;
    }
在我的其他方法中,我会有这样的东西

SqlDataReader reader = QueryConnectionString("SELECT * FROM tTable");

lblOutput.Text = reader.GetString(0);
但这样做给了我错误

System.InvalidOperationException:'调用的尝试无效 当读卡器关闭时,CheckDataIsReady。'

我意识到返回SqlDataReader不是一个选项。我可以返回哪些数据,以便其他方法可以读取数据?

您可以尝试此方法

IEnumerable<IDataRecord> GetRecords()
{
    using(var connection = new SqlConnection(@"..."))
    {
        connection.Open();

        using(var command = new SqlCommand(@"...", connection);
        {
            using(var reader = command.ExecuteReader())
            {
               while(reader.Read())
               {
                   // your code here.
                   yield return reader;
               }
            }
        }
    }
}
你可以试试这个

IEnumerable<IDataRecord> GetRecords()
{
    using(var connection = new SqlConnection(@"..."))
    {
        connection.Open();

        using(var command = new SqlCommand(@"...", connection);
        {
            using(var reader = command.ExecuteReader())
            {
               while(reader.Read())
               {
                   // your code here.
                   yield return reader;
               }
            }
        }
    }
}
您可以返回一个DataTable,它将保留查询的列和行。而不是使用SqLDATAdAdter来考虑使用Sql DATAdAdvor。一个优点是SqlDataAdapter的Fill方法将为您打开和关闭连接

var dt = new DataTable();    
using (var da = new SqlDataAdapter(query, cnn))
{      
    da.Fill(dt);
}
您的完整方法可能如下所示:

private DataTable GetData(string query)
{
    // New Connection String
    string connetionString = ConfigurationManager.ConnectionStrings["ConnectionStringName"].ConnectionString;

    // Instantiate the SQL Connection with Connection String
    SqlConnection cnn = new SqlConnection(connetionString);

    // declare datatable
    var dt = new DataTable();    

    // create SqlDataAdapter 
    using (var da = new SqlDataAdapter(query, cnn))
    {      
        // fill datatable
        da.Fill(dt);
    }

    return dt;
}
然后需要从数据表中读取数据。有关读取数据的方法,请参见我的答案。链接答案中的方法使用DataSetExtensions中的字段扩展来提取数据。请参见下面的示例:

// get data from your method
DataTable table = GetData("select * from MyTable");

// iterate over the rows of the datatable
foreach (var row in table.AsEnumerable())  // AsEnumerable() returns IEnumerable<DataRow>
{
    var id = row.Field<int>("ID");                           // int
    var name = row.Field<string>("Name");                    // string
    var orderValue = row.Field<decimal>("OrderValue");       // decimal
    var interestRate = row.Field<double>("InterestRate");    // double
    var isActive = row.Field<bool>("Active");                // bool
    var orderDate = row.Field<DateTime>("OrderDate");        // DateTime
}
您可以返回一个DataTable,它将保留查询的列和行。而不是使用SqLDATAdAdter来考虑使用Sql DATAdAdvor。一个优点是SqlDataAdapter的Fill方法将为您打开和关闭连接

var dt = new DataTable();    
using (var da = new SqlDataAdapter(query, cnn))
{      
    da.Fill(dt);
}
您的完整方法可能如下所示:

private DataTable GetData(string query)
{
    // New Connection String
    string connetionString = ConfigurationManager.ConnectionStrings["ConnectionStringName"].ConnectionString;

    // Instantiate the SQL Connection with Connection String
    SqlConnection cnn = new SqlConnection(connetionString);

    // declare datatable
    var dt = new DataTable();    

    // create SqlDataAdapter 
    using (var da = new SqlDataAdapter(query, cnn))
    {      
        // fill datatable
        da.Fill(dt);
    }

    return dt;
}
然后需要从数据表中读取数据。有关读取数据的方法,请参见我的答案。链接答案中的方法使用DataSetExtensions中的字段扩展来提取数据。请参见下面的示例:

// get data from your method
DataTable table = GetData("select * from MyTable");

// iterate over the rows of the datatable
foreach (var row in table.AsEnumerable())  // AsEnumerable() returns IEnumerable<DataRow>
{
    var id = row.Field<int>("ID");                           // int
    var name = row.Field<string>("Name");                    // string
    var orderValue = row.Field<decimal>("OrderValue");       // decimal
    var interestRate = row.Field<double>("InterestRate");    // double
    var isActive = row.Field<bool>("Active");                // bool
    var orderDate = row.Field<DateTime>("OrderDate");        // DateTime
}

在最基本的级别上,您可以使用读取器填充数据表并返回数据表。请参见DataTable.Load方法,但最好的做法是使用一个表示数据记录的特定对象并填充这些对象的列表。ORM是在这个领域帮助您转换域对象中的裸骨记录的库。在最基本的级别上,您可以使用读卡器填充数据表并返回数据表。请参阅DataTable.Load方法,但最好的方法是使用一个表示数据记录的特定对象并填充这些对象的列表。ORM是在这个领域帮助您转换域对象中的裸骨记录的库