Не удалось преобразовать строку в uniqueidentifier в C# с помощью параметра SQL

У меня есть таблица со столбцом PK типа uniqueidentifier.

Я пытаюсь написать заявление об обновлении из C#, где у меня есть идентификатор в виде строки.

Вот код, который я пытаюсь:

      string sql_start = "update SecurityUserGroup set ";
        int paramPos = 0;
        var paramList = new List<SqlParameter>();
        if (roleName != null)
        {
            sql_start += " RoleName = '{" + paramPos + "}'";
            paramList.Add(new SqlParameter(""+paramPos, roleName));
            paramPos++;
        } 
        if (activeDirectoryGroup != null)
        {
            sql_start += " ActiveDirectoryGroup = '{" + paramPos + "}'";
            paramList.Add(new SqlParameter(""+paramPos, activeDirectoryGroup));
            paramPos++;
        }
        //sql_start += " where SecurityUserGroupId = cast('{" + paramPos + "}' as uniqueidentifier)";
        //sql_start += " where SecurityUserGroupId = convert(uniqueidentifier, '{" + paramPos + "}')";
        sql_start += @" where SecurityUserGroupId = '{" + paramPos + @"}'";
        paramList.Add(new SqlParameter(""+paramPos, new Guid(id)));
        //paramList.Add(new SqlParameter(""+paramPos, id));
        SqlHelper.ExecSql(sql_start, paramList);

Функция SqlHelper.ExecSql делает это:

    public static void ExecSql(string sql, List<SqlParameter> parms)
    {
        using (SqlConnection con = GetConnection())
        {
            SqlCommand command = new SqlCommand(sql, con) {CommandType = CommandType.Text};

            foreach (SqlParameter parm in parms)
            {
                command.Parameters.Add(parm);
            }

            command.ExecuteNonQuery();
        }

    }

Но я либо получаю неверный синтаксис, либо "Преобразование не удалось при преобразовании строки символов в uniqueidentifier"

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

Заранее спасибо за любые мысли / советы по этому вопросу.

РЕДАКТИРОВАТЬ: пример идентификатора выглядит следующим образом "45d9ec51-1e52-49d8-9139-51f18fe13563", который похож на то, что я вижу на столе через Management Studio.

РЕДАКТИРОВАТЬ 2: Вот код, который работал в конце (используя @ вместо {}):

        var sql_start = new StringBuilder("update SecurityUserGroup set ");
        int paramPos = 0;
        var paramList = new List<SqlParameter>();
        if (roleName != null)
        {
            sql_start.Append(" RoleName = @" + paramPos);
            paramList.Add(new SqlParameter("@"+paramPos, roleName));
            paramPos++;
        } 
        if (activeDirectoryGroup != null)
        {
            if (paramPos > 0) sql_start.Append(",");
            sql_start.Append(" ActiveDirectoryGroup = @" + paramPos);
            paramList.Add(new SqlParameter("@"+paramPos, activeDirectoryGroup));
            paramPos++;
        }
        sql_start.Append(" where SecurityUserGroupId = @id");
        paramList.Add(new SqlParameter("@id", id));
        SqlHelper.ExecSql(sql_start.ToString(), paramList);

С уважением, Крис

2 ответа

Решение

Насколько я могу судить, ваш динамически созданный SQL в конечном итоге будет выглядеть примерно так:

update SecurityUserGroup set RoleName = '{0}' ActiveDirectoryGroup = '{1}' where SecurityUserGroupId = '{2}'

Когда то, что вам, вероятно, нужно, это что-то вроде:

update SecurityUserGroup set RoleName = @RoleName, ActiveDirectoryGroup = @ActiveDirectoryGroup where SecurityUserGroupId = @SecurityUserGroupId

Для этого замените код следующим образом:

sql_start += @" where SecurityUserGroupId = '{" + paramPos + @"}'";
paramList.Add(new SqlParameter(""+paramPos, new Guid(id)));

с кодом вроде:

sql_start += " where SecurityUserGroupId = @SecurityUserGroupId";
paramList.Add(new SqlParameter("@SecurityUserGroupId", new Guid(id)));

Не уверен - но, возможно, SQL Server неправильно интерпретирует значение вашего параметра как строку, а не GUID, здесь:

paramList.Add(new SqlParameter(""+paramPos, new Guid(id)));

Я бы добавил это используя:

SqlParameter workParam = new SqlParameter("" + paramPos, SqlDbType.Uniqueidentifier);
workParam.Value = new Guid(id);
paramList.Add(workParam);

Если вы создаете SqlParameter с явным, конкретным типом, SQL Server не придется автоматически интерпретировать ваши вещи и, возможно, ошибиться...

Другие вопросы по тегам