2017-10-02 1 views
0

ich diese Ausnahme erhalten, während SELECT-Abfrage ausführen: -ich Visual Composer verwende erhielt ich diesen Fehler

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.

mein Code

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

die Ausnahme selbst besagt, dass Ihre SYM_DETAIL Tabelle Problem ist, während für MED_ID, um Ihren Code zu binden. – Deepak

+0

Können Sie uns Ihre Tabellenstruktur für SYM_DETAIL zeigen? – Deepak

+0

Hier ist die Tabelle Struktur CREATE TABLE [dbo]. [SYM_DETAIL] ( [SY_DID] NUMERIC (18) IDENTITÄT (1, 1) NOT NULL, [S_ID] NUMERIC (18) NULL, [SD_ID] NUMERIC (18) NULL, [MED_ID] ZIFFERN (18) NULL, [SRO] ZIFFERN (18) NULL, [R/A] NVARCHAR (50) NULL, [PNR] ZIFFERN (18) NULL, [SYM] ZIFFERN (18) NULL, [NSYM] NUMERISCH (18) NULL, [DMD] NUMERISCH (18) NULL, PRIMÄRSCHLÜSSEL CLUSTERED ([SY_DID] ASC) ); –

Antwort

0

Hier ist das, was verursacht diese Fehlermeldung:
from SYM_DETAIL sd"+ "inner join MEDICINE

Ihnen fehlt ein Leerzeichen zwischen sd und inner, daher wird der Alias ​​sdinner.

Ein anderes, schwerwiegenderes Problem ist, dass Sie Zeichenfolgen verketten, um Ihre SQL-Anweisung zu erstellen. Dies ist ein Sicherheitsrisiko, da es eine offene Tür für SQL injection Angriffe ist.
Um die Bedrohung zu entfernen, müssen Sie Parameter in Ihrer Abfrage verwenden, daher müssen Sie eine SqlCommand Instanz verwenden.

Außerdem sollten Sie beachten, dass SqlConnection, SqlCommand und SqlDataAdapter alle IDisposable-Schnittstelle implementiert, so sollten Sie sie in einer using Anweisung wickeln.
Ich weiß nicht, was ist die connection Klasse in Ihrem Code, aber von dem, was ich sehe es enthält SqlConnection im Inneren. Ich würde nicht empfehlen, SqlConnection so zu verwenden, da SqlConnection geschlossen und entsorgt werden sollte, um zum Verbindungspool zurückzukehren.

Hier ist, wie ich würde vorschlagen, diesen Code zu schreiben:

// 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]; 
} 
Verwandte Themen