Ich habe viele Beiträge zum Einfügen einer DataTable in eine SQL-Tabelle gelesen. Gibt es jedoch eine einfache Möglichkeit, eine SQL-Tabelle in eine .NET DataTable zu ziehen?
Probieren Sie es hier aus (dies ist nur ein Pseudocode)
usingSystem;usingSystem.Data;usingSystem.Data.SqlClient;publicclassPullDataTest{// your data tableprivateDataTable dataTable =newDataTable();publicPullDataTest(){}// your method to pull data from database to datatable publicvoidPullData(){string connString =@"your connection string here";string query ="select * from table";SqlConnection conn =newSqlConnection(connString);SqlCommand cmd =newSqlCommand(query, conn);
conn.Open();// create data adapterSqlDataAdapter da =newSqlDataAdapter(cmd);// this will query your database and return the result to your datatable
da.Fill(dataTable);
conn.Close();
da.Dispose();}}
Das datatableFeld muss vor dem Aufruf initialisiert werdenda.Fill(dataTable)
Dabblernl
@ yonan2236 Was ist mit dem Ausgabeparameter von t sql neben datatable? Wie bekomme ich auch Ausgabeparameter? Ist es möglich? Stichprobe?
Ahmad Ebrahimi
1
Dieser Code ist fehleranfällig und es wird nicht empfohlen, die verfügbaren Ressourcen auf diese Weise zu verwenden. Die saubere Lösung finden Sie in der Antwort von @Tim Rogers.
Xan-Kun Clark-Davis
Abgesehen davon, schauen Sie sich LINQ an (falls noch nicht geschehen), da es hier wirklich etwas zaubern kann :-)
Xan-Kun Clark-Davis
77
var table =newDataTable();using(var da =newSqlDataAdapter("SELECT * FROM mytable","connection string")){
da.Fill(table);}
@ Xan-KunClark-Davis: Der Code in der akzeptierten Antwort verliert Ressourcen, wenn eine Ausnahme ausgelöst wird. Sie könnten nicht usingso sehr verachten , wenn Sie das vollständige Äquivalent verstanden hätten.
Ben Voigt
@ Xan-KunClark-Davis Warum würdest du verachten Using? Das ist wie Verachtung Withoder Try-Catch. Ich bin das Gegenteil; Ich bin enttäuscht, wenn es nicht von einer Klasse unterstützt wird.
SteveCinq
11
Viele Möglichkeiten.
Verwenden Sie ADO.Net und verwenden Sie fill auf dem Datenadapter, um eine Datentabelle zu erhalten:
using(SqlDataAdapter dataAdapter=newSqlDataAdapter("SELECT blah FROM blahblah ", sqlConn)){// create the DataSet DataSet dataSet =newDataSet();// fill the DataSet using our DataAdapter
dataAdapter.Fill(dataSet);}
Sie können dann die Datentabelle aus dem Datensatz abrufen.
Hinweis im aktualisierten Antwortdatensatz wird nicht verwendet (erscheint nach meiner Antwort)
// create data adapterSqlDataAdapter da =newSqlDataAdapter(cmd);// this will query your database and return the result to your datatable
da.Fill(dataTable);
Welches ist mir vorzuziehen.
Ich würde jedoch dringend empfehlen, sich das Entity Framework anzusehen ... die Verwendung von Datentabellen und Datasets ist keine gute Idee. Es gibt keine Typensicherheit, was bedeutet, dass das Debuggen nur zur Laufzeit durchgeführt werden kann. Mit stark typisierten Sammlungen (die Sie mit LINQ2SQL oder dem Entity Framework erhalten können) wird Ihr Leben viel einfacher.
Edit: Vielleicht war mir nicht klar: Datatables = gut, Datasets = böse. Wenn Sie ADO.Net verwenden, können Sie beide Technologien (EF, linq2sql, dapper, nhibernate oder orm des Monats) verwenden, da sie sich normalerweise auf ado.net befinden. Der Vorteil, den Sie erhalten, besteht darin, dass Sie Ihr Modell viel einfacher aktualisieren können, wenn sich Ihr Schema ändert, vorausgesetzt, Sie verfügen über die richtige Abstraktionsebene, indem Sie die Codegenerierung nutzen.
Der ado.net-Adapter verwendet Anbieter, die die Typinformationen der Datenbank verfügbar machen. Standardmäßig wird beispielsweise ein SQL Server-Anbieter verwendet. Sie können beispielsweise auch den devart postgress-Anbieter anschließen und trotzdem auf die Typinformationen zugreifen, die dann angezeigt werden Erlauben Sie Ihnen, wie oben beschrieben Ihren Orm Ihrer Wahl zu verwenden (fast schmerzlos - es gibt ein paar Macken) - ich glaube, Microsoft bietet auch einen Orakel-Anbieter an. Der GESAMTE Zweck ist es, wenn möglich von der Datenbankimplementierung abzuweichen.
Typisierte Datensätze verfügen wie EF über Typensicherheit und stark typisierte Sammlungen. Dies gilt jedoch nur, wenn Ihre App eng mit der Datenbank verbunden ist. Wenn Sie ein Tool schreiben, das mit vielen verschiedenen Datenbanken arbeiten muss, ist die Typensicherheit ein hoffnungsloser Wunsch.
Ross Presser
1
Typisierte Datensätze in .net sind eine schreckliche Kreation von XML-Wahnsinn und Leid. Ich habe noch nie an einem Ort gearbeitet, der bereit ist, den Aufwand für die Verwaltung all dessen für Datensätze mit Microsoft-Typ-Typ zu akzeptieren. Ich denke nicht einmal, dass Microsoft dies heutzutage für sinnvoll hält. Was die Typensicherheit mit mehreren Datenbanken betrifft, können Sie sie natürlich erhalten - der Punkt ist, dass Sie sie so schnell wie möglich in eine typisierte Sammlung konvertieren und diese weitergeben, damit Sie die Typprobleme auf einen bestimmten Ort beschränken. Orms hilft dabei und funktioniert perfekt mit mehreren Datenbanken. Wenn Sie EF nicht mögen, verwenden Sie etwas Leichteres wie Dapper.
John Nicholas
1
Du hast mich nicht verstanden. Wenn Sie ein Allzweck-Tool schreiben, das keine Ahnung hat, mit welcher Art von Datenbank eine Verbindung hergestellt werden soll, ist die Typensicherheit ein hoffnungsloser Wunsch.
Ross Presser
1
SQL ist gegeben. Außerdem, wenn Sie nicht wissen, welche Art von Datenbank, warum muss es dann überhaupt eine Datenbank sein? Was wäre die Anwendung eines solchen generischen Tools? Wenn Sie jemals eine Verbindung zu Datenbanken herstellen müssen, die wirklich so radikal anders sind, würden Sie hinter einem Repository-Muster davon abstrahieren, und innerhalb dieses würden Sie verschiedene spezialisierte Datenbankadapter benötigen, und an diesem Punkt würden Sie die Einzelheiten kennen. Die Tatsache, dass Code verbraucht wird, hat Typerwartungen -> Typzusicherungen im Adapter. Ihre Einschränkung bedeutet, dass Sie keine Ahnung von der Datenbanksprache haben und daher keine Abfragen durchführen können.
John Nicholas
3
Angenommen, Sie haben einen SSMS-Klon geschrieben?
Ross Presser
9
Die herstellerunabhängige Version basiert ausschließlich auf ADO.NET-Schnittstellen. 2 Wege:
publicDataTableRead1<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 =newDataTable();
table.Load(cmd.ExecuteReader());return table;}}}publicDataTableRead2<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 =newDataSet();//conn is opened by dataadapter
da.Fill(ds);return ds.Tables[0];}}}}
Ich habe einige Leistungstests durchgeführt, und der zweite Ansatz hat den ersten immer übertroffen.
Read1sieht auf den Augen besser aus, aber der Datenadapter funktioniert besser (nicht zu verwechseln, dass eine Datenbank die andere übertrifft, die Abfragen waren alle unterschiedlich). Der Unterschied zwischen den beiden hing jedoch von der Abfrage ab. Der Grund könnte sein, dass beim Hinzufügen von Zeilen (es ist eine Methode aktiviert ) zeilenweise Loadverschiedene Einschränkungen aus der Dokumentation überprüft werden müssen, DataTablewährend FillDataAdapters verwendet werden, die nur dafür entwickelt wurden - schnelle Erstellung von DataTables.
Sie müssen das DataTable.Load()mit umgeben .BeginLoadData()und .EndLoadData()die gleiche Geschwindigkeit wie mit dem erreichen DataSet.
Nikola Bogdanović
1
Centerlized Model: Sie können es von jedem Ort aus verwenden!
Sie müssen nur Below Format von Ihrer Funktion zu dieser Klasse aufrufen
DataSet ds =newDataSet();SqlParameter[] p =newSqlParameter[1];stringQuery="Describe Query Information/either sp, text or TableDirect";DbConnectionHelper dbh =newDbConnectionHelper();
ds = dbh.DBConnection("Here you use your Table Name", p ,stringQuery,CommandType.StoredProcedure);
Das ist es. Es ist die perfekte Methode.
publicclassDbConnectionHelper{publicDataSetDBConnection(stringTableName,SqlParameter[] p,stringQuery,CommandType cmdText){string connString =@"your connection string here";//Object DeclarationDataSet ds =newDataSet();SqlConnection con =newSqlConnection();SqlCommand cmd =newSqlCommand();SqlDataAdapter sda =newSqlDataAdapter();try{//Get Connection string and Make Connection
con.ConnectionString= connString;//Get the Connection Stringif(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;}}
Antworten:
Probieren Sie es hier aus (dies ist nur ein Pseudocode)
quelle
datatable
Feld muss vor dem Aufruf initialisiert werdenda.Fill(dataTable)
quelle
using
so sehr verachten , wenn Sie das vollständige Äquivalent verstanden hätten.Using
? Das ist wie VerachtungWith
oderTry-Catch
. Ich bin das Gegenteil; Ich bin enttäuscht, wenn es nicht von einer Klasse unterstützt wird.Viele Möglichkeiten.
Verwenden Sie ADO.Net und verwenden Sie fill auf dem Datenadapter, um eine Datentabelle zu erhalten:
Sie können dann die Datentabelle aus dem Datensatz abrufen.
Hinweis im aktualisierten Antwortdatensatz wird nicht verwendet (erscheint nach meiner Antwort)
Welches ist mir vorzuziehen.
Ich würde jedoch dringend empfehlen, sich das Entity Framework anzusehen ... die Verwendung von Datentabellen und Datasets ist keine gute Idee. Es gibt keine Typensicherheit, was bedeutet, dass das Debuggen nur zur Laufzeit durchgeführt werden kann. Mit stark typisierten Sammlungen (die Sie mit LINQ2SQL oder dem Entity Framework erhalten können) wird Ihr Leben viel einfacher.
Edit: Vielleicht war mir nicht klar: Datatables = gut, Datasets = böse. Wenn Sie ADO.Net verwenden, können Sie beide Technologien (EF, linq2sql, dapper, nhibernate oder orm des Monats) verwenden, da sie sich normalerweise auf ado.net befinden. Der Vorteil, den Sie erhalten, besteht darin, dass Sie Ihr Modell viel einfacher aktualisieren können, wenn sich Ihr Schema ändert, vorausgesetzt, Sie verfügen über die richtige Abstraktionsebene, indem Sie die Codegenerierung nutzen.
Der ado.net-Adapter verwendet Anbieter, die die Typinformationen der Datenbank verfügbar machen. Standardmäßig wird beispielsweise ein SQL Server-Anbieter verwendet. Sie können beispielsweise auch den devart postgress-Anbieter anschließen und trotzdem auf die Typinformationen zugreifen, die dann angezeigt werden Erlauben Sie Ihnen, wie oben beschrieben Ihren Orm Ihrer Wahl zu verwenden (fast schmerzlos - es gibt ein paar Macken) - ich glaube, Microsoft bietet auch einen Orakel-Anbieter an. Der GESAMTE Zweck ist es, wenn möglich von der Datenbankimplementierung abzuweichen.
quelle
Die herstellerunabhängige Version basiert ausschließlich auf ADO.NET-Schnittstellen. 2 Wege:
Ich habe einige Leistungstests durchgeführt, und der zweite Ansatz hat den ersten immer übertroffen.
Read1
sieht auf den Augen besser aus, aber der Datenadapter funktioniert besser (nicht zu verwechseln, dass eine Datenbank die andere übertrifft, die Abfragen waren alle unterschiedlich). Der Unterschied zwischen den beiden hing jedoch von der Abfrage ab. Der Grund könnte sein, dass beim Hinzufügen von Zeilen (es ist eine Methode aktiviert ) zeilenweiseLoad
verschiedene Einschränkungen aus der Dokumentation überprüft werden müssen,DataTable
währendFill
DataAdapters verwendet werden, die nur dafür entwickelt wurden - schnelle Erstellung von DataTables.quelle
DataTable.Load()
mit umgeben.BeginLoadData()
und.EndLoadData()
die gleiche Geschwindigkeit wie mit dem erreichenDataSet
.Centerlized Model: Sie können es von jedem Ort aus verwenden!
Sie müssen nur Below Format von Ihrer Funktion zu dieser Klasse aufrufen
Das ist es. Es ist die perfekte Methode.
quelle