2016-07-27 3 views
13

쿼리를 실행하고 DataTable 개체를 반환하는 간단한 .Net Framework 루틴이 있습니다. 내가 지원하는 것을 이용하여, 그러나 나는 SQLAdapter 및 DataTable에이.Net 핵심 SQLAdapter./DataTable 함수를 구현하는 방법

SqlConnection con = new SqlConnection(m_ConnectString); 
SqlCommand cmd = new SqlCommand(strQuery); 
SqlDataAdapter sda = new SqlDataAdapter(); 
// assign the transaction and connection to the command object 
cmd.Connection = con; 
sda.SelectCommand = cmd; 
DataTable dt = new DataTable(); 
// execute query and soak up results 
sda.Fill(dt); 
return dt; 

사람이이 코드를 구현할 수있는 방법을 제안 할 수 있습니다 지원되지 않는다는 추론, 닷넷 코어에 포트이 필요하십니까? 감사

+0

글쎄, 당신은 [SqlDataAdapter를]에 대한 참조 소스를보고 시작할 수 (http://referencesource.microsoft.com/#System.Data/System/Data/SqlClient/SqlDataAdapter.cs) 및 [DataTable을 ] (http://referencesource.microsoft.com/#System.Data/System/Data/DataTable.cs) 그리고 실제로 필요한 부분을 다시 구현하십시오 ... 또한 행운을 빈다. – Corak

+0

답장을 보내 주셔서 감사합니다. 나는 많은 사람들이이 문제에 부딪쳤을 것이라고 추측했으며, 그들은 프레임 워크의 일부를 구현함으로써 모든 문제를 해결하려고하지는 않는다. – Hughgo

+2

글쎄, 한 가지 문제는 .Net Core가'DataTable'에 대해 알지 못한다면'dt'를 리턴 할 수없고'DataTable'과 함께 작동하는 다른 모든 것들은 더 이상 작동하지 않는다는 것입니다. 그래서 문제는'DataTable'의 어떤 기능이 정말로 필요한가에 대한 것입니다. 대신에'DataReader'가 .Net Core에서 사용 가능하다면 그 대신에'DataReader'를 사용할 수 있습니까? – Corak

답변

9

UPDATE :이 대답은 (내가 쓴 당시의 최신 WAS) .NET의 핵심 1.x의에 해당한다. .NET Core 2.x (7 월/2017 년 베타 버전)를 사용하는 경우 Joe의 대답을 확인하십시오.

원래 대답은 : 권장

읽기 : Porting to .NET Core

내가 인용 :

  • System.Data합니다. 기본 계층은 이미 .NET Core, 즉 공급자 모델 및 SQL 클라이언트의 일부이지만 스키마 지원 및 DataTable/DataSet과 같은 일부 기능은 현재 사용할 수 없습니다.

SqlDataReader는 사용할 수 있지만 SqlAdapter 또는 DataTable은 사용할 수 없습니다.

System.Data.SqlClient NuGet 패키지를 추가하십시오. 그런 다음 당신이 할 수있는

...

var con = new SqlConnection("..."); 
var cmd = con.CreateCommand(); 
cmd.CommandText = "..."; 
var reader = cmd.ExecuteReader(); 
// populate your custom data structure 

당신을 위해 IList<Dictionary<string, object>> 일을합니까?

var results = new List<Dictionary<string, object>>(); 

while (reader.Read()) 
{ 
    results.Add(Enumerable.Range(0, reader.FieldCount).ToDictionary(reader.GetName, reader.GetValue)); 
} 
return results; 

그래서 지금 당신은 당신이 tutorial이 편리 경우에, 엔티티 프레임 워크 코어로 전환 할 않는 results[0]["FirstName"].ToString()

사용하여 읽을 수 있습니다.

+0

닫기하지만 시가가 없습니다. – ProfK

+0

일자 답. 더 이상 맞지 않습니다. –

+0

감사합니다. 답변을 업데이트했습니다. 이제는 지원된다는 점을 알아두면 좋습니다. –

6

DataAdapter/DataTable 대신 저수준 ADO.NET 인터페이스를 통한 CRUD 작업을 지원하는 .NET Core 용 기존 DAL 라이브러리 중 하나를 사용할 수 있습니다. 최근: 자동 SQL 문 생성, 추상 쿼리 및 간단한 레코드 CRUD 작업을 지원하는 공급자 독립 DAL을 게시했습니다.

는 예를 들어, 문제의 코드는 다음과 같은 방법으로 재 구현 할 수 있습니다

var con = new SqlConnection(m_ConnectString); 
var dbFactory = new NReco.Data.DbFactory(
    System.Data.SqlClient.SqlClientFactory.Instance); 
var dbCmdBuilder = new NReco.Data.DbCommandBuilder(dbFactory); 
var dbAdapter = new NReco.Data.DbDataAdapter(con, dbCmdBuilder); 

var selectRecordsList = dbAdapter.Select( 
    new Query("some_table")).ToList<Dictionary<string,object>>(); 

복잡한 SQL 쿼리를 응용 프로그램 수준의 데이터보기로 실행 될 수있다

dbCmdBuilder.Views["some_view"] = new DbDataView(
    @"SELECT @columns FROM Employee emp 
     LEFT JOIN Company c ON (c.Id=emp.CompanyId) 
     @where[ WHERE {0}] @orderby[ ORDER BY {0}] 
    ") { 
     FieldMapping = new Dictionary<string,string>() { 
     {"Id", "emp.Id"}, 
     {"*", "emp.*, c.Title as CompanyTitle"} 
     } 
    }; 
var someViewRS = dbAdapter.Select(new Query("some_view")).ToRecordSet(); 

NReco.Data 시도하려고하지 않습니다 SQL을 자체 쿼리 (예 : LINQ 않습니다)로 바꿉니다. 대신 비즈니스 로직 에서 간단한 DB 독립적 쿼리를 만들고 읽기 전용 테이블처럼 액세스하는 특수한 app-level 데이터 뷰로 복잡한 SQL 구문을 캡슐화 할 수 있습니다.

은 또한 (EF 코어에서 FromSql 같은) Select 메서드 오버로드와 직접 원시 SQL 쿼리를 지정할 수 있습니다 :

var userModels = dbAdapter.Select("select * from users where id={0}", 5).ToList<User>(); 
+0

모든 답변 주셔서 감사합니다. 나는 DataReader와 가벼운 데이터 테이블을 사용했다. (기본적으로리스트의리스트이다.) – Hughgo

+0

@Hughgo는 DataReader를 사용하는 가장 단순하고 (그리고 성능이 좋은) 솔루션이다. 나는 때때로 NReco.Data 라이브러리를 사용해 보시기 바랍니다. 질문이나 문제가있을 경우 언제든지 저에게 연락하십시오. –

+0

쿼리 개체가 명명 된 테이블로 제한되어있을 때 어떻게 그런 프로젝트를 시작 했습니까? 말 그대로 수백만 건의 사례가 있는데 데이터 소스 쿼리가 동적 SQL이거나 조인 등일 수있는 곳이 어디입니까? – ProfK

14

SqlDBAdapterDataTable가 지원됩니다.

VS2017 미리보기 15.3, 대상 .net 코어 2.0을 사용하고 System.Data.CommonSystem.Data.SqlClient에 NuGet 패키지를 추가해야합니다. 아래 코드.

자세한 내용은 https://blogs.msdn.microsoft.com/devfish/2017/05/15/exploring-datatable-and-sqldbadapter-in-asp-net-core-2-0/을 참조하십시오.

public static DataTable ExecuteDataTable(SqlConnection conn, CommandType cmdType, string cmdText, SqlParameter[] cmdParms) 
{ 
    DataTable dt = new DataTable(); 
    dt.Columns.Add("CustomerID"); 
    dt.Columns.Add("CustomerName"); 
    SqlDataReader dr = ExecuteReader(conn, cmdType, cmdText, cmdParms); 
    while (dr.Read()) 
    { 
     dt.Rows.Add(dr[0], dr[1]); 
    } 
    return dt; 
} 

public static DataTable ExecuteDataTableSqlDA(SqlConnection conn, CommandType cmdType, string cmdText, SqlParameter[] cmdParms) 
{ 
    System.Data.DataTable dt = new DataTable(); 
    System.Data.SqlClient.SqlDataAdapter da = new SqlDataAdapter(cmdText, conn); 
    da.Fill(dt); 
    return dt; 
} 
+0

VS2017 미리보기 15.3을 아직 사용하지 않았으므로이 개발을 알지 못했습니다. – Fabulous

+0

행복하게 도와 주셨습니다. –

+0

VS2017 미리보기 15.4부터는 여전히 System.Data.SqlClient의 시험판 버전이 필요합니다. – user3074376

관련 문제