代码之家  ›  专栏  ›  技术社区  ›  Chris Kimpton

无法通过SQL参数将字符串转换为C中的唯一标识符

  •  1
  • Chris Kimpton  · 技术社区  · 16 年前

    我有一个具有uniqueidentifier类型的pk列的表。

    我正试图从C编写一个更新语句,在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();
            }
    
        }
    

    但我要么得到无效语法,要么“从字符串转换为唯一标识符时转换失败”

    我以前在提取过程中遇到过这个问题,最后将转换放入存储过程,看起来我也需要将其放入存储过程中。

    提前感谢您对此有任何想法/建议。

    编辑:一个示例ID看起来像“45D9EC51-1E52-49D8-9139-51F18FE13563”,它看起来像我通过管理工作室在表上看到的。

    edit2:下面是最终工作的代码(使用@而不是):

            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 回复  |  直到 16 年前
        1
  •  2
  •   Moe Sisko    16 年前

    我能理解的是,动态创建的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)));
    
        2
  •  1
  •   marc_s MisterSmith    16 年前

    不确定-但可能是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不必自动解释您的内容,也可能会出错…