LINQ to SQL 更新 (C#)

4
这是我的表格脚本:
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();
    }

然而,当它运行时,它会崩溃并显示以下内容:“数据类型text和varchar在等于运算符中不兼容。”
我真的不想将SQL数据类型更改为varchar,我希望它保持为text。我进行了一些测试,使用其他数据类型值,例如int...一切都很顺利。
我真的不明白这个问题,因为我正在使用返回一个字符串的控件。
提前感谢您的帮助。
有人能帮帮我吗?提前感谢。

它在哪里崩溃了?是在SubmitChanges上吗?还是在.type_name分配上? - marc_s
4个回答

6

MSDN指出,不应使用文本数据类型,因为它将在未来版本的SQL Server中被删除。文本数据类型无法进行比较或排序,因此如果您想在LINQ查询中进行比较,您需要更改数据类型。


2
varchar(MAX),与TEXT相同大小,为2^31-1字节。 - scottm
请注意,VARCHAR(MAX)仅适用于SQL 2005/2008,因此它不是SQL 2000数据库的选项。 - Chris Shaffer
@Chris,SQL2000的varchar(8000) - scottm
你的回答似乎“有帮助”,因为现在不再出错了... 但它还是没有更新!我除了改变数据类型以外,还需要做其他的事情吗? 难道这段代码不足以实现更新吗? - Marco
@Marco,根据你提供的代码,它应该是在更新。 - scottm

1

这只是一个猜测,但我想知道您是否在 type_applications_list 属性的乐观并发检查方面遇到了问题。请在您的 DBML 文件中检查 type_applications_list 属性是否将 UpdateCheck 设置为除“Never”之外的其他内容。如果是,请尝试将其更改为“Never”。

这里有一个关于 Linq to SQL 乐观并发的解释


0

尝试这个更改:

aplicacao.type_name = txtAplicações.Text;

我猜你是在这一行遇到了异常?看起来Linq查询没问题,只要tipoCliente是一个整数(即使不是,你也会得到不同的错误)。


我不明白为什么你会在Text属性上调用ToString() - goldenratio
我只是为了确保它是一个字符串才这样做的,但在发布到这里后2秒钟就将其删除了。 - Marco
没错 - 我没注意到文本类型。 - cdonner
不,问题就在于LINQ查询。apl.type_id == tipoCliente试图比较varchar和text类型,这是不允许的。 - scottm
对,我没有看到文本类型。 - cdonner

0

我想知道LINQ生成的更新语句是否会自动为type_applications_list =“Whatever it equals”添加一行。如果是这样,它可能会导致问题。

请尝试扩展您的语句并添加此行:

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

或者在子字符串中使用其他大数字,以此来测试它是否有效。

另外,如果您正在使用SQL2005或更高版本,则可以尝试将TEXT数据类型转换为Varchar(MAX)。我知道您不愿意这样做,请先尝试我的第一个想法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接