• 27.04.2024, 12:27
  • Registrieren
  • Anmelden
  • Sie sind nicht angemeldet.

 

Lieber Besucher, herzlich willkommen bei: Aqua Computer Forum. Falls dies Ihr erster Besuch auf dieser Seite ist, lesen Sie sich bitte die Hilfe durch. Dort wird Ihnen die Bedienung dieser Seite näher erläutert. Darüber hinaus sollten Sie sich registrieren, um alle Funktionen dieser Seite nutzen zu können. Benutzen Sie das Registrierungsformular, um sich zu registrieren oder informieren Sie sich ausführlich über den Registrierungsvorgang. Falls Sie sich bereits zu einem früheren Zeitpunkt registriert haben, können Sie sich hier anmelden.

C# MS-SQL Daten rein<->raus

Montag, 8. Oktober 2007, 19:37

Hi ihr,
ich bin gerade dabei ein Programm zum XML Files importieren zu schreiben.

soweit klappt das xml file auslesen auch.
Meine Datenbank dazu hat 3 tabellen (artciles,articledetails und articlesizes), welche alle untereinander verknüpft sind.

jetzt versuche ich diese nach und nach zu füllen
bei articles geht alles ohne probleme.
bei articledetails versuche ich die max id von articles auszulesen und kriege eine Exception geworfen das keine Daten in der Tabelle sind....

wenn das Programm beendet ist und ich mir die articles tabelle im enterprise manager angucke sind aber daten drin.

weiß zufällig jemand im der M$ Treiber die Queries irgendwie puffert?!

google hat leider nichts ergeben :-/ (oder ich hab falsch gesucht)

Re: C# MS-SQL Daten rein<->raus

Montag, 8. Oktober 2007, 19:45

Vergisst du vielleicht zu flushen/comitten?

Re: C# MS-SQL Daten rein<->raus

Montag, 8. Oktober 2007, 19:47

hab schon alle funktionen des SqlCommand objekts und des SqlConnection objekte durchsucht.
gibt leider keine Funktion die das bewirken könnte, außer ich bin total verpeilt

Re: C# MS-SQL Daten rein<->raus

Montag, 8. Oktober 2007, 19:51

Ich glaube wir brauchen hier ein bisschen mehr Informationen, wie dein Code funktioniert. Zeig uns dochmal ein bisschen was aus deinem Datenbank I/O code.
Jabber-ID: |Azrael|@jabber.ccc.org

Re: C# MS-SQL Daten rein<->raus

Montag, 8. Oktober 2007, 19:52

long articlecount = 1;
foreach (Article article in katalog.arlItemsP)
{
//durchlaufe alle items und schreibe sie in die Datenbank
strInsertArticles = strInsertArticles + "INSERT INTO ARTICLES (artProducerIln, artOrdernumber, artModelname, artSystemId, artSystemType, artPrivatbrand) VALUES \n";
strInsertArticles = strInsertArticles + "('" + article.strProducerIlnP + "','" + article.strOrderNumberP + "','" + article.strModelnameP + "'," + article.strSystemIDP + ",'" + article.strSystemTypeP + "','" + article.strPrivatBrandP + "')\n";
articlecount++;
}

SqlCommand sqlArticleInsert = new SqlCommand(strInsertArticles, sqlConnection);
sqlArticleInsert.ExecuteNonQuery();

//artikel eingefügt, weiter mit details
long articledetailscount = 1;
long artID = Convert.ToInt64(new SqlCommand("select max(artID) from ARTICLES", sqlConnection).ExecuteScalar())-articlecount;
foreach (Article article in katalog.arlItemsP)
{
foreach (ArticleDetail artDetails in article.arlArticleDetailsP)
{
strInsertArticleDetails += "INSERT INTO ARTICLEDETAILS (artID, ardImplementation, ardActuality, ardAttributeMat, ardAttributeForm, ardAttributeWidth, ardAttributeCol, ardAttributeHeel, ardAttributeLining, ardAttributeShank, ardAttributeSole, ardAttributeExp, ardAttributeSize, ardAttributeBreadth, ardAttributeHeight, ardAttributeLength, ardAttributeVolume, ardAttributeWeight, ardAttributeArea, ardAttributeMiscellaneous, ardAttributeUppersmat, ardAttributeConstmethod, ardProducerName, ardProducerOrdernumber, ardDescriptiontext1, ardDescriptiontext2) VALUES \n";
strInsertArticleDetails += "(" + artID + ",'" + artDetails.strImplementationP + "','" + artDetails.dtmActualityP + "','" + artDetails.strMaterialP + "','" + artDetails.strFormP + "','" + artDetails.strWidthP + "','" + artDetails.strColP + "','" + artDetails.strHeelP + "','" + artDetails.strLiningP + "','" + artDetails.strShankP + "','" + artDetails.strSoleP + "','" + artDetails.strExpP + "','" + artDetails.strSizeP + "','" + artDetails.strBreadthP + "','" + artDetails.strHeightP + "','" + artDetails.strLengthP + "','" + artDetails.strVolumeP + "','" + artDetails.strWeightP + "','" + artDetails.strAreaP + "','" + artDetails.strMiscellaneousP + "','" + artDetails.strUppersMatP + "','" + artDetails.strConstmethodP + "','" + artDetails.strProducerNameP + "','" + artDetails.strProducerOrderNumberP + "','" + artDetails.strDescriptionText1P + "','" + artDetails.strDescriptionText2P + "')";
articledetailscount++;
}
artID++;
}
sqlArticleInsert = new SqlCommand(strInsertArticleDetails, sqlConnection);
sqlArticleInsert.ExecuteNonQuery();


//artikeldetails eingefügt, weiter mit größen
long ardID = Convert.ToInt64(new SqlCommand("select max(ardID) from ARTICLEDETAILS", sqlConnection).ExecuteScalar()) - articledetailscount;
foreach (Article article in katalog.arlItemsP)
{
foreach (ArticleDetail artDetails in article.arlArticleDetailsP)
{
foreach (Size size in artDetails.arlSizesP)
{
strInsertArticleDetailSizes += "INSERT INTO ARTICLESIZES (ardID, arsPrint, arsEan, arsPP, arsSP) VALUES \n";
strInsertArticleDetailSizes += "(" + ardID + ",'" + size.strSizeP + "','" + size.strEanP + "','" + size.strPPP + "','" + size.strSPP + "')\n";
}
ardID++;
}
}
sqlArticleInsert = new SqlCommand(strInsertArticleDetailSizes, sqlConnection);
sqlArticleInsert.ExecuteNonQuery();

Das mein Code

Re: C# MS-SQL Daten rein<->raus

Montag, 8. Oktober 2007, 19:57

Ok. Auch wenn mir der Algortihmus hinter dem Code nicht ganz einleuchtet, aber ok.
Was ist artID denn für ein Feld, wie wird es gesetzt? Autoincrement?
Jabber-ID: |Azrael|@jabber.ccc.org

Re: C# MS-SQL Daten rein<->raus

Montag, 8. Oktober 2007, 20:01

genau

die 3 tabellen haben jeder nen schlüssel (artID,ardID und arsID) bigint auto increment

artID = schlüssel von articles
ardID = schlüssel von articleDetails
arsID = schlüssel von articleSizes

und die muss ich NACH dem einfügen der (ersten) Daten auslesen
geht aber nicht weil er meint die sind leer...
sind sie aber nicht mehr wenn das Programm sich beendet hat, daher denke ich das der treiber die insert statements puffert

Re: C# MS-SQL Daten rein<->raus

Montag, 8. Oktober 2007, 20:12

hat sich erledigt...

ich mach das komplett anders, hab nicht mehr dran gedacht das ich threaded programmieren will und damit das komplette Konzept im Sack ist.

muss ich irgendwie anders proggen

Re: C# MS-SQL Daten rein<->raus

Montag, 8. Oktober 2007, 20:14

Hinzuzufügen wäre noch, das die anwendung von INSERT .... und danach SELECT MAX() unnötig ist.

INSERT kann seine identity zurückgeben, darüber solltest du dich mal ein bisschen informieren.

PS: Wie habe ich deine verwendung von MAX(artID) - articlecount eigentlich zu verstehen?
Du solltest keine Annahmen basierend auf den AutoInkrement werten treffen, aus sicht der Anwendungsebene ist der AutoInkrementwert absolut nutzlos, darüber solltest du auch mal nachdenken.
Jabber-ID: |Azrael|@jabber.ccc.org

Re: C# MS-SQL Daten rein<->raus

Dienstag, 9. Oktober 2007, 11:07

das mir gestern nach 9 stunden proggen und danach nachdenken auch klar geworden

mit identity guck ich mir mal an (eigentlich genau das was ich brauche) :)

*heute erstmal wieder alles umstrick*

Re: C# MS-SQL Daten rein<->raus

Dienstag, 9. Oktober 2007, 18:01

ok, identity ist auch scheisse

was ich brauchen könnte wären Transactions (namespace: System.Transactions)

nur sagt mir Visual c# Express Edition jetzt das der Namespace garnicht existiert. Hab schon das .net 2.0 sdk framework runtergeladen, die Express Edition neu installiert, aber trotzdem kennt der den sch**** Namespace nicht.

hab auch schon alle Programm Einstellungen und Project Einstellungen durchsucht, aber nirgends was zu finden...

hat einer von euch ne idee?

Re: C# MS-SQL Daten rein<->raus

Dienstag, 9. Oktober 2007, 18:47

Zitat von »Anisachse«

ok, identity ist auch scheisse

was ich brauchen könnte wären Transactions (namespace: System.Transactions)

nur sagt mir Visual c# Express Edition jetzt das der Namespace garnicht existiert. Hab schon das .net 2.0 sdk framework runtergeladen, die Express Edition neu installiert, aber trotzdem kennt der den sch**** Namespace nicht.

hab auch schon alle Programm Einstellungen und Project Einstellungen durchsucht, aber nirgends was zu finden...

hat einer von euch ne idee?

in deinem Projekt unter Referenzen, neue Referenz hinzufügen, und dann in der Liste der DLLs die richtige wählen.

Sebastian

Re: C# MS-SQL Daten rein<->raus

Mittwoch, 10. Oktober 2007, 11:18

danke, hats funktioniert :)

grover

Senior Member

Re: C# MS-SQL Daten rein<->raus

Mittwoch, 10. Oktober 2007, 11:32

Nur mal am Rande: Der Code schreit gerade zu nach SQL Injection.

Re: C# MS-SQL Daten rein<->raus

Mittwoch, 10. Oktober 2007, 13:43

Prepared Statements (die auch SQL Injection verhindern) wären auch vielleicht angebracht.

Re: C# MS-SQL Daten rein<->raus

Mittwoch, 10. Oktober 2007, 14:29

der ganze Code daoben existiert nicht mehr...

wenn ich den neuen fertig gestellt habe poste ich den ma.
hab gerade nen anderes problem:

sqlCommand.CommandText = "SELECT SCOPE_IDENTITY() from ARTICLES";
long artID = (Int64)sqlCommand.ExecuteScalar();
liefert mir ne InvalidCastException zurück.

"SELECT artID from ARTICLES where artID = SCOPE_IDENTITY()" liefert genau das selbe :-/

danke grover, werd ich mit berücksichtigen :)



hier wie versprochen der neue Code:

SqlTransaction transaction = sqlConnection.BeginTransaction(IsolationLevel.ReadCommitted, "INSERT");
SqlCommand sqlCommand = sqlConnection.CreateCommand();

sqlCommand.Connection = sqlConnection;
sqlCommand.Transaction = transaction;
try
{
foreach (Article article in insertArticles)
{
strInsertArticles = "INSERT INTO ARTICLES (artProducerIln, artOrdernumber, artModelname, artSystemId, artSystemType, artPrivatbrand) VALUES \n";
strInsertArticles += "(@artProducerIln, @artOrdernumber, @artModelname, @artSystemId, @artSystemType, @artPrivatbrand)\n";
sqlCommand.CommandText = strInsertArticles;
sqlCommand.Parameters.AddWithValue("artProducerIln", article.strProducerIlnP);
sqlCommand.Parameters.AddWithValue("artOrdernumber", article.strOrderNumberP);
sqlCommand.Parameters.AddWithValue("artModelname", article.strModelnameP);
sqlCommand.Parameters.AddWithValue("artSystemId", article.strSystemIDP);
Console.WriteLine("Type: " + article.strSystemTypeP);
sqlCommand.Parameters.AddWithValue("artSystemType", article.strSystemTypeP);
sqlCommand.Parameters.AddWithValue("artPrivatbrand", article.strPrivatBrandP);
sqlCommand.ExecuteNonQuery();
SqlCommand cmd = new SqlCommand("SELECT SCOPE_IDENTITY() from ARTICLES",sqlConnection);
cmd.Transaction = transaction;
long artID = (Int64)cmd.ExecuteScalar();
foreach (ArticleDetail artDetails in article.arlArticleDetailsP)
{


strInsertArticleDetails = "INSERT INTO ARTICLEDETAILS (artID, ardImplementation, ardActuality, ardAttributeMat, ardAttributeForm, ardAttributeWidth, ardAttributeCol, ardAttributeHeel, ardAttributeLining, ardAttributeShank, ardAttributeSole, ardAttributeExp, ardAttributeSize, ardAttributeBreadth, ardAttributeHeight, ardAttributeLength, ardAttributeVolume, ardAttributeWeight, ardAttributeArea, ardAttributeMiscellaneous, ardAttributeUppersmat, ardAttributeConstmethod, ardProducerName, ardProducerOrdernumber, ardDescriptiontext1, ardDescriptiontext2) VALUES \n";
strInsertArticleDetails += "(@artID,@ardImplementation,@ardActuality,@ardMat,@ardForm,@ardWidth,@ardCol,@ardHeel,@ardLining,@ardShank,@ardSole,@ardExp,@ardSize,@ardBreadth,@ardHeight,@ardLength,@ardVolume,@ardWeight,@ardArea,@ardMiscellaneous,@ardUppersMat,@ardConstmethod,@ardProcucername,@ardProducerOrderNumber,@ardDescriptionText1,@ardDescriptionText2)";
SqlCommand detailsCommand = new SqlCommand(strInsertArticleDetails, sqlConnection);
detailsCommand.Transaction = transaction;
detailsCommand.Parameters.AddWithValue("artID",artID);
detailsCommand.Parameters.AddWithValue("ardImplementation", artDetails.strImplementationP);
detailsCommand.Parameters.AddWithValue("ardActuality", artDetails.dtmActualityP);
detailsCommand.Parameters.AddWithValue("ardMat", artDetails.strMaterialP);
detailsCommand.Parameters.AddWithValue("ardForm", artDetails.strFormP);
detailsCommand.Parameters.AddWithValue("ardWidth", artDetails.strWidthP);
detailsCommand.Parameters.AddWithValue("ardCol", artDetails.strColP);
detailsCommand.Parameters.AddWithValue("ardHeel", artDetails.strHeelP);
detailsCommand.Parameters.AddWithValue("ardLining", artDetails.strLiningP);
detailsCommand.Parameters.AddWithValue("ardShank", artDetails.strShankP);
detailsCommand.Parameters.AddWithValue("ardSole", artDetails.strSoleP);
detailsCommand.Parameters.AddWithValue("ardExp", artDetails.strExpP);
detailsCommand.Parameters.AddWithValue("ardSize", artDetails.strSizeP);
detailsCommand.Parameters.AddWithValue("ardBreadth", artDetails.strBreadthP);
detailsCommand.Parameters.AddWithValue("ardHeight", artDetails.strHeightP);
detailsCommand.Parameters.AddWithValue("ardLength", artDetails.strLengthP);
detailsCommand.Parameters.AddWithValue("ardVolume", artDetails.strVolumeP);
detailsCommand.Parameters.AddWithValue("ardWeight", artDetails.strWeightP);
detailsCommand.Parameters.AddWithValue("ardArea", artDetails.strAreaP);
detailsCommand.Parameters.AddWithValue("ardMiscellaneous", artDetails.strMiscellaneousP);
detailsCommand.Parameters.AddWithValue("ardUppersMat", artDetails.strUppersMatP);
detailsCommand.Parameters.AddWithValue("ardConstmethod", artDetails.strConstmethodP);
detailsCommand.Parameters.AddWithValue("ardProcucername", artDetails.strProducerNameP);
detailsCommand.Parameters.AddWithValue("ardProducerOrderNumber", artDetails.strProducerOrderNumberP);
detailsCommand.Parameters.AddWithValue("ardDescriptionText1", artDetails.strDescriptionText1P);
detailsCommand.Parameters.AddWithValue("ardDescriptionText2", artDetails.strDescriptionText2P);
detailsCommand.ExecuteNonQuery();
sqlCommand.CommandText = "SELECT SCOPE_IDENTITY() from ARTICLEDETAILS";
long ardID = (Int64)sqlCommand.ExecuteScalar();
foreach (Size size in artDetails.arlSizesP)
{


strInsertArticleDetailSizes += "INSERT INTO ARTICLESIZES (ardID, arsPrint, arsEan, arsPP, arsSP) VALUES \n";
strInsertArticleDetailSizes += "(@ardID,@arsSize,@arsEan,@arsPP,@arsSP)\n";
SqlCommand sizeCommand = new SqlCommand(strInsertArticleDetails, sqlConnection);
sizeCommand.Transaction = transaction;
sizeCommand.Parameters.AddWithValue("ardID",ardID);
sizeCommand.Parameters.AddWithValue("arsSize",size.strSizeP);
sizeCommand.Parameters.AddWithValue("arsEan", size.strEanP);
sizeCommand.Parameters.AddWithValue("arsPP", size.strPPP);
sizeCommand.Parameters.AddWithValue("arsSP", size.strSPP);
sizeCommand.ExecuteNonQuery();
}
}
}
transaction.Commit();
}
catch (Exception e)
{
Console.WriteLine(e);
try
{
transaction.Rollback();
}
catch (SqlException ex)
{
if (transaction.Connection != null)
{
Console.WriteLine("An exception of type " + ex.GetType() +
" was encountered while attempting to roll back the transaction.\n"+e);
}
}
Console.WriteLine("An exception of type " + e.GetType() +
" was encountered while inserting the data.");
Console.WriteLine("Neither record was written to database.\n"+e);
}

hab mich für ne "normale SQL Transaction" entschieden da hier sowieso nur Microsoft Produkte eingesetzt werden...

Re: C# MS-SQL Daten rein<->raus

Mittwoch, 10. Oktober 2007, 15:27

Wenn wir alle mehr davon haben sollen, stopf den Code doch in Zukunft in ein gutes Pastebin, wie z.B. http://paste.pocoo.org/

Hab' ich für obigen mal gemacht: http://paste.pocoo.org/show/5744/

Die *extrem* langen Zeilen solltest du übrigens unbedingt mal manuell im Code umbrechen, das ist ja selbst mit einer IDE unlesbar!

Re: C# MS-SQL Daten rein<->raus

Mittwoch, 10. Oktober 2007, 15:56

http://paste.pocoo.org/show/5748/

das der "neue" Code

das erste mal die ID auslesen klappt jetzt wunderbar
das zweite mal für die Sizes auslesen nicht :/

ok....
cast geht jetzt auch, aber nur durch: long ardID = long.Parse( obj.ToString());

Re: C# MS-SQL Daten rein<->raus

Mittwoch, 10. Oktober 2007, 18:23

Am Rande: Ich sehe da sehr viele Aufrufe der selben Methode. Hast du mal dran gedacht, die entsprechenden Parameter in eine Sequenz oder ein Mapping zu stecken, dann darüber zu iterieren und im Rumpf dieser Iteration die Methode mit dem jeweils aktuellen Wert aufzurufen?

Re: C# MS-SQL Daten rein<->raus

Donnerstag, 11. Oktober 2007, 13:36

könnte ich tun, aber das kostet auch wieder zeit,
ob ich jetzt die ganzen funktions aufrufe mache, oder aber nen array o.ä. aufbaue und damit die funktion aufrufe.... das doch völlig egal

außer es kommt irgendwann ein .net framework wo es die funktion nicht mehr gibt.... aber bis dahin kann der code doch so bleiben