【问题标题】:Read unicode characters from text or richtext field从文本或富文本字段中读取 unicode 字符
【发布时间】:2019-02-21 04:20:50
【问题描述】:

我正在尝试研究如何从文本字段或富文本字段中读取奇数 unicode 字符并将其存储到字符串中,然后在 SQL 数据库中进行更新。

我认为我已经解决了 SQL 方面的问题,但是我无法解决用户输入方面的问题。

我在用户输入 的表单上有一个文本框或富文本框(两者都试过) 到字段中,他们可以输入 put it ok,但是我如何检索它以发送到 SQL?

字符串变量只是将其转换为

有什么想法吗?

【问题讨论】:

    标签: c# .net sql-server ado.net


    【解决方案1】:

    我将以下示例放在一起,以帮助您发现代码中可能存在的问题,以及它没有将 unicode 字符串保存到表中的原因。

    本示例将 unicode 文本保存到 dbo.MyTable 表中,该表具有以下架构:

    CREATE TABLE dbo.MyTable
    (
        MyColumn NVARCHAR(MAX)
    )
    

    这个逻辑会在dbo.MyTable 表中插入一条记录,其中包含来自textbox1.Text 的文本:

    using (var cn = new SqlConnection("MyConnectionString"))
    {
        cn.Open();
    
        using (var cm = cn.CreateCommand())
        {
            cm.CommandType = CommandType.Text;
            cm.CommandText = "INSERT dbo.MyTable (MyColumn) VALUES (@MyText)";
    
            // Assuming textBox1 is your textbox...
            cm.Parameters.Add(
                new SqlParameter("@MyText", SqlDbType.NVarChar, -1) { Value = textBox1.Text }
                );
    
            cm.ExecuteNonQuery();
        }
    }
    

    更新

    根据您在下面的评论,我围绕SqlCommand 对您的代码进行了以下更改,以使用参数而不是字符串连接,我解释了为什么这是不好的here;下面的代码将按预期将您的 unicode 文本保存到您的表格中并且是安全的:

    SqlCommand ins = new SqlCommand("UPDATE ProductTestSpecifications set Specification = @Specification where ProductID = @ProductID and TestID = @TestID", con);
    
    // When building your SqlCommand, always use parameters if you are interacting with external input, this will protect you against SQL injection.
    ins.Parameters.Add("@Specification", SqlDbType.NVarChar, -1).Value = myRichText.Text;
    
    // Im assuming ProductID and TestID are System.Int32, if not, please change SqlDbType.Int to the appropriate type.
    ins.Parameters.Add("@ProductID", SqlDbType.Int).Value = ProductID;
    ins.Parameters.Add("@TestID", SqlDbType.Int).Value = TestID;
    
    try
    {
        ins.ExecuteNonQuery();
    }
    catch (Exception ex)
    {
        result = ex.Message.ToString();
    }
    

    【讨论】:

    • 谢谢,我的专栏是 NVARCHAR(MAX),我的代码是: SqlCommand ins = new SqlCommand("UPDATE ProductTestSpecifications set Specification = '" + myRichText.Text + "' where ProductID = " + ProductID + " and TestID = " + TestID, con);尝试 { ins.ExecuteNonQuery(); } catch (Exception ex) { result = ex.Message.ToString(); } 但它仍然保存没有 SQL 中的“特殊”字符...
    • 嗨@Dean。请按照我的示例并为您的查询使用参数(规范、ProductID 和 TestID),这将解决问题。您刚刚向我展示的代码对 SQL 注入攻击很敏感!我在另一个答案中写过这个:stackoverflow.com/a/54507195/2206145
    • 另外,解释为什么您的代码会剥离 unicode 字符;在 SQL Server 中,NVARCHAR 类型文字必须以 N 开头,例如。 N'My unicode text'。当您连接 myRichText.Text 时,您并没有在此处执行此操作,因此,SQL Server 将其转换为 VARCHAR 类型。同样,请不要这样做,而是使用参数,您将是安全的,您的代码将按预期工作。
    • 谢谢,我理解参数化查询中的逻辑,更有意义......但仍然没有正确保存值。它仍然以
    • 我想出了另一种方法来做到这一点......如果我使用 myRichText.Rtf 值,那么我可以获得我所追求的结果...... .Text 属性只是不包含该值在超级/子脚本中...
    【解决方案2】:

    从使用 RichTextBox 的 Text 属性切换到 Rtf 属性。它达到了我追求的结果......

    谢谢大家

    【讨论】:

    • 如果您在原始问题(有编辑按钮)中提供示例代码而不是在其他地方发表评论,您会更快地得到答案。无论如何,欢迎加入社区。​​span>
    【解决方案3】:

    一个简单的方法是:

    byte[] bytes = Encoding.Unicode.GetBytes(unicodeString);
    

    【讨论】:

      【解决方案4】:

      嗯,.NET 从一开始就是 unicode,所以应该很简单。

      确保您的数据库列排序规则也是 unicode(nvarchar 等类型或仅支持 unicode 字符的排序规则本身)。

      提供代码示例通常会有所帮助,以便更容易发现问题。

      【讨论】:

      • 你不应该在 2019 年推荐 ntext。自 2005 以来它已被弃用...
      • 我没有注意到 sql-server 标签,所以我一般是在做一个参考。会更正。
      猜你喜欢
      • 2022-09-02
      • 2018-06-22
      • 2011-01-19
      • 1970-01-01
      • 2013-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多