23 messaggi dal 28 novembre 2005
Ho riscontrato un problema durante l'insert di una colonna IDENTITY TINYINT fatto tramite il submitChanges di LINQ

L'errore che da è:

The primary key column of type 'TinyInt' cannot be generated by the server.

Ovviamente è possibile inserire i record usando ADO.NET e i dataset tipizzati, ma proprio con LINQ devo per forza cambiare la colonna IDENTITY in INT altrimenti non va.

Sapete a cosa può essere dovuto il problema?

Ecco il dettagli dell'errore:

Errore server nell'applicazione '/'.
--------------------------------------------------------------------------------

The primary key column of type 'TinyInt' cannot be generated by the server.
Descrizione: Eccezione non gestita durante l'esecuzione della richiesta Web corrente. Per ulteriori informazioni sull'errore e sul suo punto di origine nel codice, vedere l'analisi dello stack.

Dettagli eccezione: System.NotSupportedException: The primary key column of type 'TinyInt' cannot be generated by the server.

Errore nel codice sorgente:


Riga 179: newType.Issued = chkIssued.Checked
Riga 180: db.DocumentTypes.InsertOnSubmit(newType)
Riga 181: db.SubmitChanges()
Riga 182: LoadDocumentTypes()
Riga 183: ddlDocumentType.SelectedValue = newType.DocumentTypeId


File di origine: C:\inetpub\wwwroot\Default.aspx.vb Riga: 181

Analisi dello stack:


[NotSupportedException: The primary key column of type 'TinyInt' cannot be generated by the server. ]
System.Data.Linq.SqlClient.QueryConverter.GetIdentityExpression(MetaDataMember id, Boolean isOutputFromInsert) +540
System.Data.Linq.SqlClient.QueryConverter.VisitInsert(Expression item, LambdaExpression resultSelector) +1514
System.Data.Linq.SqlClient.QueryConverter.VisitDataManipulationCall(MethodCallExpression mc) +192
System.Data.Linq.SqlClient.QueryConverter.VisitMethodCall(MethodCallExpression mc) +109
System.Data.Linq.SqlClient.QueryConverter.VisitInner(Expression node) +935
System.Data.Linq.SqlClient.QueryConverter.ConvertOuter(Expression node) +97
System.Data.Linq.SqlClient.SqlProvider.BuildQuery(Expression query, SqlNodeAnnotations annotations) +416
System.Data.Linq.SqlClient.SqlProvider.System.Data.Linq.Provider.IProvider.Execute(Expression query) +443
System.Data.Linq.StandardChangeDirector.DynamicInsert(TrackedObject item) +260
System.Data.Linq.StandardChangeDirector.Insert(TrackedObject item) +168
System.Data.Linq.ChangeProcessor.SubmitChanges(ConflictMode failureMode) +255
System.Data.Linq.DataContext.SubmitChanges(ConflictMode failureMode) +1120
System.Data.Linq.DataContext.SubmitChanges() +81
_Default.btnSaveType_Click(Object sender, EventArgs e) in C:\inetpub\wwwroot\Default.aspx.vb:181
System.Web.UI.WebControls.Button.OnClick(EventArgs e) +105
System.Web.UI.WebControls.Button.RaisePostBackEvent(String eventArgument) +107
System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument) +7
System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument) +11
System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData) +33
System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +1746




--------------------------------------------------------------------------------
Informazioni di versione: Versione di Microsoft .NET Framework:2.0.50727.1433; Versione di ASP.NET:2.0.50727.1433
3.121 messaggi dal 29 ottobre 2001
Contributi | Blog
Curioso bug. Testato ora e mi dà errore. Solo con quel tipo di dati dà il problema.

Un trucco per scavalcare il problema è modificare il tipo di dato direttamente in VS2008. Se usi l'oggetto "Linq to Sql" in VS2008, nelle proprietà della classe creata ti è sufficiente modificare in "SmallInt NOT NULL IDENTITY" il "Server data type" per quel campo.

Ciao
23 messaggi dal 28 novembre 2005
Innanzitutto grazie Andrea per aver dedicato del tempo e fatto delle prove sul problema da me esposto.

La tua soluzione permette di risolvere il problema degli insert, ma purtroppo porta ad un effetto collaterale che provoca un errore nei select.

Ecco il codice dell'errore che avviene quando viene eseguita la query (in questo caso durante un databind):

Cast specificato non valido.
Descrizione: Eccezione non gestita durante l'esecuzione della richiesta Web corrente. Per ulteriori informazioni sull'errore e sul suo punto di origine nel codice, vedere l'analisi dello stack.

Dettagli eccezione: System.InvalidCastException: Cast specificato non valido.

Errore nel codice sorgente:


Riga 52: ddlDocumentType.DataTextField = "TypeName"
Riga 53: ddlDocumentType.DataValueField = "DocumentTypeId"
Riga 54: ddlDocumentType.DataBind()
Riga 55: End If
Riga 56: End Sub


File di origine: C:\inetpub\wwwroot\Default.aspx.vb Riga: 54

Analisi dello stack:


[InvalidCastException: Cast specificato non valido.]
System.Data.SqlClient.SqlBuffer.get_Int16() +122
System.Data.SqlClient.SqlDataReader.GetInt16(Int32 i) +39
Read_VB$AnonymousType_1`2(ObjectMaterializer`1 ) +74
System.Data.Linq.SqlClient.ObjectReader`2.MoveNext() +26
System.Collections.Generic.List`1..ctor(IEnumerable`1 collection) +441
System.Linq.Enumerable.ToList(IEnumerable`1 source) +54
System.Data.Linq.Provider.BindingList.Create(DataContext context, IEnumerable`1 sequence) +58
System.Data.Linq.DataQuery`1.GetNewBindingList() +52
System.Data.Linq.DataQuery`1.System.ComponentModel.IListSource.GetList() +16
System.Web.UI.DataSourceHelper.GetResolvedDataSource(Object dataSource, String dataMember) +48
System.Web.UI.WebControls.ReadOnlyDataSource.System.Web.UI.IDataSource.GetView(String viewName) +38
System.Web.UI.WebControls.DataBoundControl.ConnectToDataSourceView() +226
System.Web.UI.WebControls.DataBoundControl.GetData() +4
System.Web.UI.WebControls.ListControl.OnDataBinding(EventArgs e) +21
System.Web.UI.WebControls.ListControl.PerformSelect() +31
System.Web.UI.WebControls.BaseDataBoundControl.DataBind() +70
_Default.LoadDocumentTypes() in C:\inetpub\wwwroot\Default.aspx.vb:54
_Default.Page_Load(Object sender, EventArgs e) in C:\inetpub\wwwroot\Default.aspx.vb:31
System.Web.UI.Control.OnLoad(EventArgs e) +99
System.Web.UI.Control.LoadRecursive() +47
System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +1436



Un bug del genere è abbastanza difficile da capire. Al momento l'unica soluzione che ho in mente di adottare è quella di sostituire tutte le chiavi primarie di tipo TinyInt con chiavi di tipo SmallInt.
Tuttavia non riesco a capacitarmi di come Microsoft abbia potuto fare un errore di questo tipo senza accorgersene (sempre che non sia io che sbaglio e non riesco a vedere il reale motivo di questo comportamento).
3.121 messaggi dal 29 ottobre 2001
Contributi | Blog
Ok, avevo fatto solo dei test per l'inserimento, non avevo controllato le select

Un trucco possibile sarebbe quello di andare a modificare a mano il codice creato, ma non so quanto ne vale la pena...

Un bello e strano bug! Grazie per la segnalazione

Ciao

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.