J'écris un serveur de jeu auquel de nombreux joueurs se connectent. Je charge la base de données dans un DataSet (fortement typé). Chaque fois qu'un joueur se connecte, j'ajoute une nouvelle ligne à la table Messages en utilisant un TableAdapter.DataSet déclenche une exception NoNullAllowedException même si une valeur est transmise!
code
var newRow = _db.Messages.NewMessagesRow(); // _db is a strong-typed-dataset
{
newRow.Title = title;
newRow.Text = text;
newRow.ReceiverUID = receiverUID;
newRow.Deleted = false;
}
// I lock the _db.Messages, so it happens one at a time
lock (_db.Messages)
{
_db.Messages.AddMessagesRow(newRow);
_adapterMessages.Connection.Open();
_adapterMessages.Update(newRow);
newRow.MessageID = (Int64)_adapterMessages.GetIdentity();
newRow.AcceptChanges();
_adapterMessages.Connection.Close();
}
NewMessagesRow() et AddMessagesRow() sont générés automatiquement par VS. Je l'ai fait en ajoutant un élément DataSet (fichier .xsd) et en y glissant toutes les tables DB.
public MessagesRow NewMessagesRow() {
return ((MessagesRow)(this.NewRow()));
}
public void AddMessagesRow(MessagesRow row) {
this.Rows.Add(row);
}
_db est un ensemble de données (fortement typé, généré automatiquement par VS) de _db.Messages est un DataTable.
alors que dans les tests, je reçois
System.Data.NoNullAllowedException: Column 'Deleted' does not allow nulls.
at System.Data.DataColumn.CheckNullable(DataRow row)
at System.Data.DataTable.RaiseRowChanging(...)
at System.Data.DataTable.SetNewRecordWorker(...)
at System.Data.DataTable.InsertRow(...)
at System.Data.DataRowCollection.Add(DataRow row)
at Server.Database.MessagesDataTable.AddMessagesRow(MessagesRow row)
AddMessagesRow() est appelée uniquement dans le code ci-dessus, et j'ai toujours mis faux pour la colonne supprimée, mais obtient toujours ce message ...
I n'utilisez pas _adapterMessages n'importe où ailleurs, mais il existe d'autres adaptateurs (_adapterUsers, _adapterMatches, ... etc) qui peuvent être utilisés simultanément. Je ne reçois pas l'exception à chaque fois, mais si le serveur fonctionne pendant quelque temps (comme> 30 min) avec environ 1000 joueurs simultanés, cela arrive.
Toute aide ou conseil sera grandement apprécié. Merci :)
Pls code postal pour NewMessagesRow et AddMessagesRow, et la définition des _db.Messages –
I posté le code pour NewMessagesRow() et AddMessagesRow() :) _db.Messages est juste System.Data.TypedTableBase qui étend DataTable. En bref, ils sont tous simplement DataTable, et DataSet ..etc générés par VS pour soutenir les types forts. –
wooohoh