खोज…


परिचय

ADO (ActiveX डेटा ऑब्जेक्ट) .Net Microsoft द्वारा प्रदान किया गया एक उपकरण है जो अपने घटकों के माध्यम से SQL सर्वर, Oracle और XML जैसे डेटा स्रोतों तक पहुँच प्रदान करता है। एक बार जब वे उचित विशेषाधिकार के लिए ADO.Net के माध्यम से डेटा स्रोत से जुड़े होते हैं, तो .Net फ्रंट-एंड एप्लिकेशन डेटा को पुनः प्राप्त, बना और जोड़ सकते हैं।

ADO.Net एक कनेक्शन-कम आर्किटेक्चर प्रदान करता है। यह एक डेटाबेस के साथ बातचीत करने के लिए एक सुरक्षित दृष्टिकोण है, क्योंकि, कनेक्शन पूरे सत्र के दौरान बनाए रखने की आवश्यकता नहीं है।

टिप्पणियों

Parameters.AddWithValue साथ SQLs के Parameters.AddWithValue पर एक नोट: AddWithValue एक अच्छा शुरुआती बिंदु नहीं है। वह विधि उस डेटा के प्रकार पर निर्भर करती है, जिसमें से पारित किया गया है। इसके साथ, आप ऐसी स्थिति में समाप्त हो सकते हैं जहां रूपांतरण आपकी क्वेरी को अनुक्रमणिका का उपयोग करने से रोकता है। ध्यान दें कि कुछ SQL सर्वर डेटा प्रकार, जैसे कि char / varchar (पूर्ववर्ती "n" के बिना) या date में एक संबंधित .NET सर्वर प्रकार नहीं है। उन मामलों में, इसके बजाय सही डेटा प्रकार के साथ Add उपयोग किया जाना चाहिए

आदेश के रूप में SQL कथन निष्पादित करना

// Uses Windows authentication. Replace the Trusted_Connection parameter with
// User Id=...;Password=...; to use SQL Server authentication instead. You may
// want to find the appropriate connection string for your server.
string connectionString = @"Server=myServer\myInstance;Database=myDataBase;Trusted_Connection=True;"

string sql = "INSERT INTO myTable (myDateTimeField, myIntField) " +
    "VALUES (@someDateTime, @someInt);";

// Most ADO.NET objects are disposable and, thus, require the using keyword.
using (var connection = new SqlConnection(connectionString))
using (var command = new SqlCommand(sql, connection))
{
    // Use parameters instead of string concatenation to add user-supplied
    // values to avoid SQL injection and formatting issues. Explicitly supply datatype.

    // System.Data.SqlDbType is an enumeration. See Note1
    command.Parameters.Add("@someDateTime", SqlDbType.DateTime).Value = myDateTimeVariable;
    command.Parameters.Add("@someInt", SqlDbType.Int).Value = myInt32Variable;

    // Execute the SQL statement. Use ExecuteScalar and ExecuteReader instead
    // for query that return results (or see the more specific examples, once
    // those have been added).

    connection.Open();
    command.ExecuteNonQuery();
}

नोट 1: कृपया MSFT SQL सर्वर-विशिष्ट भिन्नता के लिए SqlDbType Enumeration देखें।

नोट 2: कृपया MySQL- विशिष्ट भिन्नता के लिए MySqlDbType Enumeration देखें।

सर्वोत्तम प्रथाएँ - Sql कथन का निष्पादन

public void SaveNewEmployee(Employee newEmployee)
{
    // best practice - wrap all database connections in a using block so they are always closed & disposed even in the event of an Exception
    // best practice - retrieve the connection string by name from the app.config or web.config (depending on the application type) (note, this requires an assembly reference to System.configuration)
    using(SqlConnection con = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["MyConnectionName"].ConnectionString))
    {
        // best practice - use column names in your INSERT statement so you are not dependent on the sql schema column order
        // best practice - always use parameters to avoid sql injection attacks and errors if malformed text is used like including a single quote which is the sql equivalent of escaping or starting a string (varchar/nvarchar)
        // best practice - give your parameters meaningful names just like you do variables in your code
        using(SqlCommand sc = new SqlCommand("INSERT INTO employee (FirstName, LastName, DateOfBirth /*etc*/) VALUES (@firstName, @lastName, @dateOfBirth /*etc*/)", con))
        {
            // best practice - always specify the database data type of the column you are using
            // best practice - check for valid values in your code and/or use a database constraint, if inserting NULL then use System.DbNull.Value
            sc.Parameters.Add(new SqlParameter("@firstName", SqlDbType.VarChar, 200){Value = newEmployee.FirstName ?? (object) System.DBNull.Value});
            sc.Parameters.Add(new SqlParameter("@lastName", SqlDbType.VarChar, 200){Value = newEmployee.LastName ?? (object) System.DBNull.Value});

            // best practice - always use the correct types when specifying your parameters, Value is assigned to a DateTime instance and not a string representation of a Date
            sc.Parameters.Add(new SqlParameter("@dateOfBirth", SqlDbType.Date){ Value = newEmployee.DateOfBirth });

            // best practice - open your connection as late as possible unless you need to verify that the database connection is valid and wont fail and the proceeding code execution takes a long time (not the case here)
            con.Open();
            sc.ExecuteNonQuery();
        }

        // the end of the using block will close and dispose the SqlConnection
        // best practice - end the using block as soon as possible to release the database connection
    }
}

// supporting class used as parameter for example
public class Employee
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public DateTime DateOfBirth { get; set; }
}

ADO.NET के साथ काम करने के लिए सबसे अच्छा अभ्यास

  • अंगूठे का नियम न्यूनतम समय के लिए कनेक्शन खोलना है। एक बार आपकी प्रक्रिया निष्पादित हो जाने पर कनेक्शन को स्पष्ट रूप से बंद कर दें, कनेक्शन पूल में कनेक्शन ऑब्जेक्ट वापस आ जाएगा। डिफ़ॉल्ट कनेक्शन पूल अधिकतम आकार = 100. कनेक्शन पूलिंग के रूप में SQL सर्वर पर भौतिक कनेक्शन के प्रदर्शन को बढ़ाता है। SQL सर्वर में कनेक्शन पूलिंग
  • एक का उपयोग कर ब्लॉक में सभी डेटाबेस कनेक्शन लपेटें ताकि वे एक अपवाद की स्थिति में भी हमेशा बंद और निपटाए जाएं। कथन का उपयोग करने के बारे में अधिक जानकारी के लिए कथन (C # संदर्भ) का उपयोग करना देखें
  • एप्लिकेशन से नाम से कनेक्शन स्ट्रिंग्स को पुनः प्राप्त करें। webfig या web.config (आवेदन प्रकार के आधार पर)
  • हमेशा आने वाले मूल्यों के लिए मापदंडों का उपयोग करें
    • Sql इंजेक्शन के हमलों से बचें
    • त्रुटियों से बचें अगर विकृत पाठ का उपयोग किया जाता है जैसे कि एक एकल उद्धरण जो कि बचने या एक स्ट्रिंग शुरू करने के लिए sql के बराबर है (varchar / nvarchar)
    • डेटाबेस प्रदाता को क्वेरी योजनाओं (सभी डेटाबेस प्रदाताओं द्वारा समर्थित नहीं) को पुन: उपयोग करने दें जो दक्षता बढ़ाता है
  • मापदंडों के साथ काम करते समय
    • Sql पैरामीटर प्रकार और आकार बेमेल सम्मिलित / अद्यतन / चयन विफलता का एक सामान्य कारण है
    • जैसे आप अपने कोड में वेरिएबल करते हैं, वैसे ही अपने Sql पैरामीटर को सार्थक नाम दें
    • आपके द्वारा उपयोग किए जा रहे कॉलम के डेटाबेस डेटा प्रकार को निर्दिष्ट करें, यह सुनिश्चित करता है कि गलत पैरामीटर प्रकारों का उपयोग नहीं किया गया है जिससे अप्रत्याशित परिणाम हो सकते हैं
    • आदेश में पास करने से पहले अपने आने वाले मापदंडों को मान्य करें (जैसा कि कहा जाता है, " कचरा, कचरा बाहर ")। आवक के रूप में जल्द से जल्द आने वाले मूल्यों को मान्य करें
    • अपने पैरामीटर मानों को निर्दिष्ट करते समय सही प्रकारों का उपयोग करें, उदाहरण: डेटाइम के स्ट्रिंग मान को असाइन न करें, इसके बजाय पैरामीटर के मान के लिए एक वास्तविक डेटटाइम उदाहरण निर्दिष्ट करें
    • स्ट्रिंग-प्रकार के मापदंडों के आकार को निर्दिष्ट करें। ऐसा इसलिए है क्योंकि यदि पैरामीटर प्रकार और आकार में मेल खाते हैं, तो SQL सर्वर निष्पादन योजनाओं का फिर से उपयोग कर सकता है। MAX के लिए -1 का उपयोग करें
    • AddWithValue विधि का उपयोग न करें, मुख्य कारण यह है कि पैरामीटर प्रकार या सटीक / पैमाने को निर्दिष्ट करने के लिए भूल जाने पर बहुत आसान है। अतिरिक्त जानकारी के लिए क्या हम AddWithValue का उपयोग करना बंद कर सकते हैं ?
  • डेटाबेस कनेक्शन का उपयोग करते समय
    • जितनी जल्दी हो सके कनेक्शन खोलें और जितनी जल्दी हो सके इसे बंद कर दें। किसी भी बाहरी संसाधन के साथ काम करते समय यह एक सामान्य दिशानिर्देश है
    • डेटाबेस कनेक्शन के उदाहरणों को कभी साझा न करें (उदाहरण: एक सिंगलटन प्रकार SqlConnection का साझा उदाहरण होस्ट)। क्या आपका कोड हमेशा जरूरत पड़ने पर एक नया डेटाबेस कनेक्शन उदाहरण बनाता है और फिर कॉलिंग कोड का निपटान करता है और जब यह किया जाता है तो इसे "फेंक दें"। इसका कारण है
      • अधिकांश डेटाबेस प्रदाताओं में कुछ प्रकार के कनेक्शन पूलिंग होते हैं इसलिए नए प्रबंधित कनेक्शन बनाना सस्ता होता है
      • यदि कोड कई थ्रेड के साथ काम करना शुरू करता है तो यह भविष्य की किसी भी त्रुटि को समाप्त करता है

विक्रेता विशिष्ट वर्गों को दूर करने के लिए आम इंटरफेस का उपयोग करना

var providerName = "System.Data.SqlClient";    //Oracle.ManagedDataAccess.Client, IBM.Data.DB2
var connectionString = "{your-connection-string}";
//you will probably get the above two values in the ConnectionStringSettings object from .config file

var factory = DbProviderFactories.GetFactory(providerName);
using(var connection = factory.CreateConnection()) {    //IDbConnection
    connection.ConnectionString = connectionString;
    connection.Open();
    
    using(var command = connection.CreateCommand()) {    //IDbCommand
        command.CommandText = "{query}";
        
        using(var reader = command.ExecuteReader()) {    //IDataReader
            while(reader.Read()) {
                ...
            }
        }
    }
}


Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow