سؤال

مرحبا يا شباب أريد تنفيذ بيان SQL الخاص بي، لكن لدي مشكلة Synatx، هل يمكن أن يساعدني شخص ما في فهم ما أقوم به من فضلك؟

شكرا، الرماد.

public void AddToDatabase(string[] WordArray, int Good, int Bad, int Remove)
{

    for (int WordCount = 0; WordCount < WordArray.Length; WordCount++)
    {
        string sSQL = "INSERT INTO WordDef (Word, Good, Bad, Remove) VALUES (" + WordArray[WordCount] + ", " + Good + ", " + Bad + ", " + Remove + ")";

        Debug.Print(sSQL);

        //Private m_recordset As ADODB.Recordset
        //Private m_connection As ADODB.Connection
        ADODB.Recordset RS;
        ADODB.Connection CN ;


        CN = new ADODB.Connection();
        RS = new ADODB.Recordset();

        CN.CursorLocation = ADODB.CursorLocationEnum.adUseClient;

        CN.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=doom_calc_dict.mdb;jet OLEDB:database";
        CN.Open(CN.ConnectionString,"","",0);

        object dummy = Type.Missing;

        CN.Execute(sSQL,out dummy,0);

        RS.Close(); 
        CN.Close(); 

        //string sSQL = "SELECT Word FROM WordDef WHERE Word='" + WordArray[WordCount] + "'";
        DatabaseTools.LoadDataFromDatabase(sSQL);
        //DatabaseTools.LoadDataFromDatabase(sSQL);

    }
}
هل كانت مفيدة؟

المحلول

أهم شيء تحتاج إلى إصلاحه هو استخدام معلمات الاستعلام بدلا من بناء السلسلة بشكل حيوي. هذا سيحسن الأداء والصيانة والأمن.

بالإضافة إلى ذلك، تريد استخدام كائنات ADO.NET مكتوبة بشدة الأحدث. تأكد من إضافة استخدام توجيهات System.Data.OleDb.

لاحظ ال using البيانات في هذا الرمز. أنها ستجعل بالتأكيد يتم إغلاق اتصالك عند الانتهاء منه. هذا مهم لأن اتصالات قاعدة البيانات هي مورد محدود وغير مدار.

أخيرا، لا تستخدم مجموعة كبيرة في التعليمات البرمجية الخاصة بك. كل ما تهتم به حقا هو القدرة على التكرار في مجموعة من الكلمات، لذلك تريد قبول IEnumerable<string> بدلا من صفيف. لا تقلق: ستتقبل هذه الوظيفة صفيف كحجة إذا كان هذا ما تحتاج إلى تمريره.

public void AddToDatabase(IEnumerable<string> Words, int Good, int Bad, int Remove)
{
    string sql = "INSERT INTO WordDef (Word, Good, Bad, Remove) VALUES (@Word, @Good, @Bad, @Remove)";

    using (OleDbConnection cn = new OleDbConnection("connection string here") )
    using (OleDbCommand cmd = new OleDbCommand(sql, cn))
    {
        cmd.Parameters.Add("@Word", OleDbType.VarChar);
        cmd.Parameters.Add("@Good", OleDbType.Integer).Value = Good;
        cmd.Parameters.Add("@Bad", OleDbType.Integer).Value = Bad;
        cmd.Parameters.Add("@Remove", OleDbType.Integer.Value = Remove;

        cn.Open();

        foreach (string word in Words)
        {
            cmd.Parameters[0].Value = word;
            cmd.ExecuteNonQuery();
        }
    }
}

شيء آخر: عند استخدام معلمات الاستعلام في OLEDB، من المهم التأكد من إضافتها بالترتيب.

تحديث: تم إصلاحه للعمل على VS 2005 / .NET 2.0 (قد اعتمد على ميزات VS 2008).

نصائح أخرى

سيظهر في البداية أنني لست مفيدا. ولكن في الحقيقة، أحاول مساعدتك، لذا يرجى أخذ ذلك بهذه الطريقة. تحتاج إلى القراءة هذه و هذه إحصائي بمجرد القيام بذلك، هنا بعض جيدة ونظيفة أمثلة ado.net.

جرب هذا (ويجب أن تجرب تشغيل SQL من خارج التطبيق الخاص بك):

string sSQL = "INSERT INTO WordDef (Word, Good, Bad, Remove) VALUES ('" + WordArray[WordCount] + "', " + Good + ", " + Bad + ", " + Remove + ");";

تحتاج إلى إضافة علامات اقتباس واحدة حول الوسيطة الأولى في عبارة SQL.

string sSQL = "INSERT INTO WordDef (Word, Good, Bad, Remove) VALUES ('" + WordArray[WordCount] + "', " + Good + ", " + Bad + ", " + Remove + ")";

تتطلب حقول الأحرف والتاريخ قيم تحيط بها "اقتباسات واحدة"

لا تحتاجها مثل هذا:

string query = "INSERT INTO Table_PersonInfo
(PersonID,Surname
,[Family Name]
,AddsOnName
,Street,Number
,PostalCode
,[City of Birth]
,[Year of Birth]
,[Phone Number])
 VALUES
 ('"+@personID+"'
, '"+ @surname + "' 
, '"+@familyname+"'
, '"+@nameExtension+"'
, '"+@street+"'
, '"+@houseNumber+"'
, '"+ @postalCode+"'
, '"+@yearofbirth+"'
, '"+@placeofbirth+"'
, '"+@phoneNumber+"')";
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top