【问题标题】:Format unicode before get from database在从数据库获取之前格式化 unicode
【发布时间】:2019-10-03 01:14:36
【问题描述】:

我使用 unicode 列创建 datagridview,例如:

  private void GetUnicodeFormat()
        {
            string unicodeString = "\u2605";

            OneStar = unicodeString;
            TwoStar = unicodeString + unicodeString;
            ThreeStar = unicodeString + unicodeString + unicodeString;
            FourStar = unicodeString + unicodeString + unicodeString + unicodeString;
            FiveStar = unicodeString + unicodeString + unicodeString + unicodeString + unicodeString;
        }

然后我在datagridview中设置如下:

  foreach (DataGridViewRow row in dgvProjectRanking.Rows)
            {
                var cellNumberValue = int.Parse(row.Cells[contractedColumnIndex].Value.ToString());

                if (cellNumberValue <= 20)
                {
                    row.Cells[scoreColumnIndex].Value = OneStar;
                }
                else if (cellNumberValue > 20 && cellNumberValue < 40)
                {
                    row.Cells[scoreColumnIndex].Value = TwoStar;
                }
                else if (cellNumberValue >= 40 && cellNumberValue < 60)
                {
                    row.Cells[scoreColumnIndex].Value = ThreeStar;

                }
                else if (cellNumberValue >= 60 && cellNumberValue < 80)
                {
                    row.Cells[scoreColumnIndex].Value = FourStar;
                }
                else if (cellNumberValue >= 80 && cellNumberValue <= 100)
                {
                    row.Cells[scoreColumnIndex].Value = FiveStar;

                }

            }

这行得通,我在 DataGridView 中得到了星星。但现在我想通过 SQL 发送值,所以我在 sql 中创建函数,例如:

CREATE FUNCTION [HELPER].[udf_ProjectContractedPercentage_Set]
(
             @ProjectContractedPercentage INT
)
RETURNS VARCHAR(MAX)
AS
        BEGIN
            DECLARE @NewProjectContractedPercentage VARCHAR(MAX)
                    ,@StarUnicode  VARCHAR(10) = '\u2605';
          SELECT
             @NewProjectContractedPercentage = (CASE
                                                WHEN @ProjectContractedPercentage <= 20
                                                THEN @StarUnicode
                                                WHEN @ProjectContractedPercentage > 20
                                                    AND @ProjectContractedPercentage < 40
                                                THEN CONCAT(@StarUnicode , @StarUnicode)
                                                WHEN @ProjectContractedPercentage >= 40
                                                    AND @ProjectContractedPercentage < 60
                                                THEN CONCAT(@StarUnicode , @StarUnicode , @StarUnicode)
                                                WHEN @ProjectContractedPercentage >= 60
                                                    AND @ProjectContractedPercentage < 80
                                                THEN CONCAT(@StarUnicode , @StarUnicode , @StarUnicode , @StarUnicode )
                                                WHEN @ProjectContractedPercentage >= 80
                                                    AND @ProjectContractedPercentage <= 100
                                                THEN CONCAT(@StarUnicode , @StarUnicode , @StarUnicode , @StarUnicode , @StarUnicode)
                                            END)


            RETURN
            @NewProjectContractedPercentage

        END

所以我收到如下值:

我需要在 c# 中做什么才能将此值转换为星号?,我不知道如果我在 c# 代码中有 unicode 值或从存储过程接收有什么区别。我认为它完全相同,但不起作用,所以我不知道为什么不这样做。非常感谢您的帮助!

【问题讨论】:

  • 我认为这可能很有趣:stackoverflow.com/questions/144283/…
  • 为什么不存储一个 0 到 5 的值来表示多少颗星?如果您曾经将成语更改为“竖起大拇指”或其他符号,那么更改将是微不足道的。您几乎不必循环通过 DGV 来控制外观 - 使用单元格格式化或 rowprepaint 事件
  • 我将函数更改为 nvarchar 但仍然得到相同的结果@ADyson

标签: c# sql-server winforms unicode


【解决方案1】:

你需要两件事。 1. 使用 NVARCHAR 因为您使用的是 Unicode。 2. NCHAR函数,将代码转换为字符。

所以不是@StarUnicode VARCHAR(10) = '\u2605';

使用:@StarUnicode NVARCHAR(10) = NCHAR(0x2605);

【讨论】:

    【解决方案2】:

    以下更改应该有效。我在 SQL 2017 上对其进行了测试。

    您正在使用的字符(星号)是 Unicode 字符。处理 Unicode 字符时,应使用 NCHAR 和 NVARCHAR。

    ALTER FUNCTION [HELPER].[udf_ProjectContractedPercentage_Set]
    (
                 @ProjectContractedPercentage INT
    )
    RETURNS NVARCHAR(MAX)
    AS
            BEGIN
                DECLARE @NewProjectContractedPercentage NVARCHAR(MAX)
                        ,@StarUnicode  NCHAR(1) = NCHAR(9733);
    
              SELECT
                 @NewProjectContractedPercentage = (CASE
                                                    WHEN @ProjectContractedPercentage <= 20
                                                    THEN @StarUnicode
                                                    WHEN @ProjectContractedPercentage > 20
                                                        AND @ProjectContractedPercentage < 40
                                                    THEN CONCAT(@StarUnicode , @StarUnicode)
                                                    WHEN @ProjectContractedPercentage >= 40
                                                        AND @ProjectContractedPercentage < 60
                                                    THEN CONCAT(@StarUnicode , @StarUnicode , @StarUnicode)
                                                    WHEN @ProjectContractedPercentage >= 60
                                                        AND @ProjectContractedPercentage < 80
                                                    THEN CONCAT(@StarUnicode , @StarUnicode , @StarUnicode , @StarUnicode )
                                                    WHEN @ProjectContractedPercentage >= 80
                                                        AND @ProjectContractedPercentage <= 100
                                                    THEN CONCAT(@StarUnicode , @StarUnicode , @StarUnicode , @StarUnicode , @StarUnicode)
                                                END)
    
    
                RETURN
                @NewProjectContractedPercentage
    
            END
    

    【讨论】:

      猜你喜欢
      • 2021-10-10
      • 1970-01-01
      • 1970-01-01
      • 2020-08-13
      • 2020-10-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-24
      相关资源
      最近更新 更多