DataTable을 SQL 테이블에 삽입하는 방법에 대한 많은 게시물을 읽었지만 SQL 테이블을 .NET DataTable로 가져 오는 쉬운 방법이 있습니까?
DataTable을 SQL 테이블에 삽입하는 방법에 대한 많은 게시물을 읽었지만 SQL 테이블을 .NET DataTable로 가져 오는 쉬운 방법이 있습니까?
답변:
여기, 이것을 시도하십시오 (이것은 단지 의사 코드입니다)
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();
}
}
datatable
필드는 호출하기 전에 초기화되어야합니다da.Fill(dataTable)
try/catch
또는를 using()
핸들 오류.
var table = new DataTable();
using (var da = new SqlDataAdapter("SELECT * FROM mytable", "connection string"))
{
da.Fill(table);
}
using
그것의 완전한 동등한 것을 이해한다면 당신은 그다지 경멸하지 않을 것 입니다.
Using
?? 그것은 경멸 With
또는 Try-Catch
. 나는 그 반대입니다. 수업에서 지원하지 않을 때 실망합니다.
많은 방법.
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);
내 것보다 낫다.
하지만 엔티티 프레임 워크를 살펴 보는 것이 좋습니다. 데이터 테이블과 데이터 세트를 사용하는 것은 좋은 생각이 아닙니다. 유형 안전성이 없기 때문에 디버깅은 런타임에만 수행 할 수 있습니다. 강력한 형식의 컬렉션 (LINQ2SQL 또는 엔터티 프레임 워크를 사용하여 얻을 수 있음)을 사용하면 작업이 훨씬 쉬워집니다.
편집 : 아마도 나는 명확하지 않았을 것입니다 : Datatables = good, datasets = evil. ADO.Net을 사용하는 경우 일반적으로 ado.net 위에 위치하므로 두 기술 (EF, linq2sql, dapper, nhibernate, orm)을 모두 사용할 수 있습니다. 얻을 수있는 이점은 코드 생성을 활용하여 적절한 수준의 추상화를 제공하는 경우 스키마 변경에 따라 모델을 훨씬 쉽게 업데이트 할 수 있다는 것입니다.
ado.net 어댑터는 데이터베이스의 유형 정보를 노출하는 공급자를 사용합니다. 예를 들어 기본적으로 SQL 서버 공급자를 사용합니다. 예를 들어 devart 포스트그레스 공급자를 연결할 수도 있습니다. 그러면 유형 정보에 계속 액세스 할 수 있습니다. 위와 같이 선택한 orm을 사용할 수 있도록 허용합니다 (거의 고통없이-몇 가지 단점이 있습니다). Microsoft도 오라클 공급자를 제공한다고 생각합니다. 이것의 전적인 목적은 가능한 경우 데이터베이스 구현에서 추상화하는 것입니다.
공급 업체 독립 버전, 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
보기에는 더 좋아 보이지만 데이터 어댑터 성능이 더 좋습니다 (하나의 db가 다른 db보다 성능이 뛰어나다는 것을 혼동하지 말고 쿼리가 모두 달랐습니다). 하지만 둘의 차이는 쿼리에 따라 다릅니다. 그 이유 는 DataTables의 빠른 생성을 위해 설계된 DataAdapters에있는 동안 행을 추가 할 때 문서에서Load
행별로 다양한 제약 조건을 확인해야하기 때문일 수 있습니다 (에 메서드 ) .DataTable
Fill
DataTable.Load()
로 .BeginLoadData()
하고 .EndLoadData()
와 동일한 속도를 달성하기 위해 DataSet
.
중앙 집중 형 모델 : 어디서나 사용할 수 있습니다!
함수에서이 클래스로 아래 형식을 호출하면됩니다.
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;
}
}