2010-06-09 12 views
23

मैं अपने सी # एप्लिकेशन में SQL सर्वर डेटाबेस की सभी तालिका का नाम प्राप्त करना चाहता हूं। क्या यह संभव है? कृपया मुझे समाधान बताओ।क्या मुझे सी # एप्लिकेशन में SQL सर्वर डेटाबेस की सभी तालिकाओं का नाम मिल सकता है?

उत्तर

46

यह इस रूप में सरल है जो पहले से ही सही डेटाबेस से जुड़ा हुआ है।

+0

क्वेरी-आधारित विधियों पर इस विधि का एक लाभ यह है कि आप डेटाटेबल में तालिकाओं के बारे में मेटाडेटा प्राप्त करते हैं, जो क्वेरी का उपयोग करके सरल नहीं है। (लेकिन मुझे अभी एहसास हुआ कि आपको केवल नाम चाहिए :)) – apoorv020

6

भागो एक एसक्यूएल आदेश के लिए:

SELECT name FROM sysobjects WHERE xtype = 'U' 
4

एक ही रास्ता के लिए How to get a list of SQL Server databases देखें:

DataTable t = _conn.GetSchema("Tables"); 

जहां _conn एक SqlConnection ऑब्जेक्ट है:

System.Data.SqlClient.SqlConnection SqlCon = new System.Data.SqlClient.SqlConnection("server=192.168.0.1;uid=sa;pwd=1234"); 
SqlCon.Open(); 

System.Data.SqlClient.SqlCommand SqlCom = new System.Data.SqlClient.SqlCommand(); 
SqlCom.Connection = SqlCon; 
SqlCom.CommandType = CommandType.StoredProcedure; 
SqlCom.CommandText = "sp_databases"; 

System.Data.SqlClient.SqlDataReader SqlDR; 
SqlDR = SqlCom.ExecuteReader(); 

while(SqlDR.Read()) 
{ 
MessageBox.Show(SqlDR.GetString(0)); 
} 
+0

तुम भी संग्रहीत proc :) – slugster

+3

की जरूरत नहीं है इस डेटाबेस, टेबल नहीं है के रूप में पूछा गया तो सही ? –

4

आप एक डेटाबेस आप कुछ इस तरह कर सकते हैं से सभी तालिका नाम प्राप्त करना चाहते हैं;

string[] GetAllTables(SqlConnection connection) 
{ 
    List<string> result = new List<string>(); 
    SqlCommand cmd = new SqlCommand("SELECT name FROM sys.Tables", connection); 
    System.Data.SqlClient.SqlDataReader reader = cmd.ExecuteReader(); 
    while(reader.Read()) 
    result.Add(reader["name"].ToString()); 
    return result.ToArray(); 
} 

अन्य प्रतिक्रिया के प्रयोग से सभी डेटाबेस प्राप्त करें और प्रत्येक के लिए एक कनेक्शन बना सकते हैं और समारोह "GetAllTables" का उपयोग करें कि डाटाबेस से सभी तालिका नाम मिलता है।

+0

आपका कोड काम करता है। हालांकि आप कनेक्शन खोलने और बंद करने के लिए चूक गए। –

26

बस एक और समाधान:

public IList<string> ListTables() 
    { 
     List<string> tables = new List<string>(); 
     DataTable dt = _connection.GetSchema("Tables"); 
     foreach (DataRow row in dt.Rows) 
     { 
      string tablename = (string)row[2]; 
      tables.Add(tablename); 
     } 
     return tables; 
    } 
+6

क्या आपने स्लगर जवाब देखा है? –

+2

'(स्ट्रिंग) पंक्ति [2]; 'मेरी मदद की। धन्यवाद। –

3

एक और तरीका है, लेकिन उल्लेख के लायक: Microsoft.SqlServer.Smo.dll में निहित एपीआई बनाता बहुत पहुँच डेटाबेस के लिए:

private IEnumerable<string> getAllTables() 
{ 
    var sqlConnection = new System.Data.SqlClient.SqlConnection(connectionString); 
    var serverConnection = new Microsoft.SqlServer.Management.Common.ServerConnection(sqlConnection); 
    var server = new Microsoft.SqlServer.Management.Smo.Server(serverConnection); 
    var database = server.Databases[databaseName]; 
    foreach (Microsoft.SqlServer.Management.Smo.Table table in database.Tables) 
    { 
    yield return table.Name; 
    } 
} 

सबसे अच्छे बात कि Microsoft.SqlServer.Management.Smo.Table वस्तु स्कीमा, पटकथा, आदि बदलने जैसे कार्यों के सभी प्रकार के प्रदर्शन करने के लिए आप की अनुमति देता है ...

2

Yonexbat उत्तर का मेरा संस्करण

public System.Collections.Generic.Dictionary<string, string> GetAllTables(System.Data.SqlClient.SqlConnection _connection) 
{ 
    if (_connection.State == System.Data.ConnectionState.Closed) 
     _connection.Open(); 
    System.Data.DataTable dt = _connection.GetSchema("Tables"); 
    System.Collections.Generic.Dictionary<string, string> tables = new System.Collections.Generic.Dictionary<string, string>(); 
    foreach (System.Data.DataRow row in dt.Rows) 
    { 
     if (row[3].ToString().Equals("BASE TABLE", StringComparison.OrdinalIgnoreCase)) //ignore views 
     { 
      string tableName = row[2].ToString(); 
      string schema = row[1].ToString(); 
      tables.Add(tableName, schema); 
     } 
    } 
    _connection.Close(); 
    return tables; 
} 
+1

मुझे लगता है कि यह होना चाहिए 'अगर (पंक्ति [3]। टॉस्ट्रिंग()। बराबर ("आधार तालिका", स्ट्रिंग कॉम्पर्सन। ऑर्डिनल इग्नोरकेस)) – tic

+0

धन्यवाद धन्यवाद मैंने इसे सही किया है – irfandar

1

उसके जवाब के लिए स्लगस्टर के लिए धन्यवाद। डेटाबेस में तालिकाओं की सूची को देखने का तरीका विस्तारित स्पष्टीकरण यहां दिया गया है।

<div> 
    <asp:Button ID="GridViewTableListButton" runat="server" Text="List all Tables on server" 
     onclick="GridViewTableListButton_Click" /> 
    <asp:GridView ID="GridViewTableList" runat="server"> 
    </asp:GridView> 
</div> 

तो सी में # कोड पीछे निम्नलिखित समारोह जोड़ें::

protected void GridViewTableListButton_Click(object sender, EventArgs e) 
{ 
    objConn.Open(); 
    DataTable t = objConn.GetSchema("Tables"); 
    GridViewTableList.DataSource = t; 
    GridViewTableList.DataBind(); 
    objConn.Close(); 
} 

using System.Data; 

जोड़ने के लिए भूल नहीं और

एक asp.net रूप में

निम्नलिखित जोड़ें

SqlConnection objConn = new SqlConnection(); 

अपने माता पिता के वर्ग के भीतर आप पृष्ठ/के शीर्ष पर।

अपने Page_Load अंदर के साथ

:

objConn.ConnectionString = ConfigurationManager.ConnectionStrings[connString].ConnectionString; 

connString एक वर्ग फ़ाइल (connectionClass.cs कहा जाता है) है कि वेब में App_Code फ़ोल्डर में संग्रहीत किया जाता

public class connectionClass 
{ 
..... 
    public string connClass() 
    { 
     connString = "LocalSqlServer"; // LOCAL home PC Version 
    } 
} 

तो अंत में।config

<add name="LocalSqlServer" connectionString="Data Source=MyPCsName\SQLEXPRESS;Initial Catalog=databasename;Integrated Security=True" providerName="System.Data.SqlClient"/> 

उदाहरण

3

मैं इस ExtensionMethodSqlConnection के लिए उपयोग कर रहा हूँ के लिए:

public static List<string> GetTableNames(this SqlConnection connection) 
{ 
    using(SqlConnection conn = connection) 
    { 
     if(conn.State == ConnectionState.Open) 
     { 
      return conn.GetSchema("Tables").AsEnumerable().Select(s => s[2].ToString()).ToList(); 
     }    
    } 
    //Add some error-handling instead ! 
    return new List<string>();   
} 
संबंधित मुद्दे