MadMyche
Никогда не создавайте SQL-команду, объединяя строки вместе!.
Как вы обнаружили, одинарные кавычки могут нарушить утверждение. И это счастливая версия, что ваша программа выдает ошибку. ЕСЛИ кто-то должен создать значения, входящие в него, тогда они могут "закоротить" команду, а затем начать запускать свои собственные.
Это было определено как серьезная уязвимость 20 лет назад и до сих пор является одним из 10 лучших способов взлома веб-сайтов
Способ избежать этого состоит в том, чтобы использовать Parameterized Query
В исходном запросе будут введены переменные-заполнители, а затем в команду будут добавлены параметры
Самое приятное в использовании параметров-это то, что вам не нужно беспокоиться о кавычках (или других используемых идентификаторах (например, #date# в некоторых версиях Access). Вам действительно нужно быть осторожным, так как заполнители будут заменены вводом данных SQL на основе вводимых значений; поэтому, если у вас есть INT внутри текстового поля, он будет отформатирован как строка; поэтому убедитесь, что вводимые значения правильно набраны.
Обычно это выглядело бы примерно так:
SqlCommand cmd = new SqlCommand("UPDATE table SET ColumnValue = @NewValue WHERE TableID = @TableID", _connection);
cmd.Parameters.AddWithValue("@NewValue", somevalue);
cmd.Parameters.AddWithValue("@TableID", indexvalue);
Ваш случай немного отличается,так как вы передаете CommandText какому-то помощнику.
Итак, нам нужно будет построить некоторую коллекцию,значения которой могут быть <string,object> или <object, object>. Так что новый запрос будет выглядеть примерно так
var Query = "UPDATE temp SET HIBLCK14= @HIBLCK14,HICOND = @HICOND,HIATLEG = @HIATLEG,[HIATT#] = @HIATT,HIATNM = @HIATNM,HIOTHLEG = @HIOTHLEG,[HIOTH#] = @HIOTH,HIDOSF = @HIDOSF,HIDOST = @HIDOST,HIBLCK19 = @HIBLCK19,HIOCCD = @HIOCCD WHERE (HILOCX = @HILOCX) AND (HISEQ = @HISEQ) AND (HIDOS = @HIDOS);";
А затем мы добавим значения с помощью OrderedDictionary (не обязательно таким образом, может быть любой тип объекта key&value)
OrderedDictionary params = new OrderedDictionary();
params.add("@HIBLCK14", _billingDetails.Qual);
params.add("@HICOND", CondRelate);
params.add("@HIATLEG", billingDetails.AttendingLegacy);
params.add("@HIATT", _billingDetails.AttendingPhys);
params.add("@HIATNM", _billingDetails.AttendingPhysName);
params.add("@HIOTHLEG", _billingDetails.LOCATOR17A1);
params.add("@HIOTH", _billingDetails.LOCATOR17B);
params.add("@HIDOSF", _billingDetails.DOSFrom);
params.add("@HIDOST", ToDOS);
params.add("@HIBLCK19", _billingDetails.AdditionalClaimInformation);
params.add("@HIOCCD", _billingDetails.DateOfOccur);
params.add("@HILOCX", Locix);
params.add("@HISEQ", Sequence);
params.add("@HIDOS", DateOfService);
А затем идет последний бит, добавляющий новый метод, который принимает коллекцию параметров и может добавить их в команду.
public bool ExecNonQuery(string Query, OrderedDictionary QueryValues) {
try {
using (SqlCommand cmd = new SqlCommand(Query, _conn)) {
// iterate through the dictionary
foreach (DictionaryEntry entry in QueryValues) {
cmd.Parameters.AddWithValue(entry.Key, entry.Value);
}
if (_conn.State != ConnectionState.Open) { _conn.Open(); }
cmd.ExecuteNonQuery();
return true;
}
}
catch (Exception) { throw; }
finally { _conn.Close(); }
}
ЗАПИСИ:
- Хотя это функционально, это не мой предпочтительный метод, поскольку он ограничивает функциональность параметров
- Некоторые из ваших названий столбцов содержали специальные символы. От них надо спасаться.
Я не нахожусь на машине, оснащенной IDE, поэтому могут быть синтаксические или другие ошибки. Принципал надежен, и если он не работает, то никаких возвратов нет.