Laden...

Irrwitziges Problem mit SqlCommand

Erstellt von Ishildur vor 17 Jahren Letzter Beitrag vor 17 Jahren 2.062 Views
I
Ishildur Themenstarter:in
431 Beiträge seit 2005
vor 17 Jahren
Irrwitziges Problem mit SqlCommand

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!!!

354 Beiträge seit 2004
vor 17 Jahren

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

I
Ishildur Themenstarter:in
431 Beiträge seit 2005
vor 17 Jahren

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();
  }
 }
}

L
39 Beiträge seit 2005
vor 17 Jahren

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

I
Ishildur Themenstarter:in
431 Beiträge seit 2005
vor 17 Jahren

Ach so ist das, aber wieso heisst die Meldung dann, dass ein Reader mit demselben SqlCommand verknüpft sei, ist das ein Fehler?

354 Beiträge seit 2004
vor 17 Jahren

Eher eine ungünstige Formulierung.

.NET GUI - Die Community für grafische Oberflächen unter .NET
Jetzt kostenlos besorgen: .NET BlogBook
Norbert Eder
DasBackup