【问题标题】:Unable to Insert Char(63) by SQL query无法通过 SQL 查询插入 Char(63)
【发布时间】:2018-12-31 10:09:08
【问题描述】:

我可以在我的 sql 数据库中插入不寻常的字符(返回 63),这没问题。

Letsay 产品名称 = ኣድድድ

然后如果我想再次插入,但首先检查数据库中是否存在产品名称

var product = db.Products.Where(x => x.Productname == txtproduct.Text.Trim()).FirstOrDefault();

然后返回,因为已经有相同的产品名称 我的意思是

if(product == null)
{
   Products pr = new Producst();
   pr.ProductName = txtProductname.txt.trim() // tried even without trim()
   db.Products.Add(pr);
   db.Savechanges();    
}
else
{
    MessageBox.Show("There is the same productname registred"); // Returns allways this one , doesnt't matter which unusual character 
}

即使我写的是另一个不寻常的字符,比如 productname = ሰግግግ 然后它返回“注册了相同的产品名称”。 实际上,当我输入它们时,它们不是同一个词,但是当我检查它们的 ascii 代码时,它们返回 63。

我不想在数据库中出现重复的产品名称。有没有办法解决这个问题?请帮忙!

【问题讨论】:

  • 不确定。但这有帮助吗? stackoverflow.com/questions/15982499/…
  • @Helen 您好,您可以访问数据库吗?如果您有权在数据库定义上添加约束,那么最好使用代码。喜欢:ALTER TABLE TABLE ADD CONSTRAINT Unique_NameCol UNIQUE (NameCol);
  • 这两个字符是unicode字符(两个字节)4771(0x12A3)和4853(0x12F5)使用了3次。尝试使用 RichTextBox。
  • 您是否尝试调试过txtproduct.Texttxtproduct.Text.Trim() 的值?此外,如果您不需要对 product 执行特定操作,您可能更喜欢使用 Any 编写一些内容,例如 if(db.Products.Any(x => x.Productname == txtproduct.Text))
  • @pascalsanchez,感谢您的回复。是的,我可以访问数据库并添加了 ConstriantUnique_NameCol,但遇到了同样的问题

标签: c# sql-server linq ascii


【解决方案1】:

ASCII 码 63 是一个问号 ?。这意味着文本无法在当前的varchar 字段中表示,并且所有不受支持的字符都被转换为问号。您需要使用支持这些符号的排序规则来更改排序规则,或者最好将列的数据类型从 varchar 更改为 nvarchar,以便能够存储 unicode 字符。

【讨论】:

  • 感谢您的回复,我的数据库中有 nvarchar。用那些不寻常的字符插入我的数据库没有问题。但是当我插入第一个产品名称时,下一个产品名称被解释为相同的产品名称
  • 该字段可能是nvarchar,但显然unicode文本被转换为问号。所以必须有一些到非 unicode 的转换。检查您如何插入数据,是否有任何类型错误的参数,不以N 为前缀的文本文字等。
  • 不,我没有任何参数,但是如果我把 N 放在我的字符串前面 那么反过来我可以复制但不能插入另一个名字,有了 N 我可以复制但没有 N那么我数据库中的每个字符串都被解释为同一个单词。我觉得太复杂了
【解决方案2】:

我认为使用在我的计算机上运行良好的相关代码可能是 Linq 不好:

        private void button1_Click(object sender, EventArgs e)
        {
            try
            {
                TESTEntities db = new TESTEntities();
                List<MyTableBis2> myDataList = db.MyTableBis2.ToList();
                string valuerFull = "";
                foreach (MyTableBis2 data in myDataList)
                {
                    valuerFull += data.CharCol + " ";
                }
                MessageBox.Show(valuerFull);
                var newValueAdd = textBox1.Text.Trim();

                MessageBox.Show(newValueAdd);

                var ch = myDataList.FirstOrDefault(x => x.CharCol.Equals(newValueAdd));
                if (ch == null)
                {
                    MyTableBis2 m = new MyTableBis2();
                    m.CharCol = textBox1.Text.Trim();
                    db.MyTableBis2.Add(m);
                    db.SaveChanges();
                }
                else
                {
                    MessageBox.Show("This product exist");
                }

            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
                Exception innerE = ex.InnerException;
                while (innerE != null)
                {
                    MessageBox.Show(innerE.Message);
                    innerE = innerE.InnerException;
                }
            }
        }

等你回来看看有没有效果

【讨论】:

  • 我的天啊......它正在工作!!!!!!我永远不会明白这背后的秘密是什么,因为它与我一直使用的代码不同。产品订购的方式有点奇怪..但它正在工作。我的意思是 Id 1,Id2 然后 Id5 就像 Id 3 我认为这与角色如何互动有关。非常感谢帕斯卡。你太伟大了!我从不认为它会奏效。由于这些不寻常的角色,我什至还有另一个问题,我想了解一下像这样的州的城市stackoverflow.com/posts/53996141/revisions
  • 感谢您的回归 :)。欢迎您通过电子邮件进行交流:)。如果您可以查看我的答案或投票:)。提前致谢。
  • @HelenTekie 我要去看看新帖子。您是否找到了获得预期结果的方法?
  • sanches,你的意思是要对城市进行汇总吗?当我有常用字符但使用不寻常字符时它正在工作,它只显示我或者我只在我的网格视图中看到一行,其中 Totalcities 作为“标题”并且值为 3
  • @HelenTekie 您可以通过电子邮件向我发送一个示例模板项目,以复制这些内容吗?提前致谢。
【解决方案3】:

您好,查询工作我在第一次查询时重现了错误(重复)

CREATE TABLE #MyTable  
(PrimaryKey   int PRIMARY KEY,  
   CharCol      varchar(10) COLLATE Finnish_Swedish_CI_AS NOT NULL,
   CONSTRAINT UC_CharCol UNIQUE (CharCol)  
  );  
GO  

INSERT INTO #MyTable 
SELECT 1, 'ኣድድድ'
INSERT INTO #MyTable 
SELECT 2, 'ኣድድኣ'
INSERT INTO #MyTable 
SELECT 3, 'ኣድኣ'

SELECT * FROM #MyTable


DROP TABLE  #MyTable

结果是:

PrimaryKey  CharCol
    3   ???
    1   ????

还有错误:

    (1 ligne affectée)
Msg 2627, Niveau 14, État 1, Ligne 10
Violation de la contrainte UNIQUE KEY « UC_CharCol ». Impossible d'insérer une clé en double dans l'objet « dbo.#MyTable ». Valeur de clé dupliquée : (????).

但是当我尝试使用排序规则 'Finnish_Swedish_100_CI_AS_SC' 和指定的 N'specialcharstring' 时,它们效果很好:

CREATE TABLE #MyTableBis  
  (PrimaryKey   int PRIMARY KEY,  
   CharCol      nvarchar(10) COLLATE Finnish_Swedish_100_CI_AS_SC NOT NULL,
   CONSTRAINT UC_CharCol UNIQUE (CharCol)  
  );  
GO  

INSERT INTO #MyTableBis 
SELECT 1, N'ኣድድድ'
INSERT INTO #MyTableBis 
SELECT 2, N'ኣድድኣ'
INSERT INTO #MyTableBis 
SELECT 3, N'ኣድኣ'

SELECT * FROM #MyTableBis


DROP TABLE  #MyTableBis

结果:

PrimaryKey  CharCol
3            ኣድኣ
2            ኣድድኣ
1            ኣድድድ

来源:

  1. How to store unicode characters in SQL Server?
  2. https://docs.microsoft.com/en-us/sql/relational-databases/collations/collation-and-unicode-support?view=sql-server-2017

用于实体框架: EntityFramework update or insert Chinese or non-English text

【讨论】:

  • 谢谢,但在我的情况下,我应该如何改革我的 Linq 查询?如果我对 Product pr = new Product(); 编码,它不会像我一样工作Pr.productName = N'txtproduct.trim()' ??像这样?
  • 我真的是上帝的问题,我会以你很少使用 C# 的方式来寻找吗?我认为可以通过特殊配置 EntityFramework stackoverflow.com/questions/12632240/… 做出回应
  • @HelenTekie,您可以分享您的插入说明:)。提前谢谢你。
  • sanches ,我已经编辑了我的问题,并在我插入时展示了我是如何做的。我希望我能理解你的问题
  • @HelenTekie 谢谢。对于插入数据库,您正在使用实体框架?您是否有 edmx 表或其他等效文件(实体框架的表定义)?你看过之前的链接吗?
【解决方案4】:

我测试并确认我会在只搜索一个时得到两个记录...这可行吗?使用 UNICODE()

Create Table #tbl
(
f1 nVarChar(25)
)
Insert Into #tbl Values
(N'ኣድድድ'),
(N'ሰግግግ')


Select  
* 
From #tbl
Where  UNICODE (f1) = UNICODE (N'ኣድድድ')

更新:Unicode 只查找第一个字符。如果您可以将搜索条件解析为单个字符,这可能会起作用..

寻找'ኣድድድ'

Select  f1 From #tbl
Where  
   Unicode(substring(f1,1,1)) = 4771 And
   Unicode(substring(f1,2,1)) = 4853 And
   Unicode(substring(f1,3,1)) = 4853 And
   Unicode(substring(f1,4,1)) = 4853 

【讨论】:

  • 如何在 Linq 中制定公式? db.products.where(Unicode(substring(f1,1,1)) == txtproducts.Text) 像这样??????
  • @HelenTekie 对不起。我对Linq不熟悉。我认为这个想法有点复杂 - 但如果它有效 - 也许你可以制作一个 SQL 存储过程并通过 Linq 执行它?这个想法是将您的搜索字符串解析为每个字符的单个 Unicode 整数值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多