2017-10-02 4 views
0

J'ai reçu cette exception lors de l'exécution requête de sélection: -J'utilise Visual Composer je reçu cette erreur

An exception of type 'System.Data.SqlClient.SqlException' occurred in System.Data.dll but was not handled in user code .The multi-part identifier "sd.MED_ID" could not be bound.

Mon code est

connection conec = new connection(); 
SqlDataAdapter sqlDataAdapter ; 
SqlCommandBuilder sqlCommandBuilder ; 
DataSet ds; 

private void set_data_Click(object sender, EventArgs e) 
{ 
    conec.conopen(); 
    //string query="Select S_ID as 'SYMPTOM NO',SD_ID as 'DISK NO',MED_ID as 'MED NAME',SRO,PNR,SYM as '% SYM',DMD from SYM_DETAIL"; 
    sqlDataAdapter = new SqlDataAdapter("Select SY_DID,S_ID as 'SYMPTOM NO',SD_ID as 'DISK NO',m.med_name as 'MED NAME',SRO,PNR,SYM as '% SYM',DMD from SYM_DETAIL sd"+ 
     "inner join MEDICINE m on sd.MED_ID=m.med_Id where sd.S_ID="+txtbxsymid_update.Text+" and sd.SD_ID="+txtbxdiskid_update.Text+"", conec.con); 
    ds = new System.Data.DataSet(); 
    sqlDataAdapter.Fill(ds, "SYM_DETAIL"); 
    dataGridView1.DataSource = ds.Tables[0]; 
+0

L'exception s'indique que votre table de SYM_DETAIL est d'avoir problème tout en se liant à votre code pour med_id. – Deepak

+0

Pouvez-vous nous montrer la structure de votre table pour SYM_DETAIL? – Deepak

+0

Voici la table Structure CREATE TABLE [dbo]. [SYM_DETAIL] ( [SY_DID] NUMERIQUE (18) IDENTITE (1, 1) NON NULL, [S_ID] NUMERIQUE (18) NULL, [SD_ID] NUMERIQUE (18) NULL, [med_id] NUMERIQUE (18) NULL, [SRO] NUMERIQUE (18) NULL, [R/A] NVARCHAR (50) NULL, [DP] NUMERIQUE (18) NULL, [SYM] NUMERIQUE (18) NULL, [NSYM] NUMERIQUE (18) NULL, [DMD] NUMERIQUE (18) NULL, CLAVIER PRIMAIRE ([SY_DID] ASC) ); –

Répondre

0

Voici ce qui cause cette erreur:
from SYM_DETAIL sd"+ "inner join MEDICINE

Il vous manque un espace entre sd et inner, donc l'alias devient sdinner.

Un autre problème plus grave est que vous concaténiez des chaînes pour créer votre instruction SQL. C'est un risque pour la sécurité car c'est une porte ouverte pour les attaques SQL injection.
Pour supprimer la menace, vous devez utiliser des paramètres dans votre requête. Vous devez donc utiliser une instance SqlCommand.

En outre, il faut noter que SqlConnection, SqlCommand et SqlDataAdapter tous implémente l'interface IDisposable, vous devriez donc les envelopper dans une déclaration using.
Je ne sais pas quelle est la classe connection dans votre code mais de ce que je vois il contient SqlConnection à l'intérieur. Je ne recommanderais pas d'utiliser SqlConnection comme ceci puisque SqlConnection devrait être fermé et disposé pour retourner au groupe de connexion.

Voici comment je suggère d'écrire ce code:

// a class member 
private string connectionString; 

// In your constructor 
connectionString = ConfigurationManager.ConnectionStrings["connectionString"].ConnectionString; 

private void set_data_Click(object sender, EventArgs e) 
{ 
    var ds = new DataSet(); 
    var query = "Select SY_DID, S_ID as 'SYMPTOM NO', SD_ID as 'DISK NO', m.med_name as 'MED NAME', SRO, PNR, SYM as '% SYM', DMD" + 
       " from SYM_DETAIL sd" + 
       " inner join MEDICINE m on sd.MED_ID=m.med_Id" + 
       " where sd.S_ID = @S_ID" + 
       " and sd.SD_ID= @SD_ID"; 
    using(var con = new SqlConnection(connectionString) 
    { 
     using(var cmd = new SqlCommand(query, con)) 
     { 
      cmd.Parameters.Add("@S_ID", SqlDbType.VarChar).Value = txtbxsymid_update.Text; 
      cmd.Parameters.Add("@SD_ID", SqlDbType.VarChar).Value = txtbxdiskid_update.Text; 
      using(var adapter = new SqlDataAdapter(cmd)) 
      { 
       adapter.Fill(ds, "SYM_DETAIL"); 
      } 
     } 
    } 
    dataGridView1.DataSource = ds.Tables[0]; 
}