Читать таблицу SQL в C # DataTable - PullRequest
76 голосов
/ 20 мая 2011

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

Ответы [ 5 ]

130 голосов
/ 20 мая 2011

Вот, сделайте снимок (это просто псевдокод)

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();
    }
}
66 голосов
/ 20 мая 2011
var table = new DataTable();    
using (var da = new SqlDataAdapter("SELECT * FROM mytable", "connection string"))
{      
    da.Fill(table);
}
11 голосов
/ 20 мая 2011

Множество способов.

Используйте 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);
}

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

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

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

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

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

Редактировать: Возможно, я не был понятен: Datatables = good, datasets = evil.Если вы используете ADO.Net, вы можете использовать обе эти технологии (EF, linq2sql, dapper, nhibernate, orm месяца), так как они обычно располагаются над ado.net.Преимущество, которое вы получаете, заключается в том, что вы можете гораздо проще обновлять свою модель по мере изменения схемы, если у вас есть правильный уровень абстракции с помощью генерации кода.

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

9 голосов
/ 11 февраля 2013

Независимая от поставщика версия, полагается исключительно на интерфейсы 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, которые были разработаны только для что - быстрое создание DataTables.

0 голосов
/ 02 февраля 2019

Централизованная модель: Вы можете использовать ее из любого места!

Вам просто нужно вызвать формат ниже. Из вашей функции в этот класс

DataSet ds = new DataSet();
SqlParameter[] p = new SqlParameter[1];
string Query = "Describe Query Information/either sp, text or TableDirect";
DbConnectionHelper dbh = new DbConnectionHelper ();
ds = dbh. DBConnection("Here you use your Table Name", p , string Query, CommandType.StoredProcedure);

Вот и все.это идеальный метод.

public class DbConnectionHelper {
   public DataSet DBConnection(string TableName, SqlParameter[] p, string Query, CommandType cmdText) {
    string connString = @ "your connection string here";
    //Object Declaration
    DataSet ds = new DataSet();
    SqlConnection con = new SqlConnection();
    SqlCommand cmd = new SqlCommand();
    SqlDataAdapter sda = new SqlDataAdapter();
    try {
     //Get Connection string and Make Connection
     con.ConnectionString = connString; //Get the Connection String
     if (con.State == ConnectionState.Closed) {
      con.Open(); //Connection Open
     }
     if (cmdText == CommandType.StoredProcedure) //Type : Stored Procedure
     {
      cmd.CommandType = CommandType.StoredProcedure;
      cmd.CommandText = Query;
      if (p.Length > 0) // If Any parameter is there means, we need to add.
      {
       for (int i = 0; i < p.Length; i++) {
        cmd.Parameters.Add(p[i]);
       }
      }
     }
     if (cmdText == CommandType.Text) // Type : Text
     {
      cmd.CommandType = CommandType.Text;
      cmd.CommandText = Query;
     }
     if (cmdText == CommandType.TableDirect) //Type: Table Direct
     {
      cmd.CommandType = CommandType.Text;
      cmd.CommandText = Query;
     }
     cmd.Connection = con; //Get Connection in Command
     sda.SelectCommand = cmd; // Select Command From Command to SqlDataAdaptor
     sda.Fill(ds, TableName); // Execute Query and Get Result into DataSet
     con.Close(); //Connection Close
    } catch (Exception ex) {

     throw ex; //Here you need to handle Exception
    }
    return ds;
   }
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...