मैंने एक DataTable को SQL टेबल में डालने के बारे में बहुत सारी पोस्ट पढ़ी हैं, लेकिन क्या एक .NET DataTable में SQL टेबल को खींचने का एक आसान तरीका है?
मैंने एक DataTable को SQL टेबल में डालने के बारे में बहुत सारी पोस्ट पढ़ी हैं, लेकिन क्या एक .NET DataTable में SQL टेबल को खींचने का एक आसान तरीका है?
जवाबों:
यहाँ, यह एक शॉट (यह सिर्फ एक छद्म है)
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)
var table = new DataTable();
using (var da = new SqlDataAdapter("SELECT * FROM mytable", "connection string"))
{
da.Fill(table);
}
using
यदि आप इसके पूर्ण समतुल्य को समझें, तो आप इतना निराश न हों ।
Using
?? यह तिरस्कार की तरह है With
या Try-Catch
। मैं उल्टा हूँ; जब मैं किसी वर्ग द्वारा समर्थित नहीं हूं तो मैं निराश हूं।
बहुत सारे तरीके।
ADO.Net का उपयोग करें और डेटाटेबल प्राप्त करने के लिए डेटा एडॉप्टर पर फिल का उपयोग करें:
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 या एंटिटी फ्रेमवर्क का उपयोग करके प्राप्त कर सकते हैं) आपका जीवन बहुत आसान हो जाएगा।
संपादित करें: शायद मैं स्पष्ट नहीं था: डेटाटेबल्स = अच्छा, डेटासेट = बुराई। यदि आप ADO.Net का उपयोग कर रहे हैं तो आप इन दोनों तकनीकों (EF, linq2sql, dapper, nhibernate, orm of the month) का उपयोग कर सकते हैं क्योंकि वे आम तौर पर ado.net के शीर्ष पर बैठते हैं। आपको जो लाभ मिलता है वह यह है कि आप अपने मॉडल को बहुत आसान से अपडेट कर सकते हैं क्योंकि आपके स्कीमा में परिवर्तन होता है बशर्ते आपके पास कोड जनरेशन द्वारा एब्स्ट्रैक्शन का सही स्तर हो।
Ado.net एडाप्टर उन प्रदाताओं का उपयोग करता है जो डेटाबेस के प्रकार की जानकारी को उजागर करते हैं, उदाहरण के लिए यह एक sql सर्वर प्रदाता का उपयोग करता है, आप प्लग इन भी कर सकते हैं - उदाहरण के लिए - डेस्टार्ट पोस्टग्रेटर प्रदाता और फिर भी उस प्रकार की जानकारी तक पहुंच प्राप्त करें जो तब होगी आपको अपनी पसंद के ऑरम का उपयोग करने की अनुमति देता है (लगभग दर्द रहित - कुछ quirks हैं) - मेरा मानना है कि 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
आँखों पर बेहतर दिखता है, लेकिन डेटा एडेप्टर बेहतर प्रदर्शन करता है (यह भ्रमित करने के लिए नहीं कि एक डीबी दूसरे को बेहतर बनाता है, प्रश्न अलग थे)। हालांकि दोनों के बीच अंतर क्वेरी पर निर्भर था। इसका कारण यह हो सकता है कि DataAdapters पर पंक्तियों (इसकी एक विधि ) को जोड़ते समय दस्तावेज़ सेLoad
पंक्ति द्वारा पंक्ति की जाँच करने के लिए विभिन्न अवरोधों की आवश्यकता होती है जो DataAdapters पर होती है जो डेटाटेबल्स के तेज़ निर्माण के लिए डिज़ाइन किए गए थे।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;
}
}