c # ado, net का उपयोग करके sql सर्वर डेटाबेस में रो सम्मिलित करने का प्रयास करें
मैं एक कंसोल अनुप्रयोग में Ado.Net का उपयोग करके SQL सर्वर डेटाबेस में एक पंक्ति सम्मिलित करने का प्रयास कर रहा हूं मैं कीबोर्ड से इनपुट पढ़ रहा हूं ...।
यहाँ मेरा कोड है:
private void InsertStudents(string con)
{
SqlConnection Connection = new SqlConnection(con);
SqlDataAdapter adapter = new SqlDataAdapter();
int id = Convert.ToInt32(Console.ReadLine());
string firstName = Console.ReadLine();
string lastName = Console.ReadLine();
DateTime dateOfBirth = Convert.ToDateTime(Console.ReadLine());
double tuitionFees = Convert.ToDouble(Console.ReadLine());
string sql = "$insert into product (ID,FirstName,LastName,DateOfBirth,TuitionFees) values {id}, {firstName}, {lastName}, {dateOfBirth}, {tuitionFees})";
try
{
Connection.Open();
adapter.InsertCommand = new SqlCommand(sql, Connection);
adapter.InsertCommand.ExecuteNonQuery();
Console.WriteLine(" 1 Row inserted!");
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
}
मेरी समस्या यह है कि संकलक मेरी प्रक्षेपित स्ट्रिंग को एक स्ट्रिंग के रूप में पढ़ता है लेकिन स्तंभों को चर के रूप में नहीं पहचानता है ... यह पूरी पंक्ति को एक स्ट्रिंग के रूप में पढ़ता है। समस्या क्या है?
जवाब
यह बहुत महत्वपूर्ण है: एसक्यूएल के साथ प्रक्षेपित तारों का उपयोग न करें; यह हर तरह से खराब है :
- सुरक्षा: SQL इंजेक्शन
- प्रदर्शन: क्वेरी योजना का पुन: उपयोग
- विश्वसनीयता: जैसे आरक्षित प्रतीकों के साथ भंगुरता
' - शुद्धता: i18n / l10n (यानी स्वरूपण) मुद्दे - विशेष रूप से
DateTimeमूल्य के लिए प्रासंगिक (जन्म तिथि, 7 नवंबर की "07/11/2020" या जुलाई की 11 वीं तारीख है?) - लेकिन ट्यूशन फीस राशि (भी) "123,456", अल्पविराम एक दशमलव विभाजक (फ्रांस एट अल)? या एक समूह विभाजक है?)
सही दृष्टिकोण पैरामीटर है । हमेशा।
तो, SQL की तरह:
insert into product (ID,FirstName,LastName,DateOfBirth,TuitionFees)
values (@id, @firstName, @lastName, @dateOfBirth, @tuitionFees)
और ऐसा करने के लिए, या तो ADO.NET पैरामीटर के बारे में जानें, या: Dapper जैसे टूल का उपयोग करें जो इसे सरल बनाता है:
int id = ...
string firstName = ...
string lastName = ...
DateTime dateOfBirth = ...
double tuitionFees = ...
using var conn = new SqlConnection(con); // Dapper will deal with the open/close
conn.Execute(@"
insert into product (ID,FirstName,LastName,DateOfBirth,TuitionFees)
values (@id, @firstName, @lastName, @dateOfBirth, @tuitionFees)",
new { id, firstName, lastName, dateOfBirth, tuitionFees });
इसके अलावा, अंतिम नोट: doubleमुद्रा के लिए उपयोग न करें ; का उपयोग करें decimal। doubleमुद्रा राशियों के लिए उपयुक्त नहीं है।
आपने स्ट्रिंग के अंदर डॉलर चिन्ह को रखा है, बजाय इसके सामने। यह होना चाहिए:
string sql = $"insert into product (ID,FirstName,LastName,DateOfBirth,TuitionFees) values {id}, {firstName}, {lastName}, {dateOfBirth}, {tuitionFees})";