Невозможно вставить Char (63) по запросу SQL - PullRequest
0 голосов
/ 31 декабря 2018

У меня есть возможность вставить необычный символ (возвращает 63) в мою базу данных sql, нет проблем с этим.

Letsay ProductName = ኣድድድ

и затем, если я хочу вставить снова, но сначалапроверьте, существует ли имя продукта в базе данных

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.

Я не хочу дублировать названия продуктов в базе данных.Есть ли способ решить эту проблему?Пожалуйста помоги!

Ответы [ 4 ]

0 голосов
/ 02 января 2019

Я думаю, что 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;
                }
            }
        }

В ожидании вашего возвращения, чтобы увидеть, работает ли он

0 голосов
/ 31 декабря 2018

Привет, запрос работает. Я воспроизвожу ошибку (дубликат) в первом запросе

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. Как хранить символы Юникода в SQL Server?
  2. https://docs.microsoft.com/en-us/sql/relational-databases/collations/collation-and-unicode-support?view=sql-server-2017

Для использования в Entity Framework: Обновление или вставка EntityFrameworkТекст на китайском или неанглийском языке

0 голосов
/ 31 декабря 2018

Я проверил и подтвердил, что верну обе записи, когда буду искать только одну ... может ли это сработать?Использование UNICODE ()

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


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

UPDATE: 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 
0 голосов
/ 31 декабря 2018

ASCII код 63 - вопросительный знак ?.Это означает, что текст не может быть представлен в текущем поле varchar, а все неподдерживаемые символы были преобразованы в знаки вопроса.Вам нужно либо изменить параметры сортировки, используя символы, поддерживающие эти символы, либо лучше изменить тип данных столбца с varchar на nvarchar, чтобы можно было хранить символы Юникода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...