PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : C# DataGrid mit SQL-Daten bestücken.


JasonX
2015-02-11, 14:33:00
Hallo,

ich möchte für uns ein kleines Tool programmieren, das den Updatestatus unserer Kunden überprüft und uns ggf. auch daran erinnert.

Jetzt haben wir bei uns ein CRM-System im Einsatz, dass auf Microsoft SQL 2012 aufbaut.

Ich kann die Daten auch bereits auslesen, jedoch würde ich gerne das ganze über eine Art erstbestückung realisieren.
Hierzu sollen die Daten in ein vordefiniertes DataGrid übergeben werden.

Derzeit wird das Datagrid direkt aus dem SQL bestückt. Daraus resultiert, das auch die Spaltenüberschriften mit übernommen werden. Und wenn ich Änderungen darin vornehmen würde, werden die auch in der CRM übernommen. Das darf aber nicht passieren, da sonst unser Support anspruch beim Hersteller erlischt.

Screenshot unten ist das DataGrid mit direkt aus der Datenbank gelesenen Tabellen.

Falls ich etwas unklar formuliert habe, kann ich das ganze auch detailierter ausschmücken. :)

Danke im vorraus
Jason

RattuS
2015-02-11, 15:42:55
Ohhh ich beschwöre dich Glaskugel!

Wenn du die Daten nur einlesen willst, verwende eine DataSource ohne BindingSource.

samm
2015-02-11, 22:33:27
Und man kann den Eigenschaften des Controls direkt Updates und Inserts verbieten.

Matrix316
2015-02-12, 12:15:41
Autogeneratecolumns ausschalten. Spalten mit korrekten Feldern ins Grid einfügen.

Daten in DataSet laden.

DataSet der DataSource des Grids zuweisen.

Und so.

JasonX
2015-02-13, 20:55:35
Hallo,

Ich habs inzwischen hinbekommen das DataGridView mit Daten der SQL-Datenbank zu befüllen.

Diese werden mir nun angezeigt und sollen über einen Button auf eine andere Datenbank und Tabelle übertragen werden. Dies wollte ich über ein DataSet realisieren. Jedoch schießt der Button das Programm.

Folgender Code steckt hinter dem Button:


private void button5_Click(object sender, EventArgs e)
{
//Öffnen der SQL-Verbindung zur Centron

SqlConnection centron = new SqlConnection();
centron.ConnectionString = @"Data Source=centron\CENTRON;Initial Catalog=centron;User ID=xxx;Password=xxx";
centron.Open();
SqlDataAdapter sdaCentron = new SqlDataAdapter("SELECT I3D AS Kundennummer,Name AS Kundenname,KdEMail AS Kundenmail,Fon AS Telefon FROM Kunden", centron);

//Übertragen der Daten aus der Datenbank in das DataGridView

DataSet dsCentron = new DataSet();
dsCentron.Tables.Add("centrontbl");
sdaCentron.Fill(dsCentron, "centrontbl");
dgvCentron.DataSource = dsCentron;
dgvCentron.DataMember = "centrontbl";

//Öffnen der SQL-Verbindung zur Update DB

SqlConnection updateDB = new SqlConnection();
updateDB.ConnectionString = @"Data Source=centron\CENTRON;Initial Catalog=UpdateDB;User ID=xxx;Password=xxx";
updateDB.Open();
SqlDataAdapter sdaUpdateDB = new SqlDataAdapter("SELECT ID AS Kundennummer, Name AS Kunde, EMail AS Mail, Phone AS Telefon FROM Kunden", updateDB);

/*//Centron DataGridView in ein Dataset übertragen
DataSet dsTransfer = new DataSet();
DataTable dtTransfer = new DataTable("CentronDataGrid");

dsTransfer.Tables.Add(dtTransfer);
foreach (DataGridViewColumn col in dgvCentron.Columns) dtTransfer.Columns.Add(col.HeaderText,typeof(string));
foreach (DataGridViewRow row in dgvCentron.Rows)
{
foreach (DataGridViewCell cel in row.Cells)
{
dtTransfer.Rows[row.Index][cel.ColumnIndex] = cel.Value;
}
}*/

//DataSet dsTransfer = new DataSet();
//dsTransfer = dsCentron;

SqlCommandBuilder cmdbl = new SqlCommandBuilder(sdaUpdateDB);
sdaUpdateDB.Update(dsCentron, "centrontbl");
}



Nun prüfe ich immer nach dem Ausführen, ob sich was getan hat, jedoch wird die UpdateDB nicht mit dem Inhalt der anderen DB befüllt. So als ob das DataSet Leer wäre, obwohl genau dieses DataSet auch das DataGridView befüllt.

Ich finde den Fehler auch nicht und bin mit meinem Latein am Ende :(

Danke im Voraus
Jason

Matrix316
2015-02-13, 22:05:37
Du könntest natürlich auch einfach über einen SQL Befehl den Inhalt von der einen in die andere Tabelle transferieren...;)

Ist das Dataset denn gefüllt?

JasonX
2015-02-13, 23:11:06
Ist das Dataset denn gefüllt?

:wink:

So als ob das DataSet Leer wäre, obwohl genau dieses DataSet auch das DataGridView befüllt


Wie gesagt, deswegen weiß ich nicht wo mein Fehler liegt.
Schließlich hat mein DataGridView auch Inhalt bekommen

Zum Thema mit SQL befüllen.

https://www.youtube.com/watch?v=_i4mYXSaD4w

Ich hab mich nach diesem Video hier gerichtet. Vielleicht missverstehe ich ja auch den Sinn von. Witzigerweise wird bei dem Video, der Inhalt der DB aktualisiert.
:frown:

MfG
Jason

Matrix316
2015-02-16, 13:07:18
Aaaalso, habs noch mal nachgetestet und der Quellcode ist in Ordnung ABER:

https://msdn.microsoft.com/de-de/library/system.data.sqlclient.sqldataadapter.update%28v=vs.110%29.aspx


Update(DataRow[])
Aktualisiert die Werte in der Datenbank, indem für jede eingefügte, aktualisierte oder gelöschte Zeile im angegebenen Array in DataSet die INSERT-Anweisung, die UPDATE-Anweisung bzw. die DELETE-Anweisung ausgeführt werden. (Von DbDataAdapter geerbt.)

Das heißt, du musst schon was an deinem DataSet ändern, damit sich das Update auswirkt.

Zum Beispiel sowas:


DataRow drrow = dsCentron.Tables[0].NewRow();
drrow["Kundenname"] = "Testuser";

dsCentron.Tables[0].Rows.Add(drrow);

SqlCommandBuilder cmdbl = new SqlCommandBuilder(sdaUpdateDB);
sdaUpdateDB.Update(dsCentron, "centrontbl");


Würde dir eine neue Zeile hinzufügen in der Zieldatenbank.

Das Update nutzt man auch in der Regel damit um die gleiche Tabelle zu ändern und nicht um Daten in eine neue Tabelle zu kopieren, was geht, wenn du z.B. in einer Forschleife jeweils für alle vorhandenen Zeilen einen neuen DataSet füllst, den du dann der neuen Tabelle unterschiebst.

Zwei Zeilen werden hinzugefügt:


DataRow drrow = dsCentron.Tables[0].NewRow();
drrow["Kundenname"] = "Testuser";

dsCentron.Tables[0].Rows.Add(drrow);

DataRow drRow1 = dsCentron.Tables[0].NewRow();
drRow1["Kundenname"] = "Testuser2";

dsCentron.Tables[0].Rows.Add(drRow1);

try
{
SqlCommandBuilder cmdbl = new SqlCommandBuilder(sdaUpdateDB);

sdaUpdateDB.Update(dsCentron, "centrontbl");
}
catch (Exception ex)
{

}
finally
{
centron.Close();
updateDB.Close();
}

JasonX
2015-02-16, 18:07:17
Also doch falsch verstanden, was das Update macht :D
Ich dacht mir noch "Hey Cool, wird mir das ganze Insert, Update, Delete abgenommen." ^^
Tja, also doch nur für die jeweiligen Daten gedacht.

Nja, man lernt nie aus.
Danke für die Hilfe :)

MfG
Jason

Matrix316
2015-02-17, 09:13:37
Naja, im Prinzip schon, wenn die Daten im Dataset sich geändert haben. ;)

Um z.B. Daten hinzuzufügen kann man einfach ein leeres Datarow hinzufügen und dort Daten eintragen.
Um Daten upzudaten holt man sich den Datensatz, ändert den, und spielt den zurück.

Um Daten auf einen Rutsch von einer DB in die nächste zu kriegen ist es aber einfacher eininsert into tblX selext * from tblY zu machen, oder so. ;)