2016-12-14 3 views
1

Je crée une application web en C# dans l'application je suis en train de créer un webservice pour trouver un numéro de formationLes types de données varchar et varchar sont incompatibles dans l'opérateur modulo C# service web

[WebMethod] 
[ScriptMethod(UseHttpGet = true)] 
public void saverecd(string total, string date, string utrno, string modeofpayment, string transferdate,string trainer, string typeofadj) 
{ 
    System.Globalization.CultureInfo enGB = new System.Globalization.CultureInfo("en-GB"); 
    DateTime dt = Convert.ToDateTime(date, enGB); 
    Int64 paymentid = 0; 
    string dt1 = dt.ToString("yyMMdd"); 
    string dt2 = dt1 + "0001"; 
    paymentid = Convert.ToInt64(dt2); 
    SqlCommand cmd = new SqlCommand("select max(paymentid)as paymentid from finalinstructoreexpense where paymentid like ''%' "+ paymentid +" '%''", con); 
    con.Open(); 
    SqlDataReader dr = cmd.ExecuteReader(); 
    while (dr.Read()) 
    { 
     paymentid = paymentid + 1; 
    } 
} 

ce que je avait fait jusqu'à présent, mais quand je lance le service Web j'obtiens l'erreur

System.Data.SqlClient.SqlException: les types de données varchar et varchar sont incompatibles dans l'opérateur modulo.

à mvcerp2.newpayment.saverecd (total String, Date de String, String utrno, String modeofpayment, String transferdate, formateur String, chaîne typeofadj) en Z: \ mvcerp2 \ mvcerp2 \ newpayment.asmx.cs: ligne 88

et SqlDataReader dr = cmd.ExecuteReader(); ceci est ma ligne 88

comment se débarrasser de ce problème ??

+0

Fondamentalement, arrêtez de créer SQL comme ça. Utilisez plutôt SQL paramétré. Actuellement, vous avez trop d'apostrophes, mais si vous utilisiez un SQL paramétré, vous n'auriez pas * a * apostrophes - vous auriez juste un paramètre. –

Répondre

4

Le problème est ''%' "+ paymentid +" '%''. D'abord, vous utilisez trop de guillemets, ce qui termine le littéral et pense à la place que le % est un opérateur. Deuxièmement, vous êtes enclin à l'injection SQL. Vous pouvez résoudre cela facilement en ajoutant un paramètre à votre requête. La dernière de votre requête devrait se lire comme suit:

where paymentid like '%' + @paymentid +'%' 

Ajouter à votre commande:

cmd.Parameters.AddWithValue("@paymentid", paymentid); 

Vous pouvez également combiner le côté client de chaîne, de sorte que cela signifie que vous finissez avec ceci:

where paymentid like @paymentid 

Ajouter à votre commande:

cmd.Parameters.AddWithValue("@paymentid", "%" + paymentid + "%"); 
+0

Doute à propos de cette approche: ''%' + @paymentid + '%''. Je pense que vous avez besoin de créer un paramètre avec value = "%" + yourValue + "%". Et puis en l'utilisant dans la requête 'WHERE colonne LIKE @ paramètre' – Fabio

+0

Cela est également possible. Cela fonctionnera. Faites-moi confiance @Fabio –

+0

@PatrickHofman comment cela fonctionne réellement ?? –