Как передать guid в параметризованном запросе? - PullRequest
1 голос
/ 02 августа 2011

Мой лучший лучший код:

string delNonQuery = "DELETE FROM " + Settings.DataSource + " WHERE @keycolumn=@keyuid";

SqlCommand cmd = new SqlCommand(delNonQuery,readerConn);
SqlParameter kc = new SqlParameter("keycolumn", SqlDbType.VarChar);
SqlParameter key = new SqlParameter("keyuid", SqlDbType.VarChar);
cmd.Parameters.Add(kc).Value = Settings.KeyColumn;
cmd.Parameters.Add(key).Value = Page.Request["key"].ToString().Trim();

readerConn.Open();
cmd.ExecuteScalar();
readerConn.Close();

Это выполняется, но влияет на колоссальные ноль строк. Если я изменю SqlDbType для keyuid на UniqueIdentifier, то это просто закончится тем, что я получу дюжину вариантов «не удалось преобразовать строку символов в uniqueidentifier». Я должен использовать параметризованный запрос для очистки данных, я просто застрял в том, как ...

Ответы [ 3 ]

2 голосов
/ 02 августа 2011

Нельзя указать параметр для имени столбца - его необходимо объединить так же, как для имени таблицы.

Это:

"DELETE FROM " + Settings.DataSource + " WHERE @keycolumn=@keyuid"

Должен измениться на:

"DELETE FROM " + Settings.DataSource + " WHERE " + Settings.KeyColumn + " =@keyuid"

Хотя я, вероятно, написал бы это как:

string delNonQuery = string.Format("DELETE FROM {0} WHERE {1} = @keyuid", 
                                   Settings.DataSource, 
                                   Settings.KeyColumn);

Для полноты картины упомяну, что это открыто для SQL-инъекции . Вы должны убедиться, что ваши значения Settings чистые.

2 голосов
/ 02 августа 2011

Я не думаю, что вы можете параметризовать имя столбца ("keycolumn")

Попробуйте это:

string delNonQuery = string.Format("DELETE FROM " + Settings.DataSource + " WHERE {0}=@keyuid", Settings.KeyColumn);

SqlCommand cmd = new SqlCommand(delNonQuery,readerConn);
SqlParameter key = new SqlParameter("keyuid", SqlDbType.VarChar);
cmd.Parameters.Add(key).Value = Page.Request["key"].ToString().Trim();

readerConn.Open();
cmd.ExecuteScalar();
readerConn.Close();

Обычные предупреждения применяются в отношении конкатенации строк для построения SQL;скорее всего, это угроза безопасности.

Наилучшим способом может быть инкапсуляция SQL-кода в хранимую процедуру, передача имени и значения столбца в качестве параметров и последующее выполнение с использованием динамического SQL.

0 голосов
/ 02 августа 2011

Вам нужно преобразовать строку в GUID:

Соответствующие строки:

SqlParameter key = new SqlParameter("keyuid", SqlDbType.UniqueIdentifier);
...
cmd.Parameters.Add(key).Value = new Guid(Page.Request["key"].ToString().Trim());

, который решает только проблему GUID / UniqueIdentifer

...