无法通过SQL参数将字符串转换为C#中的uniqueidentifier

无法通过SQL参数将字符串转换为C#中的uniqueidentifier,c#,ado.net,uniqueidentifier,C#,Ado.net,Uniqueidentifier,我有一个带有uniqueidentifier类型PK列的表 我正试图从C#编写一个update语句,其中标识符是一个字符串 以下是我正在尝试的代码: string sql_start = "update SecurityUserGroup set "; int paramPos = 0; var paramList = new List<SqlParameter>(); if (roleName != null)

我有一个带有uniqueidentifier类型PK列的表

我正试图从C#编写一个update语句,其中标识符是一个字符串

以下是我正在尝试的代码:

      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);
string sql\u start=“update SecurityUserGroup set”;
int-paramPos=0;
var paramList=新列表();
if(roleName!=null)
{
sql_start+=“RoleName=”{“+paramPos+“}”;
添加(新的SqlParameter(“+paramPos,roleName));
paramPos++;
} 
如果(activeDirectoryGroup!=null)
{
sql_start+=“ActiveDirectoryGroup=”{“+paramPos+“}”;
添加(新的SqlParameter(“+paramPos,activeDirectoryGroup));
paramPos++;
}
//sql_start+=“其中SecurityUserGroupId=cast(“{”+paramPos+“}”作为唯一标识符)”;
//sql_start+=“其中SecurityUserGroupId=convert(uniqueidentifier,{“+paramPos+”}”)”;
sql_start+=@“其中SecurityUserGroupId='{“+paramPos+@”}';
添加(新的SqlParameter(“+paramPos,新的Guid(id));
//添加(新的SqlParameter(“+paramPos,id));
ExecSql(sql\u 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();
        }

    }
publicstaticvoidexecsql(字符串sql,列表参数)
{
使用(SqlConnection con=GetConnection())
{
SqlCommand=newsqlcommand(sql,con){CommandType=CommandType.Text};
foreach(SqlParameter parm in parms)
{
command.Parameters.Add(parm);
}
command.ExecuteNonQuery();
}
}
但我要么得到无效语法,要么“从字符串转换为uniqueidentifier时转换失败”

我以前在提取过程中遇到过这个问题,最终将转换转换成一个存储过程,似乎我也需要将其转换成一个存储过程

提前感谢您对这方面的任何想法/建议

编辑:示例id类似于“45d9ec51-1e52-49d8-9139-51f18fe13563”,它类似于我通过Management Studio在表上看到的内容

EDIT2:下面是最后运行的代码(使用@而不是{}):

var sql_start=new StringBuilder(“更新SecurityUserGroup集合”);
int-paramPos=0;
var paramList=新列表();
if(roleName!=null)
{
sql_start.Append(“RoleName=@”+paramPos);
添加(新的SqlParameter(“@”+paramPos,roleName));
paramPos++;
} 
如果(activeDirectoryGroup!=null)
{
如果(paramPos>0)sql_start.Append(“,”);
sql_start.Append(“ActiveDirectoryGroup=@”+paramPos);
添加(新的SqlParameter(“@”+paramPos,activeDirectoryGroup));
paramPos++;
}
sql_start.Append(“where SecurityUserGroupId=@id”);
Add(新的SqlParameter(“@id”,id));
ExecSql(sql_start.ToString(),paramList);
问候,,
Chris

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

据我所知,动态创建的SQL最终将看起来像:

update SecurityUserGroup set RoleName = '{0}' ActiveDirectoryGroup = '{1}' where SecurityUserGroupId = '{2}'
update SecurityUserGroup set RoleName = @RoleName, ActiveDirectoryGroup = @ActiveDirectoryGroup where SecurityUserGroupId = @SecurityUserGroupId
当您可能需要的是:

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_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)));

谢谢,但那也不行。与无法将字符串转换为uniqueidentifier相关的相同错误。尝试使用/不使用convert函数,甚至尝试在uniqueidentifier周围不使用引号。我感觉到一个存储过程即将开始。你能告诉我们你用来创建新GUID的“id”变量是什么样子吗?顺便说一句:如果你一次又一次地连接sql\u开始字符串,这会严重影响性能。您将使用每次连接创建新的字符串实例,并丢弃旧的字符串实例。对于这样的东西,我强烈建议使用StringBuilder,它更适合这样的操作…谢谢-这就成功了。还感谢您指出SQL逗号问题。