簡體   English   中英

無法通過SQL參數將字符串轉換為C#中的uniqueidentifier

[英]Failing to convert string to uniqueidentifier in C# via a SQL Parameter

我有一個表,其中的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時轉換失敗”

我以前在提取時遇到了這個問題,最終將轉換放入存儲過程中,看來我也需要將其轉換為存儲過程。

在此先感謝您的任何想法/提示。

編輯:一個示例id看起來像這樣的“ 45d9ec51-1e52-49d8-9139-51f18fe13563”,它看起來像我通過Management Studio在桌子上看到的。

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

克里斯,問候

盡我所能,動態創建的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不必自動解釋您的內容,甚至可以弄錯它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM