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

本文关键字:插入 sql 验证 通过 新插入 | 更新日期: 2023-09-27 18:03:30

我有一个varbinary列profile_name在我的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?),或者如果不是请帮助我的方式,我目前正在做!

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

UPDATE:
这是MySQL版本,在Shay Anderson编写的cleanString函数的帮助下,只做了一个小的改变来接受数字和字母。

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

然后使用一些字符剥离函数,例如如何从SQL Server中的字符串中剥离所有非字母字符?它可能需要一些调整来允许连字符和下划线,但这不应该太难

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

应该照顾字符限制,如果你有更长的个人资料名称,然后10修剪他们,希望不会有很多。(我有点怀疑在未经允许或至少从账户所有者的意识改变个人资料名称)之后,您可以从#tmpaccounts更新帐户表。

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

当然,不要在生产数据库上这样做,使用演示或培训数据库。

sqlmysql