Timeout Problem

30/05/2008 - 09:25 von Reiner Hochmuth | Report spam
Guten Morgen,

ich war mir jetzt nicht sicher ob ich in C# NG oder in die SQL NG, ich denke
es hat aber mehr etwas mit dem Locking im C# zu tun.

Ich habe das Problem, das ich eine Abfrage mache mit einer unterabfrage auf
einem SQL Server 2005 .
Danach gehe ich die Datensàtze mit einer while Schleife durch und will einen
bzw. mehre Datensàtze der Tabelle per update veràndern die die Unterabfrage
betreffen.
Jetzt bringt er mir einen Timeout, ich denke weil er die Datensàtze der
Unterabfrage gelockt hat. Ich nehme zwar für die Update Anweisung eine neue
Connection aber das bringt nichts.

Ich steh momentan am Schlauch, da ich eigentlich meine das es so schon
funktionieren müsste (bzw. ich das immer so in der Art mache), aber
anscheinend tàusche ich mich.

Würde mich freuen wenn Ihre Ideen hàttet mir zu helfen.

Vielen Dank.

Gruss
Reiner

Anbei noch der Code:

####### Hier die Abfrage mit der Unterabfrage Das darunter holt sich Daten
aus einer anderen DB (es geht darum Daten abzugleichen), unter bei cmd4
Kommt dann die Update anweisung
SqlCommand cmd = new SqlCommand("select ghfzaufb_id, ghfzaufb_ghfz_id,
ghfzaufb_anlieferdate, ghfzaufb_lfdnr from ghfzaufb where ghfzaufb_id not in
(select ghfzaufb_ghfzaufbschaden_ghfzaufb_id from ghfzaufb_ghfzaufbschaden
group by ghfzaufb_ghfzaufbschaden_ghfzaufb_id) order by ghfzaufb_id desc",
conn.connziel);

cmd.CommandType = CommandType.Text;

SqlDataReader reader = cmd.ExecuteReader();

if (reader.HasRows)

{

SqlCommand cmd2;

SqlCommand cmd3;

SqlCommand cmd4;

SqlDataReader reader2;

while (reader.Read())

{

string strSQL
" from ghfzaufb where ghfzaufb_ghfz_id=@ghfz_id and
ghfzaufb_anlieferdate=@anlieferdate and ghfzaufb_lfdnr=@lfdnr";

cmd3 = new SqlCommand("select isnull(count(*),0)" + strSQL,
conn.connquelle);

cmd3.CommandType = CommandType.Text;

cmd3.Parameters.AddWithValue("@ghfz_id",
reader["ghfzaufb_ghfz_id"].ToString());

cmd3.Parameters.AddWithValue("@anlieferdate",
reader["ghfzaufb_anlieferdate"].ToString());

cmd3.Parameters.AddWithValue("@lfdnr", reader["ghfzaufb_lfdnr"].ToString());

if (int.Parse(cmd3.ExecuteScalar().ToString()) > 0)

{

cmd2 = new SqlCommand("select ghfzaufb_id" + strSQL, conn.connquelle);

cmd2.CommandType = CommandType.Text;

cmd2.Parameters.AddWithValue("@ghfz_id",
reader["ghfzaufb_ghfz_id"].ToString());

cmd2.Parameters.AddWithValue("@anlieferdate",
reader["ghfzaufb_anlieferdate"].ToString());

cmd2.Parameters.AddWithValue("@lfdnr", reader["ghfzaufb_lfdnr"].ToString());

reader2 = cmd2.ExecuteReader();

if (reader2.HasRows)

{

reader2.Read();

conn2.connziel.Open();



cmd4
new SqlCommand(

"update ghfzaufb_ghfzaufbschaden set ghfzaufb_ghfzaufbschaden_ghfzaufb_id="
+ reader["ghfzaufb_id"].ToString() + " where
ghfzaufb_ghfzaufbschaden_ghfzaufb_id=" + reader2["ghfzaufb_id"].ToString(),

conn2.connziel);

cmd4.CommandType = CommandType.Text;

cmd4.ExecuteNonQuery();

conn2.connziel.Close();

Console.WriteLine(reader2["ghfzaufb_id"].ToString() + "wurde in " +
reader["ghfzaufb_id"].ToString() + " abgeàndert.");

}

reader2.Close();

}

else

{

Console.WriteLine(reader["ghfzaufb_id"].ToString() + " kann nicht eindeutig
identifiziert werden");

}

}

}

reader.Close();
 

Lesen sie die antworten

#1 BiswangerG
30/05/2008 - 12:03 | Warnen spam
Hi,

könnt ihr kein LINQ bei euren Projekten verwenden ;)

Allssoo... zu deinem Problem... ich würde die Verbindung mittels Using()
aufbauen... damit brauchst du auch kein Close der Verbindung wieder...

Du solltest alles so auslagern das er immer wieder eine Connection aufbaut..
für jede anfrage... auch wenn es sich blöd anhört... SQL Server mag lieber
X an anfragen als X an offenen anfragen

außerdem solltest du alles auslagern... mach für jede abfrage eine eigene
Methode.. kann ich dir nur empfehlen...

das wàren meine tipps...

Viele Grüße

Gregor

"Reiner Hochmuth" wrote:

Guten Morgen,

ich war mir jetzt nicht sicher ob ich in C# NG oder in die SQL NG, ich denke
es hat aber mehr etwas mit dem Locking im C# zu tun.

Ich habe das Problem, das ich eine Abfrage mache mit einer unterabfrage auf
einem SQL Server 2005 .
Danach gehe ich die Datensàtze mit einer while Schleife durch und will einen
bzw. mehre Datensàtze der Tabelle per update veràndern die die Unterabfrage
betreffen.
Jetzt bringt er mir einen Timeout, ich denke weil er die Datensàtze der
Unterabfrage gelockt hat. Ich nehme zwar für die Update Anweisung eine neue
Connection aber das bringt nichts.

Ich steh momentan am Schlauch, da ich eigentlich meine das es so schon
funktionieren müsste (bzw. ich das immer so in der Art mache), aber
anscheinend tàusche ich mich.

Würde mich freuen wenn Ihre Ideen hàttet mir zu helfen.

Vielen Dank.

Gruss
Reiner

Anbei noch der Code:

####### Hier die Abfrage mit der Unterabfrage Das darunter holt sich Daten
aus einer anderen DB (es geht darum Daten abzugleichen), unter bei cmd4
Kommt dann die Update anweisung
SqlCommand cmd = new SqlCommand("select ghfzaufb_id, ghfzaufb_ghfz_id,
ghfzaufb_anlieferdate, ghfzaufb_lfdnr from ghfzaufb where ghfzaufb_id not in
(select ghfzaufb_ghfzaufbschaden_ghfzaufb_id from ghfzaufb_ghfzaufbschaden
group by ghfzaufb_ghfzaufbschaden_ghfzaufb_id) order by ghfzaufb_id desc",
conn.connziel);

cmd.CommandType = CommandType.Text;

SqlDataReader reader = cmd.ExecuteReader();

if (reader.HasRows)

{

SqlCommand cmd2;

SqlCommand cmd3;

SqlCommand cmd4;

SqlDataReader reader2;

while (reader.Read())

{

string strSQL >
" from ghfzaufb where ghfzaufb_ghfz_id=@ghfz_id and
ghfzaufb_anlieferdate=@anlieferdate and ghfzaufb_lfdnr=@lfdnr";

cmd3 = new SqlCommand("select isnull(count(*),0)" + strSQL,
conn.connquelle);

cmd3.CommandType = CommandType.Text;

cmd3.Parameters.AddWithValue("@ghfz_id",
reader["ghfzaufb_ghfz_id"].ToString());

cmd3.Parameters.AddWithValue("@anlieferdate",
reader["ghfzaufb_anlieferdate"].ToString());

cmd3.Parameters.AddWithValue("@lfdnr", reader["ghfzaufb_lfdnr"].ToString());

if (int.Parse(cmd3.ExecuteScalar().ToString()) > 0)

{

cmd2 = new SqlCommand("select ghfzaufb_id" + strSQL, conn.connquelle);

cmd2.CommandType = CommandType.Text;

cmd2.Parameters.AddWithValue("@ghfz_id",
reader["ghfzaufb_ghfz_id"].ToString());

cmd2.Parameters.AddWithValue("@anlieferdate",
reader["ghfzaufb_anlieferdate"].ToString());

cmd2.Parameters.AddWithValue("@lfdnr", reader["ghfzaufb_lfdnr"].ToString());

reader2 = cmd2.ExecuteReader();

if (reader2.HasRows)

{

reader2.Read();

conn2.connziel.Open();



cmd4 >
new SqlCommand(

"update ghfzaufb_ghfzaufbschaden set ghfzaufb_ghfzaufbschaden_ghfzaufb_id="
+ reader["ghfzaufb_id"].ToString() + " where
ghfzaufb_ghfzaufbschaden_ghfzaufb_id=" + reader2["ghfzaufb_id"].ToString(),

conn2.connziel);

cmd4.CommandType = CommandType.Text;

cmd4.ExecuteNonQuery();

conn2.connziel.Close();

Console.WriteLine(reader2["ghfzaufb_id"].ToString() + "wurde in " +
reader["ghfzaufb_id"].ToString() + " abgeàndert.");

}

reader2.Close();

}

else

{

Console.WriteLine(reader["ghfzaufb_id"].ToString() + " kann nicht eindeutig
identifiziert werden");

}

}

}

reader.Close();




Ähnliche fragen