2009-10-02 5 views
4

Это сценарий моего стола:LINQ к SQL Update (C#)

CREATE TABLE ClientTypes 
(
    type_id int PRIMARY KEY IDENTITY, 
    type_name varchar(250) not null, 
    type_applications_list text, 
    dtIntro datetime DEFAULT(getdate()) 
) 

И в ASP.net я пытаюсь сделать это:

protected void btnActualizar_Click(object sender, EventArgs e) 
    { 
     var aplicacao = (from apl in dc.ClientTypes 
         where apl.type_id == tipoCliente 
         select apl).Single(); 

     aplicacao.type_name = txtAplicações.Text.ToString(); 

     dc.SubmitChanges(); 
    } 

Однако, когда он работает, он сбой и говорит:

«Текст типов данных и varchar несовместимы в равном оператору».

Я действительно не хочу изменять тип данных SQL в varchar, я бы хотел, чтобы он оставался в тексте. Я сделал несколько тестов с другими значениями типа данных, такими как int ... и все прошло хорошо.

Я действительно не понимаю этого, у меня есть элемент управления, который возвращает строку.

Thx advance

Может ли кто-нибудь мне помочь? Thx заранее.

+0

где именно он падает? На SubmitChanges? По заданию .type_name ?? –

ответ

6

MSDN states that you should not use the text тип данных, который будет удален в будущих версиях SQL Server. Тип текстовых данных нельзя сравнивать или сортировать, поэтому, если вы хотите сравнить в своем запросе LINQ, вам придется изменить тип.

+0

Итак, какой тип данных вы используете для меня? Я бы хотел «бесконечный». – Marco

+2

varchar (MAX), размер которого равен TEXT, 2^31-1 байтов – scottm

+0

Обратите внимание, что VARCHAR (MAX) доступен только в SQL 2005/2008, поэтому он не является вариантом для баз данных SQL 2000. –

0

Попробуйте это изменение:

aplicacao.type_name = txtAplicações.Text; 

я предполагаю, что вы получаете исключение в этой строке? Кажется, что запрос Linq в порядке, при условии, что tipoCliente является int (даже если бы вы не получили другую ошибку).

+0

Я не понимаю, почему вы бы назвали 'ToString()' в свойстве Text также. – goldenratio

+0

Я просто сделал это, абсолютно уверен, что это была строка ... но я удалил 2 секунды после публикации здесь. – Marco

+0

Это не ошибка сравнения. – scottm

0

Мне интересно, если инструкция обновления, созданная LINQ, автоматически добавляется в строку для type_applications_list = «Независимо от того, что она равна» для вас. Если это так, это может вызвать проблему.

Вы бы попробуйте расширить заявление с линии:

aplicacao.type_applications_list = 
    aplicacao.type_applications_list.Substring(0, 2000); 

или какой-либо другой большой номер в подстроки. Просто чтобы посмотреть, работает ли он тогда.

Альтернативно, если вы используете SQL2005 или выше, вы можете попробовать преобразовать тип данных TEXT в Varchar (MAX). Я знаю, что вы предпочтете не делать этого, пожалуйста, сначала попробуйте мою первую идею.

1

Это просто догадка, но я задаюсь вопросом, запуталась ли проблема с проверкой Оптимистического параллелизма в свойстве type_applications_list. В вашем файле DBML проверьте, установлено ли свойство type_applications_list UpdateCheck для чего-то, кроме «Никогда»; Если да, попробуйте изменить его на «Никогда».

Here's an explanation of Linq to SQL Optimistic Concurrency