संक्षिप्त उत्तर यह है कि आपको वाइल्डकार्ड को पैरामीटर के मान में रखना चाहिए, कमांडटेक्स्ट में नहीं। यानी
वह नहीं:sqlCommand.CommandText = "SELECT * FROM JOB WHERE JOB_POSTCODE LIKE @postcode%"
यह:
sqlCommand.CommandText = "SELECT * FROM JOB WHERE JOB_POSTCODE LIKE @postcode";
sqlCommand.Parameters.Add("@postcode", SqlDbType.NVarChar).Value = postCode + "%";
यहां लंबा जवाब:
मैं वापस गया और अपने कोड को अनिवार्य रूप से हटा दिया ताकि मैं इसे यहां पोस्ट कर सकूं, और ऐसा करते समय मैंने पाया कि मेरे मूल प्रश्न में मैंने जो आखिरी तरीका आजमाया था वह वास्तव में काम करता है। मेरे परीक्षण में कुछ गलत रहा होगा। तो यहां एक सारांश दिया गया है, जिसमें पूरा कोड चलाया गया है:
मूल गतिशील sql, sql इंजेक्शन के प्रति संवेदनशील:
//Dynamic sql works, returns 2 results as expected,
//but I want to use parameters to protect against sql injection
string postCode = "G20";
sqlCommand.CommandText = "SELECT * FROM JOB WHERE JOB_POSTCODE LIKE '"
+ postCode + "%'";
return Database.fGetDataSet(sqlCommand,
iiStartRecord,
iiMaxRecords,
"JOBVISIT");
पैरामीटर का उपयोग करने का पहला प्रयास त्रुटि देता है:
//This syntax with a parameter gives me an error
//(note that I've added the NVarChar length as suggested:
//System.FormatException : @postcode : G20 -
//Input string was not in a correct format.
//at System.Data.SqlServerCe.SqlCeCommand.FillParameterDataBindings()
//at System.Data.SqlServerCe.SqlCeCommand.ExecuteCommandText(IntPtr& pCursor,
// Boolean& isBaseTableCursor)
string postCode = "G20";
sqlCommand.CommandText = "SELECT * FROM JOB WHERE JOB_POSTCODE LIKE @postcode
+ '%'";
sqlCommand.Parameters.Add("@postcode",
SqlDbType.NVarChar,
10).Value = postCode;
return Database.fGetDataSet(sqlCommand, iiStartRecord, iiMaxRecords, "JOBVISIT");
दूसरी तकनीक वास्तव में काम करती है:
///This syntax with a parameter works, returns 2 results as expected
string postCode = "G20";
sqlCommand.CommandText = "SELECT * FROM JOB WHERE JOB_POSTCODE LIKE @postcode";
sqlCommand.Parameters.Add("@postcode", SqlDbType.NVarChar).Value = postCode
+ "%";
return Database.fGetDataSet(sqlCommand, iiStartRecord, iiMaxRecords, "JOBVISIT");
सभी इनपुट के लिए धन्यवाद, और मूल भ्रामक प्रश्न के लिए खेद है...