2017-04-10 2 views
0

Je suis en train de rechercher l'ID max dans la base de données, puis l'incrémente de 1 pour chaque nouvelle entrée comme indiqué ci-dessous:chaîne SQL ou les données binaires seront tronquées

var query2 = dbb.Database.SqlQuery<patient_visit>("SELECT MAX(CAST(SUBSTRING(pvid, 3, 10) AS int)) FROM patient_visit"); 

      if (query2 != null) 
      { 
       objDetails.pvid = query2.ToString(); 
       objDetails.pvid += 1; 
       objDetails.pvid = "PV" + objDetails.pvid; 
      } 

string sql = "INSERT INTO patient_visit (pvid,paid) " + 
         "VALUES('" + objDetails.pvid + "', '" + paid + "')"; 

Mais lorsque je tente d'insérer dans la base de données, il donne erreur

Une exception de type « System.Data.SqlClient.SqlException » eu lieu dans EntityFramework.SqlServer.dll mais n'a pas été traitée dans le code utilisateur

informations complémentaires: String ou binaire un serait tronqué.

J'ai essayé d'exécuter la requête dans SQL Server et vérifié la valeur de « pvid », il est 10 donc après i INCLUDE « PV » au pvid entier, il devrait être 12. Il devrait être bien , mais pourquoi ai-je eu cette erreur? S'il vous plaît quelqu'un peut-il m'aider?

[Key] 
    [MaxLength(20), MinLength(12)] 
    public string pvid { get; set; } 

Lorsque je remplace le pvid par un ID de code, cela fonctionne très bien. Pourquoi cela arrive-t-il? P/S: Je sais qu'il n'est pas conseillé de simplement concaténer les données d'entrée avec la requête, mais j'ai aussi essayé d'interroger en utilisant une requête paramétrée mais elle donne la même erreur.

string sql = "INSERT INTO patient_visit (pvid,paid) " + 
         "VALUES(@pvid, @paid)"; 
List<SqlParameter> parameterList = new List<SqlParameter>(); 
parameterList.Add(new SqlParameter("@pvid", objDetails.pvid)); 
parameterList.Add(new SqlParameter("@paid", paid)); 
SqlParameter[] parameters = parameterList.ToArray(); 
dbb.Database.ExecuteSqlCommand(sql, parameters); 
+1

pouvez-vous s'il vous plaît nous dire pourquoi vous utilisez une chaîne pvid et incrémenter de 1 où vous pouvez utiliser un champ auto-incrémenté? – maSTAShuFu

+0

@maSTArHiAn J'utilise SQL Server 2012 pour ma base de données. Je ne suis pas vraiment familier avec cela, peut-il être fait avec SQL Server 2012? Comment? – Nurul

Répondre

0

Vérifiez la longueur du champ de la colonne dans laquelle vous essayez de placer les données.

J'ai eu ce problème auparavant où la colonne était varchar (10) et j'essayais de concaténer deux chaînes de caractères de 6 caractères chacune. Les faisant 12 caractères de long. 2 plus long que le champ cible.

Votre problème peut être similaire.

+0

Comment vérifier la longueur du champ? – Nurul

+0

@Nurul: vous regardez la ** définition ** de la colonne dans la table, et avant que l'insertion ne se produise, lorsque vous déboguez, vous vérifiez la ** longueur des chaînes ** que vous passez en valeurs ..... –

+0

@marc_s où exactement je vérifie ça? Dans la console Locaux dans Visual Studio ou dans le serveur SQL? Désolé je suis si désolé à ce sujet :( – Nurul