У меня есть файл класса, в котором я объявляю readonly string
моего запроса для использования в методе. Я встретил ошибку
Необходимо объявить скалярную переменную "@DBID"
Могу ли я узнать, неправильно ли я объявляю свои переменные?
Ниже приведены фрагменты кода:
Файл класса:
private static readonly string QUERY_GETMATCHEDRECORD = "SELECT [Title], [ItemLink], [RecordDocID] FROM [ERMS].[dbo].[Records] WHERE [ID] = @DBID AND [V1RecordID] = @recID AND [V1RecordDocID] = @recDocID";
public DataTable GetMatchedRecord(string DBID, string recID, string recDocID)
{
string Method = System.Reflection.MethodBase.GetCurrentMethod().Name;
DataTable dt = new DataTable();
try
{
using (DB db = new DB(_datasource, _initialCatalog))
{
db.OpenConnection();
using (SqlCommand command = new SqlCommand())
{
string commandText = QUERY_GETMATCHEDRECORD .FormatWith(DBID,recID,recDocID);
_log.LogDebug(Method, "Command|{0}".FormatWith(commandText));
command.CommandText = commandText;
dt = db.ExecuteDataTable(command);
}
db.CloseConnection();
}
}
catch (Exception ex)
{
_log.LogError(Method, "Error while retrieving matching records |{0}".FormatWith(ex.Message));
_log.LogError(ex);
}
return dt;
}
Программный файл .cs:
MatchedRecords = oDB.GetMatchedRecord(DBID, RecID, RecDocID);
_log.LogDebug
? Разве ваша константа не должна больше походить наWHERE [ID] = {0} AND [V1RecordID] = {1} AND [V1RecordDocID] = {2}
? - person Rafalon   schedule 11.06.2019GetMatchedRecord | Error while retrieving matched record | Must declare the scalar variable "@DBID". .Net SqlClient Data Provider | Must declare the scalar variable "@DBID"
- person gymcode   schedule 11.06.2019FormatWith
заменяет{0}, {1}
и т. д. (при условии, что вы используете метод расширения Джеймса Ньютона-Кингса). - person HoneyBadger   schedule 11.06.2019_log.LogDebug(Method, "Command|{0}".FormatWith(commandText));
, а не о той, что в блокеcatch
- person Rafalon   schedule 11.06.2019FormatWith
, он не добавляет параметры к команде. Скорее всего, он ломает запрос, пытаясь (и терпя неудачу) заменить заполнители строками. Вот как происходят атаки SQL-инъекций. Представьте, что произойдет, еслиRecDocID
будет содержать1; drop table records;--
. Цитирование тоже не помогает,1'; drop table records;--
все равно сработает - person Panagiotis Kanavos   schedule 11.06.2019commandText
? - person mjwills   schedule 11.06.2019FormatWith
, для общих функций, таких какString.Format
, не помогает. Вы экономите 4 символа и получаете код, который никто другой не может понять. Вы можете использовать интерполяцию строк вместоFormatWith
, чтобы упростить создание строк. - person Panagiotis Kanavos   schedule 11.06.2019