2010-04-28 17 views
5

questo è il mio codiceIl testo tipi di dati e nvarchar sono incompatibili in uguale all'operatore

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> 

questo è quello che im utilizzando per elencare alcuni prodotti da un database SQL, ogni prodotto ha un collegamento a una pagina di dettagli per mostrare ulteriori inf ormations su di esso

cosa Im cercando è quello di mettere solo l'etichetta del prodotto in che puntano a lasciarlo mostrare qualcosa come www.mysite.com \ prodotti \ batteria (non l'id)

ho immaginato questo dovrebbe funzionare, ma genera un il testo tipi di dati e nvarchar sono incompatibili nella pari a operatore. errore e né (pr => pr.Product1.Equals(id)); funziona

l'errore è chiaro e Im chiedendo come dovrei fare per farlo funzionare in questo modo?

grazie

risposta

22

TEXT colonne in SQL Server sono considerati dati Large Object e quindi non sono indicizzabili/ricercabile. Sono anche deprecati. Quindi, in realtà, il problema è nel tuo database, non nella tua applicazione.

Se si cambia il tipo di colonna ad un varchar(max), è possibile memorizzare la stessa quantità di dati di carattere, ma non dovrebbe avere questo problema. Quindi, aggiorna Linq a entità SQL e non riceverai più questo particolare errore.

Detto questo ... una colonna denominata ID non dovrebbe essere TEXTovarchar(max), dovrebbe essere un ID intero di auto-incremento o un GUID (uniqueidentifier), così si potrebbe desiderare di rivedere il vostro disegno DB. Ma a patto di avere buone ragioni per gli ID per essere valori di stringa di dimensione arbitraria, quanto sopra modifica consentirà di filtrare sulla colonna.

+0

Grazie! funziona impostandolo su varchar (max), un'altra piccola domanda: che dire del modo in cui sto restituendo il productx, è una best practice? – Hassen

+0

@metro: Il modo in cui si spedisce la 'Product' va bene. Ma se parliamo di best practice, dovresti * davvero * prendere in considerazione l'utilizzo di un diverso tipo di dati per l'ID; ti imbatterai in * maggiori * problemi di prestazioni con caratteri di grandi dimensioni. – Aaronaught

0

Questo problema può verificarsi quindi utilizzare:

Esempio

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

Ciò è incompatibile:

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

Cambia

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