Frage zum sqladapter

01/03/2010 - 21:01 von Mike Thies | Report spam
Hallo,

Ich habe in meinem windows form constructor
ein sqladapter objekt erstellt

daBuchungsSuche = new SqlDataAdapter(query,con)
daBuchungsSuche.TableMappings.Add("Table", "buchungssuche");
daBuchungsSuche.Fill(ds);

//die werte meinem controll zugewiesen
dsView = ds.DefaultViewManager;
grdBrowserAllg.DataSource = dsView;
grdBrowserAllg.DataMember = "buchungssuche";



//die members meiner winform classe
private String ConnectionString = @"Data Source=MAYA\SQLEXPRESS;Initial
Catalog=Flugzeugverwaltung;Trusted_Connection=yes;User ID=sa";
private DataViewManager dsView;
private DataSet ds;
private String sqlQuery;
private SqlConnection con;
private SqlDataAdapter daBuchungsSuche;
private SqlCommand sqlCmd;

Das funktioniert auch soweit alles!


Was nicht funktioniert:
Ich möchte per btnAnfrage_Click eine dynamische Abfrage über mehere
comboboxen erstellen und diese meinem bestehendem sqladapter
"daBuchungssuche" mitgeben.
sodass sich mein grdBrowserAllg entsprechend aktuallisiert.
leider wird mein dataset nicht aktuallisiert, jedenfalls àndert
sich in meinem grdBrowserAllg nichts.
Wie kann ich meinen TempTable buchungssuche aktuallisieren über mein
bestehendes sqladapter objekt bzw. in meinem grdBrowserAllg das Ergebnis
meiner aktuallisierten Abfrage anzeigen lassen ?

hier die event methode:

private void btnAnfrage_Click(object sender, EventArgs e)
{

string sqlQuery = "select b.datum, fl.bezeichnung, b.vonStunde,
b.bisStunde " +
"from buchungen as b " +
"join flugzeuge as fl " +
"on b.idFlugzeug = fl.idFlugzeug " +
"join flugzeugtypen as ft " +
"on fl.idFlugzeugtyp = ft.idFlugzeugtyp " +
"where b.datum = cast('" +
dtpDatum.Value.ToString("dd.MM.yyyy") +
"' as datetime) ";
if (cbxTyp.Text != "")
sqlQuery += "and ft.idFlugzeugtyp = '" +
cbxTyp.Text.ToString() + "'";
if (cbxFlz.Text != "")
sqlQuery += "and fl.bezeichnung = '" +
cbxFlz.Text.ToString() + "'";

sqlCmd = new SqlCommand(sqlQuery, con);
daBuchungsSuche.SelectCommand = sqlCmd;

(!daBuchungsSuche.TableMappings.Contains("buchungssuche"))
{

daBuchungsSuche.TableMappings.Add("Table","buchungssuche");
}

daBuchungsSuche.Fill(ds);

dsView = ds.DefaultViewManager;
grdBrowserAllg.DataSource = dsView;
grdBrowserAllg.DataMember = "buchungssuche";
}
 

Lesen sie die antworten

#1 Elmar Boye
02/03/2010 - 11:26 | Warnen spam
Hallo Mike,


"Mike Thies" schrieb im Newsbeitrag news:4b8c1cfe$0$13967$
Ich habe in meinem windows form constructor
ein sqladapter objekt erstellt

daBuchungsSuche = new SqlDataAdapter(query,con)
daBuchungsSuche.TableMappings.Add("Table", "buchungssuche");
daBuchungsSuche.Fill(ds);

//die werte meinem controll zugewiesen
dsView = ds.DefaultViewManager;
grdBrowserAllg.DataSource = dsView;
grdBrowserAllg.DataMember = "buchungssuche";



Verzichte auf den DefaulViewManager, der bringt nichts.
Entweder binde direkt an das DataSet
grdBrowserAllg.DataSource = ds;
grdBrowserAllg.DataMember = "buchungssuche";

oder aber (für die weitere Behandlung oft besser),
schalte eine BindingSource dazwischen:
http://msdn.microsoft.com/de-de/lib...ource.aspx

Dim bs As new BindingSource(ds, "buchungssuche");
grdBrowserAllg.DataSource = bs;

wobei die BindingSource auch als Komponente
auf dem Formular erstellt werden kann.


private void btnAnfrage_Click(object sender, EventArgs e)
{

string sqlQuery = "select b.datum, fl.bezeichnung, b.vonStunde, b.bisStunde " +
[...]
"where b.datum = cast('" + dtpDatum.Value.ToString("dd.MM.yyyy") +
"' as datetime) ";



Bitte mache es gleich richtig und verwende dafür SqlParameter Objekte.
Dann bekommst Du hier keine Probleme, wenn die Datumseinstellungen nicht
deutsch sind. Siehe auch:
http://www.insidesql.org/beitraege/...datentypen

if (cbxTyp.Text != "")
sqlQuery += "and ft.idFlugzeugtyp = '" + cbxTyp.Text.ToString() + "'";



Undr hier genauso. So etwas kriegt u. a. Probleme, wenn mal ein Anführungsstrich
in der Bezeichnung vorkommt. Von solchen Dingen wie Sql Injection, die hier
(eher theoretisch) auch möglich sind, mal zu schweigen.

Zumal parametrisierte Abfragen beim SQL Server auf den Plan Cache zurückgreifen
können und so eine effizienteren Abfrageausführung fördern.

Aus Wartungsgesichtspunkten ist es ohnehin das beste eine getrennte Klasse
daraus zu machen, wie es auch bei den typisierten DataSets passiert.

Angedeutet könnte das wie folgt aussehen, wobei ich einige Änderungen
vorgenommen habe, um die Abhàngigkeiten von Formularfelder etc. zu entfernen.

class FlugAdapter
{
private string _connectionString;

public FlugAdapter(string connectionString)
{
this._connectionString = connectionString;
}

public void Fill(DataTable table, DateTime datum, string typ, string bezeichnung)
{
SqlCommand command = new SqlCommand("", new SqlConnection(this._connectionString));

string query = "select b.datum, fl.bezeichnung, b.vonStunde, b.bisStunde " +
"from buchungen as b " +
"join flugzeuge as fl " +
"on b.idFlugzeug = fl.idFlugzeug " +
"join flugzeugtypen as ft " +
"on fl.idFlugzeugtyp = ft.idFlugzeugtyp " +
"where b.datum = @datum";
command.Parameters.Add("@datum", SqlDbType.DateTime).Value = datum;

if (!String.IsNullOrEmpty(typ))
{
query += " AND ft.idFlugzeugtyp = @typ";
// Typ und Lànge entsprechend anpassen
command.Parameters.Add("@typ", SqlDbType.NVarChar, 40).Value = typ;
}
if (!String.IsNullOrEmpty(bezeichnung))
{
query += "and fl.bezeichnung = @bezeichnung";
// Typ und Lànge entsprechend anpassen
command.Parameters.Add("@bezeichnung", SqlDbType.NVarChar, 40).Value = bezeichnung;
}
command.CommandText = query;

using (SqlDataAdapter adapter = new SqlDataAdapter(command))
{
adapter.MissingMappingAction = MissingMappingAction.Passthrough;
adapter.MissingSchemaAction = MissingSchemaAction.AddWithKey;
// buchungssuche
adapter.Fill(table);
}
}
}

Du würdest dann den FlugAdapter als Klasse einbinden.
Bei der Verbindungszeichenfolge hàngt es etwas davon ab, wie variable die ist.
Ist sie (immer) fix kannst Du sie aus den Properties direkt im Construktor
zuweisen.

und der Aufruf reduziert sich im btn_Click auf:
this.flugAdapter.Fill(ds.Tables["buchungssuche"],
dtpDatum, cbxTyp.Text, cbxFlz.Text);

ggf. mit einem voraussgehenden
ds.Tables["buchungssuche"].Clear();


Gruß Elmar

Ähnliche fragen