Warum bekomme ich diesen Fehler? So behandeln Sie Nullwerte. Meldung = Zusätzliche Parameter angeben

Also schreibe ich einen dataexport, zwischen SQL und Foxpro, ich benutze parametrisierte Strings, um durch die notwendigen data zu ziehen, ich benutze auch String-Verkettung, um die benötigten Informationen auf bestimmte datasätze zu erhalten, das schien gut zu funktionieren bis ich den Sortiercodesatz erreicht habe, wobei der angegebene Fehler vorherrschend wurde.

Als schnellen Überblick. Herstellen der Verbindung zu beiden databaseen.

static void Main(string[] args) { using (var exportConnection = new SqlConnection(connectionString: "Data Source=Localhost;" + "Trusted_Connection=yes;" + @"connection timeout=30;" + @"database=001-CARL_V4")) using (var importConnection = new OleDbConnection(connectionString: @"Provider=vfpoledb.1;" + @"data source=C:\Users\Joshua.cameron\Desktop\PCHomesImportTestBlank\PCHomesserver\DATABASE\pchomes.dbc") ) 

Ich setze den Befehl ein, um aus SQL auszuwählen:

  using (SqlCommand exportCommand = new SqlCommand(@"select [ID] ,[OwTitle] ,[OwForenames] ,[OwSurname] ,[OwNum] ,[OwAddress1] ,[OwAddress2] ,[OwAddress3] ,[OwAddress4] ,[OwPostcode] ,[OwPhHome] ,[OwPhWork] ,[OwPhFax] ,[OwPhMobile] ,[OwEMail] ,[OwBankName] ,[OwAccNo] ,[OwAccName] ,[OwSalutation] ,[OwNotes] ,[OwSort1] ,[OwSort2] ,[OwSort3] 

von dbo.CARL_Owners ", exportConnection))

Und der Befehl zum Einfügen in VFP:

 using (OleDbCommand importCommand = new OleDbCommand(@"INSERT INTO CLIENT (CLCODE ,clcodedesc ,Title ,Fname ,Sname ,Address1 ,Address3 ,Address5 ,Address4 ,Address6 ,Postcode ,Phoneh ,PhoneW ,Facsimileh ,Mobile ,Emailaddr ,Bankname ,Bankacno ,Bankacna ,Salute ,Notes ,BANKSORT ) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)", importConnection)) 

Hinzufügen der parametrisierten Werte zur obigen INSERT-statement:

 importCommand.Parameters.AddWithValue("clcode", ""); importCommand.Parameters.AddWithValue("clcodedesc", ""); importCommand.Parameters.AddWithValue("Title", ""); importCommand.Parameters.AddWithValue("Fname", ""); importCommand.Parameters.AddWithValue("Sname", ""); importCommand.Parameters.AddWithValue("Address1", ""); importCommand.Parameters.AddWithValue("Address3", ""); importCommand.Parameters.AddWithValue("Address5", ""); importCommand.Parameters.AddWithValue("Address4", ""); importCommand.Parameters.AddWithValue("Address6", ""); importCommand.Parameters.AddWithValue("Postcode", ""); importCommand.Parameters.AddWithValue("Phoneh", ""); importCommand.Parameters.AddWithValue("PhoneW", ""); importCommand.Parameters.AddWithValue("Facsimileh", ""); importCommand.Parameters.AddWithValue("Mobile", ""); importCommand.Parameters.AddWithValue("Emailaddr", ""); importCommand.Parameters.AddWithValue("Bankname", ""); importCommand.Parameters.AddWithValue("Bankacno", ""); importCommand.Parameters.AddWithValue("Bankacna", ""); importCommand.Parameters.AddWithValue("Salute", ""); importCommand.Parameters.AddWithValue("Notes", ""); importCommand.Parameters.AddWithValue("Banksort", ""); 

Öffnen Sie die databaseverbindungen:

 exportConnection.Open(); importConnection.Open(); 

Füllen Sie die oben genannten characterfolgen mit Werten aus SQL:

 var exportReader = exportCommand.ExecuteReader(); while (exportReader.Read()) { string part1 = exportReader.GetSqlValue(2).ToString(); string part2 = exportReader.GetSqlValue(3).ToString(); string space = " "; string code = exportReader.GetSqlValue(0).ToString(); string clcode = exportReader.GetSqlValue(2).ToString(); string title = exportReader.GetSqlValue(1).ToString(); string sort1 = exportReader.GetSqlValue(20).ToString(); string sort2 = exportReader.GetSqlValue(21).ToString(); string sort3 = exportReader.GetSqlValue(22).ToString(); // ID importCommand.Parameters["clcode"].Value = string.Concat(clcode,code); // importCommand.Parameters["clcodedesc"].Value = string.Concat(title,space,part1,space,part2); //OwTitle importCommand.Parameters["Title"].Value = exportReader.GetSqlValue(1).ToString(); //OwForenames importCommand.Parameters["Fname"].Value = exportReader.GetSqlValue(2).ToString(); //OwSurname importCommand.Parameters["Sname"].Value = exportReader.GetSqlValue(3).ToString(); //OwNum importCommand.Parameters["Address1"].Value = exportReader.GetSqlValue(4).ToString(); //[OwAddress1] //[OwAddress2] //[OwAddress3] //[OwAddress4] importCommand.Parameters["Address3"].Value = exportReader.GetSqlValue(5).ToString(); importCommand.Parameters["Address5"].Value = exportReader.GetSqlValue(6).ToString(); importCommand.Parameters["Address4"].Value = exportReader.GetSqlValue(7).ToString(); importCommand.Parameters["Address6"].Value = exportReader.GetSqlValue(8).ToString(); //OwPostcode importCommand.Parameters["Postcode"].Value = exportReader.GetSqlValue(9).ToString(); //OwPhHome importCommand.Parameters["Phoneh"].Value = exportReader.GetSqlValue(10).ToString(); //OwPhWork importCommand.Parameters["PhoneW"].Value = exportReader.GetSqlValue(11).ToString(); //OwPhFax importCommand.Parameters["Facsimileh"].Value = exportReader.GetSqlValue(12).ToString(); //OwPhMobile importCommand.Parameters["Mobile"].Value = exportReader.GetSqlValue(13).ToString(); //OwEMail importCommand.Parameters["Emailaddr"].Value = exportReader.GetSqlValue(14).ToString(); //OwBankName importCommand.Parameters["Bankname"].Value = exportReader.GetSqlValue(15).ToString(); //OwAccNo importCommand.Parameters["Bankacno"].Value = exportReader.GetSqlValue(16).ToString(); //OwAccName importCommand.Parameters["Bankacna"].Value = exportReader.GetSqlValue(17).ToString(); //OwSalutation importCommand.Parameters["Salute"].Value = exportReader.GetSqlValue(18).ToString(); //OwNotes importCommand.Parameters["Notes"].Value = exportReader.GetSqlValue(19).ToString(); //OwSort1 //OwSort2 //OwSort3 importCommand.Parameters["Banksort"].Value = string.Concat(sort1, sort2, sort3); 

Die kommentierten Zeilen sind die zugehörigen datasätze in der SQL-database.

Schließlich führe ich die Abfrage aus und schließt die Verbindungen:

  try { importCommand.ExecuteNonQuery(); } catch (Exception e) { Console.Write("Error Writing to database"); Console.Write(e); Console.ReadKey(); } } // done Console.WriteLine("Complete!"); Console.ReadKey(); exportConnection.Close(); importConnection.Close(); 

Meine Theorie ist, dass dieser String-Wert:

  importCommand.Parameters["Banksort"].Value = string.Concat(sort1, sort2, sort3); 

verursacht Probleme, da die ersten Aufzeichnungen in der Tabelle "NULL" sind,

Sie sollten sicherlich AddWithValue verwenden. Fehler hat nichts damit zu tun. Du solltest der Nachricht folgen, um den Grund des Fehlers herauszufinden 🙂 Es heißt: "Zusätzliche Parameter angeben". Es bedeutet, dass Sie weniger Parameter haben als das, was Sie wirklich liefern sollten. IOW der Fehler ist in der Zählung von? platzhalter Sie werden positionsmäßig behandelt und müssen mit der Anzahl der erwarteten Wertzählung übereinstimmen. dh:

 insert into myTable (field1, field2) values (?,?) 

ist richtig, während:

 insert into myTable (field1, field2) values (?) 

würde den Fehler geben, den du siehst. Sie sagen, Sie haben 2 Spalten, aber geben Sie nur 1 Parameter Platzhalter. Fügen Sie genug hinzu? (wie kann ich 22 Werte sehen und 21? existiert dort). Und natürlich nicht vergessen, die Parameter (mit AddWithValue) in der gleichen Reihenfolge der erwarteten Parameter hinzuzufügen (zuerst AddWithValue () bindet an das erste? Und damit field1, zweites bindet an zweites und thuse field2 und so weiter).

PS: Du könntest das SQL so schreiben, also würdest du das nicht zählen? falsch:

 string fields = @"CLCODE ,clcodedesc ,Title ,Fname ,Sname ,Address1 ,Address3 ,Address5 ,Address4 ,Address6 ,Postcode ,Phoneh ,PhoneW ,Facsimileh ,Mobile ,Emailaddr ,Bankname ,Bankacno ,Bankacna ,Salute ,Notes ,BANKSORT"; string sql = string.Format( "INSERT INTO CLIENT ({0}) values ({1})", fields, string.Join(",",fields.Split(',').Select(f => "?")));