通过c#在sql中验证后将值重新插入表中

时间:2014-05-14 11:57:03

标签: c# mysql sql

我的profile_name表格中有一个varbinary列accounts。最初,我认为我的用户不会输入特殊字符,并且会保持简短和甜蜜。

但是,那是我可怕的错误。他们开始使用大量特殊字符保留长篇名称,这给我带来了麻烦。

现在,我将他们的选项限制在字母数字,下划线和连字符,并且应该是3到10个字符。换句话说,这个正则表达式:[\w-]{3,10}

现在任务艰难。

我已经有570个用户,我想更新他们的个人资料名称以符合上述规则。

我有一些准系统代码:

public NpMaintainance()
{
    UTF8Encoder encode = new UTF8Encoder();
    List<string> names = new List<string>();
    using (con)
    {
        con.Open();
        using (cmd)
        {
            cmd.Parameters.Clear();
            cmd.Connection = con;
            cmd.CommandText = "select profile_name from accounts";
            using (dr = cmd.ExecuteReader())
            {
               names.Add((dr[0] as byte[]).ToUnicodeString(encode));
            }
        }
    }
}

我只是代码,我没有尝试过,因为它是一个生产网站。现在names包含配置文件名称,我将重新插入表中。并且为了解决我的问题,profile_name是唯一的,因此没有两个名称应该相同。

我已经提供了所有细节,并希望得到答案!

我该怎么办?还有其他方式(仅使用sql?),或者如果没有,请以我现在的方式帮助我!

1 个答案:

答案 0 :(得分:1)

更新:
这是MySQL版本,在Shay Anderson编写的cleanString function的帮助下,只需稍作修改即可接受数字字母。

IF ASCII(c) > 31 AND ASCII(c) < 127 THEN 
replaced with
IF (ASCII(c) > 47 AND ASCII(c) < 57) 
OR (ASCII(c) > 64 AND ASCII(c) < 91) 
OR (ASCII(c) > 96 AND ASCII(c) < 122) THEN

基本思路是创建一个临时表,将profile_name转换为varchar,清理它并将其更新回帐户表。

-- for testing purposes create and populate test table
CREATE TABLE accounts(id INT, profile_name VARBINARY(8000));

INSERT INTO accounts(id, profile_name)
SELECT 1,  CAST('User|%$&&/(/' AS BINARY);

-- check what's in there
SELECT id, profile_name, CAST(profile_name AS CHAR) FROM accounts;

CREATE TEMPORARY TABLE IF NOT EXISTS tmp_accounts AS (
    SELECT id, profile_name, CAST(profile_name AS CHAR) AS 'converted_name'
    FROM accounts
);

-- clean converted profile_name in temp table using function udf_cleanString
UPDATE tmp_accounts
SET converted_name = UDF_CLEANSTRING(converted_name);

/* do any other change necessary.... length etc. 
  when satisfied with changes in temp table update accounts table with new profile_name
*/
UPDATE accounts a
INNER JOIN tmp_accounts t ON t.id = a.id
SET a.profile_name = CAST(t.converted_name AS BINARY);

-- check what was done with profile_name after changes
SELECT id, profile_name, CAST(profile_name AS CHAR) FROM accounts;

-- DROP TABLE tmp_accounts

在SQL中,您可以尝试将varbinary(max)转换为nvarchar(max)类型(假设accountid是accounts表的主键)

SELECT accountid, profile_name, CONVERT(NVARCHAR(MAX),profile_name) as converted_name 
INTO #tmpaccounts
FROM accounts

然后使用一些字符剥离功能,如How to strip all non-alphabetic characters from string in SQL Server?中的那个。它可能需要一些调整来允许连字符和下划线,但它不应该太难

UPDATE #tmpaccounts SET converted_name = [dbo].[RemoveNonAlphaCharacters](converted_name)

应该注意角色的限制,如果你有更长的个人资料名称然后修剪它们,希望不应该有很多。 (我有点怀疑未经许可更改个人资料名称或至少是帐户所有者的意识) 之后,您可以从#tmpaccounts更新帐户表。

UPDATE a
SET profile_name = CONVERT(VARBINARY(max), converted_name)
FROM accounts a
INNER JOIN #tmpaccounts t on t.accountid = a.accountid

当然不要在生产数据库上执行此操作,使用演示或培训DB。