【问题标题】:The data types text and nvarchar are incompatible in the equal to operator数据类型 text 和 nvarchar 在等于运算符中不兼容
【发布时间】:2010-04-28 03:33:33
【问题描述】:

这是我的代码

ProductController.cs

public ActionResult Details(string id)
{
    product productx = productDB.products.Single(pr => pr.Product1 == id);
    return View(productx);


}

Details.aspx

    <td>
        <%-- : Html.ActionLink("Edit", "Edit", new { id=item.Id }) % --> 
        <%: Html.ActionLink("Details", "Details", new { id = item.Product1 })%>
    </td>

这是我用来从 sql 数据库中列出一些产品的方法,每个产品都有一个指向详细信息页面的链接,以显示有关它的更多信息

我试图只将产品标签放在该链接中,让它显示类似 www.mysite.com\products\battery (不是 id)

我认为这应该可行,但它会抛出 数据类型 text 和 nvarchar 在等于运算符中不兼容。 错误和 (pr =&gt; pr.Product1.Equals(id)); 都不起作用

错误很明显,我问我应该怎么做才能让它这样工作?

谢谢

【问题讨论】:

    标签: c# asp.net-mvc linq-to-sql


    【解决方案1】:

    TEXT SQL Server 中的列被视为大对象数据,因此不可索引/不可搜索。它们也已被弃用。所以,实际上,问题出在您的数据库中,而不是在您的应用程序中。

    如果将列类型更改为varchar(max),则可以存储相同数量的字符数据,但应该不会出现此问题。然后,更新您的 Linq to SQL 实体,您将不再收到此特定错误。

    话虽如此...名为ID 的列不应该是TEXT varchar(max),它应该是一个自动递增的整数ID 或GUID (uniqueidentifier ),因此您可能需要重新审视您的数据库设计。但假设您有充分的理由将 ID 设为任意大小的字符串值,则上述更改将允许您对列进行过滤。

    【讨论】:

    • 谢谢!它通过将其设置为 varchar(max) 来工作,另一个小问题:我返回 productx 的方式如何,这是最佳实践吗?
    • @metro:您返回Product 的方式很好。但如果我们谈论的是最佳实践,您真的应该考虑为 ID 使用不同的数据类型;您会遇到大字符类型的主要性能问题。
    【解决方案2】:

    这个问题可能会出现然后使用:

    示例

    string sql = "Select * from TB_USER where Name = @Name";
    SqlCommand cmd = new SqlCommand(sql);
    

    这是不兼容的:

    cmd.Parameters.Add("@Nome", SqlDbType.Text).Value = nome;
    

    更改为:

    cmd.Parameters.Add("@Nome", SqlDbType.VarChar, 50).Value = nome;
    

    【讨论】:

      猜你喜欢
      • 2014-02-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-13
      • 1970-01-01
      • 2020-02-28
      • 2013-05-08
      相关资源
      最近更新 更多