Чтение таблицы SQL в C# DataTable



Я прочитал много сообщений о вставке DataTable в таблицу SQL, но есть ли простой способ вытащить таблицу SQL в DataTable .NET?

1348   4  

4 ответов:

вот, дайте это выстрел (это просто псевдокод)

using System;
using System.Data;
using System.Data.SqlClient;


public class PullDataTest
{
    // your data table
    private DataTable dataTable = new DataTable();

    public PullDataTest()
    {
    }

    // your method to pull data from database to datatable   
    public void PullData()
    {
        string connString = @"your connection string here";
        string query = "select * from table";

        SqlConnection conn = new SqlConnection(connString);        
        SqlCommand cmd = new SqlCommand(query, conn);
        conn.Open();

        // create data adapter
        SqlDataAdapter da = new SqlDataAdapter(cmd);
        // this will query your database and return the result to your datatable
        da.Fill(dataTable);
        conn.Close();
        da.Dispose();
    }
}
var table = new DataTable();    
using (var da = new SqlDataAdapter("SELECT * FROM mytable", "connection string"))
{      
    da.Fill(table);
}

много способов.

использовать ADO.Net и использовать заливать на адаптер данных, чтобы получить объект DataTable:

using (SqlDataAdapter dataAdapter
    = new SqlDataAdapter ("SELECT blah FROM blahblah ", sqlConn))
{
    // create the DataSet 
    DataSet dataSet = new DataSet(); 
    // fill the DataSet using our DataAdapter 
    dataAdapter.Fill (dataSet);
}

затем вы можете получить таблицу данных из набора данных.

Примечание В наборе данных ответов upvoted не используется, (он появился после моего ответа) Это делает

// create data adapter
SqlDataAdapter da = new SqlDataAdapter(cmd);
// this will query your database and return the result to your datatable
da.Fill(dataTable);

что предпочтительнее моего.

Я бы настоятельно рекомендовал посмотреть на Entity framework ... использование таблиц данных и наборов данных не является отличной идеей. Там нет типа безопасность на них, что означает, что отладка может быть выполнена только во время выполнения. С строго типизированными коллекциями (которые вы можете получить с помощью LINQ2SQL или Entity framework) ваша жизнь будет намного проще.

редактировать: возможно, я не ясно выразился: объекты DataTable = хорошо, наборов = зло. Если вы используете ADO.Net затем вы можете использовать обе эти технологии (EF, linq2sql, dapper, nhibernate, orm of the month) , поскольку они обычно сидят поверх ado.net. преимущество вы получаете в том, что вы можете обновить свою модель далеко проще, как ваши изменения схемы при условии, что у вас есть правильный уровень абстракции путем выравнивания генерации кода.

в ado.net адаптер использует провайдеров, которые предоставляют информацию из базы данных, например, по умолчанию он использует SQL-сервер провайдера, вы можете также подключить, например, компания postgress поставщика и по-прежнему получать доступ к этому типу информации, которая позволит вам, как и выше использовать ORM для выбора (почти безболезненно - есть несколько причуд) - я считаю, что Microsoft также предоставьте поставщика oracle. Вся цель этого состоит в том, чтобы абстрагироваться от реализации базы данных, где это возможно.

независимая версия поставщика, исключительно полагается на ADO.NET интерфейсы; 2 способа:

public DataTable Read1<T>(string query) where T : IDbConnection, new()
{
    using (var conn = new T())
    {
        using (var cmd = conn.CreateCommand())
        {
            cmd.CommandText = query;
            cmd.Connection.ConnectionString = _connectionString;
            cmd.Connection.Open();
            var table = new DataTable();
            table.Load(cmd.ExecuteReader());
            return table;
        }
    }
}

public DataTable Read2<S, T>(string query) where S : IDbConnection, new() 
                                           where T : IDbDataAdapter, IDisposable, new()
{
    using (var conn = new S())
    {
        using (var da = new T())
        {
            using (da.SelectCommand = conn.CreateCommand())
            {
                da.SelectCommand.CommandText = query;
                da.SelectCommand.Connection.ConnectionString = _connectionString;
                DataSet ds = new DataSet(); //conn is opened by dataadapter
                da.Fill(ds);
                return ds.Tables[0];
            }
        }
    }
}

Я провел некоторое тестирование производительности,и второй подход всегда превосходил первый.

Stopwatch sw = Stopwatch.StartNew();
DataTable dt = null;
for (int i = 0; i < 100; i++)
{
    dt = Read1<MySqlConnection>(query); // ~9800ms
    dt = Read2<MySqlConnection, MySqlDataAdapter>(query); // ~2300ms

    dt = Read1<SQLiteConnection>(query); // ~4000ms
    dt = Read2<SQLiteConnection, SQLiteDataAdapter>(query); // ~2000ms

    dt = Read1<SqlCeConnection>(query); // ~5700ms
    dt = Read2<SqlCeConnection, SqlCeDataAdapter>(query); // ~5700ms

    dt = Read1<SqlConnection>(query); // ~850ms
    dt = Read2<SqlConnection, SqlDataAdapter>(query); // ~600ms

    dt = Read1<VistaDBConnection>(query); // ~3900ms
    dt = Read2<VistaDBConnection, VistaDBDataAdapter>(query); // ~3700ms
}
sw.Stop();
MessageBox.Show(sw.Elapsed.TotalMilliseconds.ToString());

Read1 выглядит лучше на глазах, но адаптер данных работает лучше (чтобы не путать, что одна БД превзошла другую, запросы были все разные). Однако разница между ними зависела от запроса. Причина может быть в том, что Load требует различных ограничений, чтобы быть проверено строка за строкой из документации при добавлении строк (его метод DataTable), а Fill находится на DataAdapters, которые были разработаны именно для этого - быстрое создание таблиц данных.

Comments

    Ничего не найдено.