Hallo Leute, zieht euch mal folgendes rein:
// delete all exising records
new SqlCommand("DELETE FROM Person",sqlConDst).ExecuteNonQuery();
Die Postwendende Antwort des .NET Framwork:
There is already an open DataReader associated with this Command which must be closed first.
Häääää????
Ich hatte bisher gedacht, ich hätte das Prinzip der strukturierten Programmierung wenigstens Ansatzweise verstanden, aber inzwischen frage ich mich, ob das auch für die Entwickler von MS gilt?
Wie kann es sein, dass bereits ein Datenlesen mit diesem Kommando verknüpft ist, wenn ich die Instanzierung jenes Kommandos im selben C# - Befehl ist?
Also es ist zwar zu diesem Zeitpunkt ein DatenLeser geöffnet, aber der ist nichtmal mit derselben SqlConnection verknüpft!
Also das Ganze ist ein Konvertierungsprogramm, da ich in einer Bestehenden Datenbank alle Primärschlüssel vom Typ Int Autoincrement in Guids umwandeln muss! Also habe ich zwei Verbindungen zum selben Server aber auf unterschiedliche Datenbanken. Nun habe ich in der Source - Datenbank einen DataReader offen, aber dieses Kommanda bezieht sich auf die Verbindung zur Destination - Datenbank.
Bitte, bitte sagt mir nicht, dass ich nicht einen Reader offen haben darf und zur gleichen Zeit bestimmte Operationen an einer Anderen Datenbank vornehmen kann! Bitte, bitte sagt das jetzt nicht!!!
Hmm .. zeig mal auszugsweise deinen Sourcecode her. Prinzipiell sollte es möglich sein, zwei DataReader offen zu haben, sofern diese unterschiedlichen Verbindungen zugewiesen sind.
.NET GUI - Die Community für grafische Oberflächen unter .NET
Jetzt kostenlos besorgen: .NET BlogBook
Norbert Eder
DasBackup
using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Data.SqlClient;
namespace TophairConverter {
class Program {
static void Main(string[] args) {
// create and setup the source connection - string
SqlConnectionStringBuilder sqlStrSrc = new SqlConnectionStringBuilder();
sqlStrSrc.DataSource = "Hauptserver.Quasar";
sqlStrSrc.ConnectTimeout = 30;
sqlStrSrc.InitialCatalog = "TopHair";
sqlStrSrc.UserID = "<nönö>";
sqlStrSrc.Password = "<nönö>";
// create and setup the destination connection - string
SqlConnectionStringBuilder sqlStrDst = new SqlConnectionStringBuilder(sqlStrSrc.ToString());
sqlStrDst.InitialCatalog = "TopHair2";
// create both connections
SqlConnection sqlConSrc = new SqlConnection(sqlStrSrc.ToString());
SqlConnection sqlConDst = new SqlConnection(sqlStrDst.ToString());
// open a try - statement as there may be thrown an exception
try {
// open both connections
sqlConSrc.Open();
sqlConDst.Open();
// inform the user
Console.WriteLine("Connection established...");
}
// an exception has been thrown
catch(SqlException e) {
// inform the user and exit the application
Console.WriteLine(e.Message);
Console.Read();
return;
}
// delete all exising records
new SqlCommand("DELETE FROM Person",sqlConDst).ExecuteNonQuery();
// get a list of country - GUID's
List<Guid> lstGuid = new List<Guid>();
SqlCommand sqlCmdCty = new SqlCommand("SELECT Country_ID,Name FROM Country",sqlConDst);
SqlDataReader sqlRdrCty = sqlCmdCty.ExecuteReader();
while(sqlRdrCty.Read()) {
lstGuid.Add(sqlRdrCty.GetGuid(0));
Console.WriteLine(sqlRdrCty.GetString(1)+":\t"+sqlRdrCty.GetGuid(0).ToString());
}
// define the insert command
String strIns = "INSERT INTO Person(Person_ID,Country_ID,Nationality_ID,Title,";
strIns += "PersonalName,FamilyName,Birthdate,Civilstate,Profession,AHV,Adress,Zip,Place,";
strIns += "Postcase,Description,Picture,News,Inserted,Locked) VALUES(@Person_ID,";
strIns += "@Country_ID,@Nationality_ID,@Title,@PersonalName,@FamilyName,@Birthdate,";
strIns += "@Civilstate,@Profession,@AHV,@Adress,@Zip,@Place,@Postcase,@Description,";
SqlCommand sqlCmdIns = new SqlCommand(strIns,sqlConDst);
// define the parameter list
sqlCmdIns.Parameters.Add("Person_ID",SqlDbType.UniqueIdentifier);
sqlCmdIns.Parameters.Add("Country_ID",SqlDbType.UniqueIdentifier);
sqlCmdIns.Parameters.Add("Nationality_ID",SqlDbType.UniqueIdentifier);
sqlCmdIns.Parameters.Add("Title",SqlDbType.TinyInt);
sqlCmdIns.Parameters.Add("PersonalName",SqlDbType.VarChar,20);
sqlCmdIns.Parameters.Add("FamilyName",SqlDbType.VarChar,20);
sqlCmdIns.Parameters.Add("Birthdate",SqlDbType.DateTime);
sqlCmdIns.Parameters.Add("Civilstate",SqlDbType.TinyInt);
sqlCmdIns.Parameters.Add("Profession",SqlDbType.VarChar,50);
sqlCmdIns.Parameters.Add("AHV",SqlDbType.VarChar,20);
sqlCmdIns.Parameters.Add("Adress",SqlDbType.VarChar,50);
sqlCmdIns.Parameters.Add("Zip",SqlDbType.VarChar,10);
sqlCmdIns.Parameters.Add("Place",SqlDbType.VarChar,10);
sqlCmdIns.Parameters.Add("Postcase",SqlDbType.VarChar,50);
sqlCmdIns.Parameters.Add("Description",SqlDbType.Text);
sqlCmdIns.Parameters.Add("Picture",SqlDbType.Image);
sqlCmdIns.Parameters.Add("News",SqlDbType.Bit);
sqlCmdIns.Parameters.Add("Inserted",SqlDbType.DateTime);
sqlCmdIns.Parameters.Add("Locked",SqlDbType.Bit);
// define the select command
String strSel = "SELECT Country_ID,Nationality_ID,Title,PersonalName,";
strSel += "FamilyName,Birthdate,Civilstate,Profession,AHV,Adress,Zip,Place,Postcase,";
strSel += "Description,Picture,News,Inserted FROM Person";
SqlCommand sqlCmdSel = new SqlCommand(strSel,sqlConSrc);
// get the datareader
SqlDataReader sqlRdr = sqlCmdSel.ExecuteReader();
// start a loop for walking each record
while(sqlRdr.Read()){
// output the current record
Console.WriteLine("Converting "+sqlRdr.GetString(3)+" "+sqlRdr.GetString(4)+"...");
// setup the parameters and execute the non-query
sqlCmdIns.Parameters["Person_ID"].Value = Guid.NewGuid();
sqlCmdIns.Parameters["Country_ID"].Value = lstGuid[(int)sqlRdr.GetSqlInt16(0)-1].ToString();
sqlCmdIns.Parameters["Nationality_ID"].Value = lstGuid[(int)sqlRdr.GetSqlInt16(1)-1].ToString();
sqlCmdIns.Parameters["Title"].Value = sqlRdr.GetSqlByte(2);
sqlCmdIns.Parameters["PersonalName"].Value = sqlRdr.GetSqlString(3);
sqlCmdIns.Parameters["FamilyName"].Value = sqlRdr.GetSqlString(4);
sqlCmdIns.Parameters["Birthdate"].Value = sqlRdr.GetSqlDateTime(5);
sqlCmdIns.Parameters["Civilstate"].Value = sqlRdr.GetSqlByte(6); ;
sqlCmdIns.Parameters["Profession"].Value = sqlRdr.GetSqlString(7);
sqlCmdIns.Parameters["AHV"].Value = sqlRdr.GetSqlString(8);
sqlCmdIns.Parameters["Adress"].Value = sqlRdr.GetSqlString(9);
sqlCmdIns.Parameters["Zip"].Value = sqlRdr.GetSqlString(10);
sqlCmdIns.Parameters["Place"].Value = sqlRdr.GetSqlString(11);
sqlCmdIns.Parameters["Postcase"].Value = sqlRdr.GetSqlString(12);
sqlCmdIns.Parameters["Description"].Value = sqlRdr.GetSqlString(13);
sqlCmdIns.Parameters["Picture"].Value = sqlRdr.GetSqlBinary(14);
sqlCmdIns.Parameters["News"].Value = sqlRdr.GetSqlBoolean(15);
sqlCmdIns.Parameters["Inserted"].Value = sqlRdr.GetSqlDateTime(16);
sqlCmdIns.Parameters["Locked"].Value = 0;
// ***************** Hier wird die Exception ausgelöst ******************
sqlCmdIns.ExecuteNonQuery();
// ***************************************************************
}
// avoid automatic closing of the console window
Console.Read();
}
}
}
ich weiß nicht, obs richtig ist, aber:
du benutzt bei
SqlCommand sqlCmdCty = new SqlCommand("SELECT Country_ID,Name FROM
Country",sqlConDst);
SqlDataReader sqlRdrCty = sqlCmdCty.ExecuteReader();
SqlCommand sqlCmdIns = new SqlCommand(strIns,sqlConDst);
dieselbe Connection ohne nach der While Schleife den Reader zu schließen.
Grüsse vom Luetten
Ach so ist das, aber wieso heisst die Meldung dann, dass ein Reader mit demselben SqlCommand verknüpft sei, ist das ein Fehler?
Eher eine ungünstige Formulierung.
.NET GUI - Die Community für grafische Oberflächen unter .NET
Jetzt kostenlos besorgen: .NET BlogBook
Norbert Eder
DasBackup