سؤال

وأنا باستخدام C # و. NET 3.5. ولست بحاجة لتوليد وتخزين بعض البيانات إدراج T-SQL التي سيتم تنفيذها لاحقا على ملقم بعيد.

وعلى سبيل المثال، لدي مجموعة من الموظفين:

new Employee[]
{
   new Employee { ID = 5, Name = "Frank Grimes" },
   new Employee { ID = 6, Name = "Tim O'Reilly" }
}

وأنا بحاجة لينتهي مع مجموعة من السلاسل، مثل هذا:

"INSERT INTO Employees (id, name) VALUES (5, 'Frank Grimes')",
"INSERT INTO Employees (id, name) VALUES (6, 'Tim O''Reilly')"

وأنا أبحث في بعض التعليمات البرمجية التي تخلق البيانات إدراج مع String.Format، ولكن هذا لا يشعر الحق. فكرت في استخدام SqlCommand (على أمل أن تفعل شيء من هذا القبيل هذا )، لكنه لا يقدم طريقة للجمع بين نص الأمر مع المعلمات.

هل يكفي فقط لاستبدال علامات الاقتباس المفردة وبناء سلسلة؟

string.Format("INSERT INTO Employees (id, name) VALUES ({0}, '{1}')",
    employee.ID,
    replaceQuotes(employee.Name)
    );

وماذا يجب أن يكون بالقلق إزاء عند القيام بذلك؟ مصدر البيانات هو آمنة إلى حد كبير، لكنني لا أريد أن جعل الكثير من الافتراضات.

وتحرير: فقط أريد أن أشير إلى أنه في هذه الحالة، وأنا لم يكن لديك SqlConnection أو أي وسيلة للتواصل مباشرة إلى SQL Server. يحتاج هذا التطبيق معين لتوليد البيانات SQL والانتظار عنها ليتم تنفيذها في مكان آخر - وإلا سأكون باستخدام SqlCommand.Parameters.AddWithValue ()

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

المحلول

استخدم parameterised الأوامر. تمرير المعلمات على طول على الخادم الخاص بك عن بعد أيضا، والحصول على هذا الدعوة إلى SQL Server، لا يزال الحفاظ على التمييز بين SQL نفسها وقيم المعلمات.

وطالما أنك لا خلط البيانات علاج كرمز، يجب أن تكون بخير.

نصائح أخرى

إنشاء كائن SqlCommand الخاصة بك مثل ذلك:

SqlCommand cmd = new SqlCommand(
        "INSERT INTO Employees (id, name) VALUES (@id, @name)", conn);

SqlParameter param  = new SqlParameter();
param.ParameterName = "@id";
param.Value         = employee.ID;

cmd.Parameters.Add(param);

param  = new SqlParameter();
param.ParameterName = "@name";
param.Value         = employee.Name;

cmd.Parameters.Add(param);

cmd.ExecuteNonQuery();

وإصلاح الخاص بك استبدال نقلت تعمل بهذه الطريقة:

void string replaceQuotes(string value) {
     string tmp = value;
     tmp = tmp.Replace("'", "''");
     return tmp;
}

وهتاف!

وهم وأنا أتفق مع الجميع التي يجب أن تكون باستخدام استعلامات معلمات وسوف نترك الامر عند هذا الحد. ولكن كيف أنت ذاهب تمرير هذه البيانات SQL لخادم عن بعد؟ هل لديك نوع من الخدمات مثل خدمة الإنترنت والتي سوف تقبل وتنفيذ أوامر SQL تعسفية أو غير التطبيق العميل ذهابك لضرب DB مباشرة؟

وإذا كان الذهاب من خلال نوع من الوكيل ثم لا يهم كم كنت تطهير البيانات الخاصة بك على العميل، هاكر يمكن أن مجرد تجاوز التطبيق الخاص بك وضرب الخدمة. في هذه الحالة فعل ما توصي كيد وتمرير البيانات كما XML على سبيل المثال أو أيا كان الشكل الذي تختاره (JSON، ثنائي الخ ..) ثم بناء SQL الخاصة بك الحق قبل كنت فعلا بتشغيل الأمر.

لتجنب حقن، تحتاج لشحن البيانات إلى ملقم بعيد (ربما في XML) ثم على الملقم البعيد، يجب تحويل البيانات إلى أنواع البيانات الملائمة واستخدامها في استعلامات معلمات أو procs المخزنة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top