yon*_*236 133
在这里,给它一个镜头(这只是一个伪代码)
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();
}
}
Run Code Online (Sandbox Code Playgroud)
Tim*_*ers 71
var table = new DataTable();
using (var da = new SqlDataAdapter("SELECT * FROM mytable", "connection string"))
{
da.Fill(table);
}
Run Code Online (Sandbox Code Playgroud)
Joh*_*las 11
很多方法.
使用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);
}
Run Code Online (Sandbox Code Playgroud)
然后,您可以从数据集中获取数据表.
未使用upvoted答案数据集中的注释,(它出现在我的回答之后)确实如此
// create data adapter
SqlDataAdapter da = new SqlDataAdapter(cmd);
// this will query your database and return the result to your datatable
da.Fill(dataTable);
Run Code Online (Sandbox Code Playgroud)
这比我的好.
我强烈建议您查看实体框架...使用数据表和数据集并不是一个好主意.它们没有类型安全性,这意味着只能在运行时进行调试.使用强类型集合(您可以从使用LINQ2SQL或实体框架获得),您的生活将变得更加容易.
编辑:也许我不清楚:Datatables = good,datasets = evil.如果您使用ADO.Net,那么您可以使用这两种技术(EF,linq2sql,dapper,nhibernate,本月的orm),因为它们通常位于ado.net之上.您获得的优势是,您可以更轻松地更新模型,因为您可以通过控制代码生成来获得正确的抽象级别.
ado.net适配器使用公开数据库类型信息的提供程序,例如默认情况下它使用sql server提供程序,你也可以插入 - 例如 - devart postgress提供程序,仍然可以访问类型信息,然后允许你如上所述使用你的选择(几乎无痛 - 有一些怪癖) - 我相信微软也提供了一个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];
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
我做了一些性能测试,第二种方法总是优于第一种方法.
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());
Run Code Online (Sandbox Code Playgroud)
Read1
在眼睛看起来更好,但数据适配器表现更好(不要混淆一个db优于另一个,查询都不同).两者之间的差异取决于查询.原因可能是,在添加行(其方法打开)时需要从文档中Load
逐行检查各种约束,而DataAdapter是专门为此而设计的 - 快速创建DataTables.DataTable
Fill
归档时间: |
|
查看次数: |
327613 次 |
最近记录: |